๐โโ๏ธ ์กฐ์ธ(JOIN)์ด๋,
ํ ๊ฐ ์ด์์ ํ ์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก, ์ํ ๊ฒฐ๊ณผ๋ ํ๋์ Result Set์ผ๋ก ์ถ๋ ฅ
๐ Warning
JOIN์ ์ฌ์ฉํ ๋, '์ค๋ผํด ์ ์ฉ ๊ตฌ๋ฌธ'๊ณผ 'ANSI ํ์ค ๊ตฌ๋ฌธ'์ผ๋ก ๋๋๋ฉฐ, ๋์ ๊ธฐ๋ฅ์ ๋์ผํ๋ ๋ฌธ๋ฒ์ ์ฐจ์ด๊ฐ ์์
- ์ค๋ผํด ์ ์ฉ ๊ตฌ๋ฌธ
: FROM์ ์ ',๏ผ๋ก ๊ตฌ๋ถํ์ฌ ํฉ์น๊ฒ ๋ TABLE๋ช ์ ๊ธฐ์ ํ๊ณ , WHERE์ ์ ํฉ์น๊ธฐ์ ์ฌ์ฉํ ์ปฌ๋ผ๋ช ์ ๋ช ์SELECT EMP_ID , EMP_NAME , DEPT_CODE , DEPT_TITLE FROM EMPLOYEE , DEPARTMENT WHERE DEPT_CODE = DEPT_ID;
- ANSI ํ์ค ๊ตฌ๋ฌธ
: FROM์ ๋ค์์ JOIN์ ์ ๋ ฅ ํ ํฉ์น๊ฒ ๋ TABLE๋ช ์ ๊ธฐ์ ํ๊ณ , ์๊ดํธ ์์ ์ปฌ๋ผ๋ช ์ ๋ช ์
- ์ฐ๊ฒฐ์ ์ฌ์ฉํ๋ ค๋ ์ปฌ๋ผ๋ช ์ด ๊ฐ์ ๊ฒฝ์ฐ USING()์ ์ฌ์ฉ
- ์ฐ๊ฒฐ์ ์ฌ์ฉํ๋ ค๋ ์ปฌ๋ผ๋ช ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ ON()์ ์ฌ์ฉ)
SELECT EMP_ID , EMP_NAME , DEPT_CODE , DEPT_TITLE FROM EMPLOYEE JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
๐ ANSI ํ์ค ๊ตฌ๋ฌธ์ด ๋ค๋ฅธ SQL์ธ์ด์ ๋ฌธ๋ฒ์ด ์ผ์นํ๋ฏ๋ก ANSI ํ์ค ๊ตฌ๋ฌธ์ ์์งํ๊ณ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข์
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, DEPT_TITLE >>> ์๋ง DEPARTMENT ํ
์ด๋ธ์ ์๋ ์ปฌ๋ผ
FROM EMPLOYEE
, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;
: ํ ์ด๋ธ๋ช ์ ์ง์ ํ์ง ์์ผ๋ฉด ์ด์ ์ ์๊ฐ ์ ๋งคํ๋ค๋ ์ค๋ฅ ๋ฐ์
SELECT
EMP_ID
, EMP_NAME
, EMPLOYEE.JOB_CODE >>> JOB_CODE : ๋ ํ
์ด๋ธ์ ๋ชจ๋ ์๋ ์ปฌ๋ผ
, JOB_NAME
FROM EMPLOYEE
, JOB
WHERE EMPLOYEE.JOB_CODE = JOB.JOB_CODE; >>> ํ
์ด๋ธ๋ช
์ ์ง์ (๋ช
์)ํด์ผํจ
SELECT
E.EMP_ID
, E,EMP_NAME
, E.JOB_CODE
, J.JOB_NAME
FROM EMPLOYEE E >>> EMPLOYEE ํ
์ด๋ธ์ ๋ณ์นญ E
, JOB J >>> JOB ํ
์ด๋ธ์ ๋ณ์นญ J
WHERE E.JOB_CODE = J.JOB_CODE;
SELECT
EMP_ID
, EMP_NAME
, JOB_CODE
, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE);
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
SELECT
E.EMP_ID
, E.EMP_NAME
, E.JOB_CODE
, J.JOB_NAME
FROM EMPLOYEE E
JOIN JOB J ON(E.JOB_CODE = J.JOB_CODE); >>> ์ด๋ค ํ
์ด๋ธ์ ์ปฌ๋ผ์ธ์ง ๋ช
์
๐โโ๏ธ INNER JOIN & OUTER JOIN์ด๋,
๋ ๊ฐ ์ด์์ ํ ์ด๋ธ์ ์กฐ์ธํ ๋, ์ผ์นํ๋ ๊ฐ์ด ์๋ ํ์ JOIN์์ ์ ์ธํ๋ ๊ฒ์ INNER JOIN์ด๋ผ๊ณ ํ๋ฉฐ, ๋ช ์์ ์ผ๋ก ์ฌ์ฉํ์ง ์์ ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก INNER JOIN
ํ์ง๋ง ์ผ์นํ์ง ์์ ๊ฐ ๋ํ JOIN์ ํฌํจ์ํฌ ์๋ ์๋๋ฐ, ์ด๊ฒ์ OUTER JOIN์ด๋ผ๊ณ ํ๋ฉฐ, ๋ฐ๋์ OUTER JOIN์์ ๋ช ์ํด์ผํจ
๐โ ์ ๊น ! OUTER JOIN์ ์ด๋ป๊ฒ ๋ช ์ํ๋์?
- LEFT OUTER JOIN : ํฉ์น๊ธฐ์ ์ฌ์ฉํ ๋ ํ ์ด๋ธ ์ค ์ผํธ์ ๊ธฐ์ ๋ ํ ์ด๋ธ์ ๊ธฐ์ค์ผ๋ก JOIN
- RIGHT OUTER JOIN : ํฉ์น๊ธฐ์ ์ฌ์ฉํ ๋ ํ ์ด๋ธ ์ค ์ค๋ฅธํธ์ ๊ธฐ์ ๋ ํ ์ด๋ธ์ ๊ธฐ์ค์ผ๋ก JOIN
- FULL OUTER JOIN : ํฉ์น๊ธฐ์ ์ฌ์ฉํ ๋ ํ ์ด๋ธ์ด ๊ฐ์ง ๋ชจ๋ ํ์ ๊ฒฐ๊ณผ์ ํฌํจํ์ฌ JOIN
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
--LEFT OUTER JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID); >>> EMPLOYEE ๊ธฐ์ค์ผ๋ก JOIN
LEFT JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID); >>> ์์ ๋์ผํ ์ถ๋ ฅ (OUTER ์๋ต ๊ฐ๋ฅ)
>>> DEPT_TITLE์ด NULL๊ฐ(์ผ์นํ์ง ์๋ ํ)์ธ ํ๋์ด, ์ด์ค๋ฆฌ๋ ์ถ๋ ฅ
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID(+);
>>> DEPARTMENT ํ
์ด๋ธ ์ชฝ์ (+)๋ฅผ ๋ถ์ฌ์ผ EMPLOYEE ๊ธฐ์ค์ผ๋ก JOINํ๊ฒ ๋ค๋ ์๋ฏธ๊ฐ ๋จ
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
--RIGHT OUTER JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID); >>> DEPARTMENT ๊ธฐ์ค์ผ๋ก JOIN
RIGHT JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID); >>> ์์ ๋์ผํ ์ถ๋ ฅ (OUTER ์๋ต ๊ฐ๋ฅ)
>>> EMP_NAME์ด NULL๊ฐ(์ผ์นํ์ง ์๋ ํ)์ธ ๋ง์ผํ
๋ถ, ๊ตญ๋ด์์
๋ถ, ํด์ธ์์
3๋ถ๋ ์ถ๋ ฅ
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID;
>>> EMPLOYEE ํ
์ด๋ธ ์ชฝ์ (+)๋ฅผ ๋ถ์ฌ์ผ DEPARTMENT ๊ธฐ์ค์ผ๋ก JOINํ๊ฒ ๋ค๋ ์๋ฏธ๊ฐ ๋จ
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
--FULL OUTER JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
FULL JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID); >>> ์์ ๋์ผํ ์ถ๋ ฅ (OUTER ์๋ต ๊ฐ๋ฅ)
>>> ํ๋์ด, ์ด์ค๋ฆฌ, ๋ง์ผํ
๋ถ, ๊ตญ๋ด์์
๋ถ, ํด์ธ์์
3๋ถ ๋ชจ๋ ์ถ๋ ฅ๋จ (์ผ์นํ๋ ๊ฐ์ด ์๋ ํ๋ ๋ชจ๋ ์ถ๋ ฅ)
ORACLE ์ ์ฉ ๊ตฌ๋ฌธ์์๋ FULL OUTER JOIN ๋ถ๊ฐ
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID(+); -- 'outer-join๋ ํ
์ด๋ธ์ 1๊ฐ๋ง ์ง์ ํ ์ ์์ต๋๋ค' ์ค๋ฅ
๐โโ๏ธ CROSS JOIN์ด๋,
์นดํ ์ด์ ๊ณฑ(Cartensian projuct)์ด๋ผ๊ณ ๋ ํ๋ฉฐ, ์กฐ์ธ๋๋ ํ ์ด๋ธ์ ๊ฐ ํ๋ค์ด ๋ชจ๋ ๋งคํ๋ ๋ฐ์ดํฐ๊ฐ ๊ฒ์๋๋ ์กฐ์ธ ๋ฐฉ๋ฒ์ผ๋ก, ๊ฒ์๋๋ ๋ฐ์ดํฐ ์๋(ํ์ ์ปฌ๋ผ์) x (ํ์ ์ปฌ๋ผ์)
- ๋ชจ๋ ํ์ด ์ถ๋ ฅ๋จ
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
CROSS JOIN DEPARTMENT;
๐โโ๏ธ NON EQUAL JOIN์ด๋,
์ง์ ํ ์ปฌ๋ผ ๊ฐ์ด ์ผ์นํ๋ ๊ฒฝ์ฐ๊ฐ ์๋, ๊ฐ์ ๋ฒ์์ ํฌํจ๋๋ ํ๋ค์ ์ฐ๊ฒฐํ๋ ๋ฐฉ์
SELECT
EMP_NAME
, SALARY
, E.SAL_LEVEL "EMPLOYEE์ SAL_LEVEL"
, S.SAL_LEVEL "SAL_GRADE์ SAL_LEVEL"
FROM EMPLOYEE E
JOIN SAL_GRADE S ON(SALARY BETWEEN MIN_SAL AND MAX_SAL);
>>> SALARY ๊ฐ์ด ์ด๋ค MIN_SAL๊ณผ MAX_SAL์ฌ์ด์ ์์๋ ๋ ํ
์ด๋ธ์ ์ฐ๊ฒฐ์ง์ ์ ์ถ๋ ฅ
>>> (S1, S2, S3, S4, S5, S6 ์ค ์ผ์น๋๋ ๊ฒ)
SELECT
EMP_NAME
, SALARY
, E.SAL_LEVEL "EMPLOYEE์ SAL_LEVEL"
, S.SAL_LEVEL "SAL_GRADE์ SAL_LEVEL"
FROM EMPLOYEE E
, SAL_GRADE S
WHERE SALARY BETWEEN MIN_SAL AND MAX_SAL;
>>> ์์ ๋์ผํ ์ถ๋ ฅ
๐โโ๏ธ SELF JOIN์ด๋,
๊ฐ์ ํ ์ด๋ธ์ ์กฐ์ธํ๋ ๊ฒฝ์ฐ, ์๊ธฐ ์์ ๊ณผ ์กฐ์ธ์ ๋งบ๋ ๊ฒ
SELECT
E1.EMP_ID
, E1.EMP_NAME ์ฌ์๋ช
, E1.MANAGER_ID
, E2.EMP_NAME ๊ด๋ฆฌ์๋ช
FROM EMPLOYEE E1
JOIN EMPLOYEE E2 ON(E1.MANAGER_ID = E2.EMP_ID);
>>> EMPLOYEE ํ
์ด๋ธ์ EMPLOYEE ํ
์ด๋ธ์ ํ๋ฒ ๋ JOIN (๋์ ๋ช
์ ํ์)
SELECT
E1.EMP_ID
, E1.EMP_NAME ์ฌ์๋ช
, E1.MANAGER_ID
, E2.EMP_NAME ๊ด๋ฆฌ์๋ช
FROM EMPLOYEE E1
, EMPLOYEE E2
WHERE E1.MANAGER_ID = E2.EMP_ID; >>> ๋งค๋์ ID๊ฐ ์๋ ์ฌ๋์ ํํด์(INNER JOIN์ NULL๊ฐ ์ ์ธ) ์ถ๋ ฅ
๐โโ๏ธ ๋ค์ค JOIN์ด๋,
N๊ฐ์ ํ ์ด๋ธ์ ์กฐํํ ๋ ์ฌ์ฉ (๋ค์ค JOIN์ ๊ฒฝ์ฐ, ์กฐ์ธ์ ์์๊ฐ ์ค์)
SELECT
EMP_NAME ์ด๋ฆ -- FROM EMPLOYEE
, DEPT_TITLE ๋ถ์๋ช
-- FROM DEPARTMENT
, LOCAL_NAME ์ง์ญ๋ช
-- FROM LOCATION
>>> ๊ฐ๊ฐ ๋ค๋ฅธ ํ
์ด๋ธ์ ์ปฌ๋ผ๋ค
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID)
JOIN LOCATION ON(LOCATION_ID = LOCAL_CODE); >>> ์ด ๊ตฌ๋ฌธ์ ์๋ก ์ฌ๋ ค ์์๋ฅผ ๋ฐ๊พธ๋ฉด JOIN ๋ถ๊ฐ
>>> JOIN ๊ตฌ๋ฌธ ๋์ด ์์์ ์ ์
SELECT
EMP_NAME ์ด๋ฆ -- FROM EMPLOYEE
, DEPT_TITLE ๋ถ์๋ช
-- FROM DEPARTMENT
, LOCAL_NAME ์ง์ญ๋ช
-- FROM LOCATION
FROM EMPLOYEE
, DEPARTMENT
, LOCATION
WHERE DEPT_CODE = DEPT_ID
AND LOCATION_ID = LOCAL_CODE; >>> ORACLE ์ ์ฉ ๊ตฌ๋ฌธ์ ํ
์ด๋ธ๋ช
์์ ์์์ ๊ด๊ณ X
>>> WHERE ์กฐ๊ฑด๋ฌธ์ ์์๊ฐ ๋ฐ๋์ด๋ ๋ฌธ์ X
SELECT
EMP_NAME ์ด๋ฆ
, JOB_NAME ์ง๊ธ๋ช
, DEPT_TITLE ๋ถ์๋ช
, LOCAL_NAME ๊ทผ๋ฌด์ง์ญ๋ช
FROM EMPLOYEE E
JOIN JOB J ON (E.JOB_CODE = J.JOB_CODE)
>>> ๋์ JOIN JOB USING(JOB_CODE)๋ก๋ ํ ์ ์์ (๊ฐ์ ์ปฌ๋ผ๋ช
์ผ ๊ฒฝ์ฐ, USING ์ฌ์ฉ ๊ฐ๋ฅ)
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
JOIN LOCATION ON(LOCATION_ID = LOCAL_CODE)
WHERE JOB_NAME = '๋๋ฆฌ'
AND LOCAL_NAME LIKE 'ASIA%';
SELECT
E.EMP_NAME ์ด๋ฆ
, J.JOB_NAME ์ง๊ธ๋ช
, D.DEPT_TITLE ๋ถ์๋ช
, L.LOCAL_NAME ๊ทผ๋ฌด์ง์ญ๋ช
FROM EMPLOYEE E
, JOB J
, DEPARTMENT D
, LOCATION L
WHERE E.JOB_NAME = J.JOB_NAME
AND E.DEPT_CODE = D.DEPT_ID
AND D.LOCATION_ID = L.LOCAL_CODE
AND JOB_NAME = '๋๋ฆฌ'
AND LOCAL_NAME LIKE 'ASIA%';