๐ SQL JOIN ์์ ์ ๋ฆฌ (INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN)
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ์ฌ๋ฌ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ํจ๊ป ์กฐํํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
์ด๋ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋ก JOIN์ ๋๋ค.
JOIN์ ๋ ๊ฐ ์ด์์ ํ ์ด๋ธ์ ์ฐ๊ฒฐํ์ฌ ํ๋์ ๊ฒฐ๊ณผ๋ก ์กฐํํ๋ SQL ๋ฌธ๋ฒ์ ๋๋ค.
์ด๋ฒ ๊ธ์์๋ SQL์์ ์์ฃผ ์ฌ์ฉํ๋ JOIN ์ข ๋ฅ์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค.
๐ JOIN์ด ํ์ํ ์ด์
์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ ํ ์ด๋ธ์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
EMP (์ฌ์ ํ ์ด๋ธ)
| EMPNO | ENAME | DEPTNO |
| 7369 | SMITH | 20 |
| 7499 | ALLEN | 30 |
| 7521 | WARD | 30 |
DEPT (๋ถ์ ํ ์ด๋ธ)
| DEPTNO | DNAME |
| 10 | ACCOUNTING |
| 20 | RESEARCH |
| 30 | SALES |
์ฌ์์ ์ด๋ฆ๊ณผ ๋ถ์ ์ด๋ฆ์ ํจ๊ป ์กฐํํ๋ ค๋ฉด
EMP ํ
์ด๋ธ๊ณผ DEPT ํ
์ด๋ธ์ ์ฐ๊ฒฐํด์ผ ํฉ๋๋ค.
์ด์ฒ๋ผ ์ฌ๋ฌ ํ ์ด๋ธ์ ์ฐ๊ฒฐํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋ ์ฌ์ฉํ๋ ๊ฒ์ด JOIN์ ๋๋ค.
๐ INNER JOIN
INNER JOIN์ ๋ ํ ์ด๋ธ์์ ์กฐ๊ฑด์ด ์ผ์นํ๋ ๋ฐ์ดํฐ๋ง ์กฐํํ๋ JOIN ๋ฐฉ์์ ๋๋ค.
SELECT E.ENAME, D.DNAME
FROM EMP E
INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
ํน์ง
- ๋ ํ ์ด๋ธ์์ ๊ณตํต๋ ๋ฐ์ดํฐ๋ง ์กฐํ
- ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ง์ด ์ฌ์ฉํ๋ JOIN ๋ฐฉ์
๐ LEFT JOIN
LEFT JOIN์ ์ผ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ๋ฐ์ดํฐ์ ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ์ผ์นํ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ JOIN ๋ฐฉ์์ ๋๋ค.
์ผ์นํ๋ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ NULL์ด ํ์๋ฉ๋๋ค.
SELECT E.ENAME, D.DNAME
FROM EMP E
LEFT JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
ํน์ง
- ์ผ์ชฝ ํ ์ด๋ธ ๊ธฐ์ค ์กฐํ
- ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด NULL
๐ RIGHT JOIN
RIGHT JOIN์ ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ๋ฐ์ดํฐ์ ์ผ์ชฝ ํ ์ด๋ธ์ ์ผ์นํ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ JOIN ๋ฐฉ์์ ๋๋ค.
SELECT E.ENAME, D.DNAME
FROM EMP E
RIGHT JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
ํน์ง
- ์ค๋ฅธ์ชฝ ํ ์ด๋ธ ๊ธฐ์ค ์กฐํ
- ์ผ์ชฝ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด NULL
๐ FULL OUTER JOIN
FULL OUTER JOIN์ ๋ ํ ์ด๋ธ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ JOIN ๋ฐฉ์์ ๋๋ค.
์กฐ๊ฑด์ด ์ผ์นํ์ง ์๋ ๋ฐ์ดํฐ๋ NULL๋ก ํ์๋ฉ๋๋ค.
SELECT E.ENAME, D.DNAME
FROM EMP E
FULL OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
ํน์ง
- LEFT JOIN + RIGHT JOIN ๊ฒฐ๊ณผ
- ์์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ๋ฐ์ดํฐ ์กฐํ
๐ CROSS JOIN
CROSS JOIN์ ๋ ํ ์ด๋ธ์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์กฐํฉํ๋ JOIN ๋ฐฉ์์ ๋๋ค.
์๋ฅผ ๋ค์ด
- EMP ํ ์ด๋ธ : 3๊ฐ ๋ฐ์ดํฐ
- DEPT ํ ์ด๋ธ : 3๊ฐ ๋ฐ์ดํฐ
์ด๋ผ๋ฉด ๊ฒฐ๊ณผ๋ 3 × 3 = 9๊ฐ๊ฐ ๋ฉ๋๋ค.
SELECT *
FROM EMP
CROSS JOIN DEPT;
๐ SELF JOIN
SELF JOIN์ ํ๋์ ํ ์ด๋ธ์ ์๊ธฐ ์์ ๊ณผ JOINํ๋ ๋ฐฉ์์ ๋๋ค.
์ฃผ๋ก ์ง์๊ณผ ๊ด๋ฆฌ์ ๊ด๊ณ๋ฅผ ์กฐํํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
SELECT A.ENAME AS ์ง์,
B.ENAME AS ๊ด๋ฆฌ์
FROM EMP A
JOIN EMP B
ON A.MGR = B.EMPNO;
๐ ANSI JOIN vs Oracle JOIN
JOIN์๋ ๋ ๊ฐ์ง ๋ฌธ๋ฒ ๋ฐฉ์์ด ์์ต๋๋ค.
ANSI JOIN (ํ์ค SQL)
SELECT *
FROM EMP E
JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
Oracle JOIN
SELECT *
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;
์ฐจ์ด์
- ANSI JOIN → SQL ํ์ค ๋ฐฉ์
- Oracle JOIN → Oracle์์ ์ฌ์ฉ๋๋ ๋ฐฉ์
ํ์ฌ๋ ANSI JOIN ์ฌ์ฉ์ด ๊ถ์ฅ๋ฉ๋๋ค.
๐ JOIN ์ ๋ฆฌ
| INNER JOIN | ๊ณตํต ๋ฐ์ดํฐ ์กฐํ |
| LEFT JOIN | ์ผ์ชฝ ํ ์ด๋ธ ๊ธฐ์ค |
| RIGHT JOIN | ์ค๋ฅธ์ชฝ ํ ์ด๋ธ ๊ธฐ์ค |
| FULL OUTER JOIN | ์์ชฝ ํ ์ด๋ธ ๋ชจ๋ ์กฐํ |
| CROSS JOIN | ๋ชจ๋ ์กฐํฉ ์์ฑ |
| SELF JOIN | ์๊ธฐ ์์ ๊ณผ JOIN |
๐ ๋ง๋ฌด๋ฆฌ
JOIN์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ SQL ๋ฌธ๋ฒ ์ค ํ๋์ ๋๋ค.
ํนํ ์ค๋ฌด์์๋ ๋ค์ JOIN์ด ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.
- INNER JOIN
- LEFT JOIN
JOIN์ ์ ํํ๊ฒ ์ดํดํ๋ฉด ์ฌ๋ฌ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์กฐํํ ์ ์์ต๋๋ค !