JOIN
- ๋ ๊ฐ ์ด์์ ํ ์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ์ฐ๊ฒฐํ๋๋ฐ ์ฌ์ฉ๋๋ SQL ๊ธฐ๋ฅ
- ํ ์ด๋ธ์ ์๋ณ ๊ฐ์ธ Primary Key์ ํ ์ด๋ธ ๊ฐ ๊ณตํต ๊ฐ์ธ Foreign Key ๊ฐ์ ์ฌ์ฉํ์ฌ ์กฐ์ธ
INNTER JOIN
: ๋ ํ
์ด๋ธ์์ ์ผ์นํ๋ ๋ฐ์ดํฐ๋ง ์ ํ
LEFT JOIN
: ์ผ์ชฝ ํ
์ด๋ธ์ ๋ชจ๋ ๋ฐ์ดํฐ์ ์ค๋ฅธ์ชฝ ๋ฐ์ดํฐ์์ ์ผ์นํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ํ
RIGHT JOIN
: ์ค๋ฅธ์ชฝ ํ
์ด๋ธ์ ๋ชจ๋ ๋ฐ์ดํฐ์ ์ผ์ชฝ ๋ฐ์ดํฐ์์ ์ผ์นํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ํ
โ 1๋N, N๋1, 1๋1 ๋ฑ ์ด๋ ํ ์ด๋ธ์ ๊ธฐ์ค์ผ๋ก ๋ณด๋๋์ ๋ฐ๋ผ ๋ถ๋ฅด๋ ๋ง์ด ๋ค๋ฆ.
์) EMP ํ ์ด๋ธ์ DEPTNO ์ DEPT ํ ์ด๋ธ์ DEPTNO๋ EMP ํ ์ด๋ธ์ ๊ธฐ์ค์ผ๋ก ํ ๋์๋ 1๋N
โ Primary Key๋ ํ ์ด๋ธ์์ ๊ฐ์ฅ ์ค์ํ ๊ฐ. ์ฆ, ๊ณ ์ ํ ๊ฐ์ด ์๋ ์ปฌ๋ผ (์. EMP ํ ์ด๋ธ - EMPNO)
=> NOT NULL, UNIQUE
โ Foreign Key๋ ๋ค๋ฅธ ํ ์ด๋ธ๊ณผ ์ฐ๊ฒฐ๋ ๋ ์ฐธ์กฐํ ์ ์๋ ๊ฐ (์. EMP ํ ์ด๋ธ - DEPTNO / DEPTํ ์ด๋ธ - DEPTNO)
=> Primary Key๋ ๋์์ ๋ค๋ฅธ ํ ์ด๋ธ์ Foreign Key๊ฐ ๋ ์ ์์.
โ ์ถํ ์๋ฐ์ ์ฐ๊ฒฐํ ๋.. DEPT ํ ์ด๋ธ์ ํด๋์ค๋ผ๊ณ ์๊ฐํ๋ฉด DEPTNO๋ ์ธ์คํด์ค ํ๋(ArrayList ํ์ )..
DEPTNO๋ฅผ ํตํด EMP ๊ฐ์ฒด๋ฅผ ๋ถ๋ฌ์ค๋ ํํ๋ก ์ค๊ณํ๊ฒ ๋จ. (JAVA ์ ์ถ๋ ฅ ์คํธ๋ฆผ ์์ ์ฐธ์กฐ!!)
์ ์์ฌํญ
โฌ๏ธ EMP ํ ์ด๋ธ๊ณผ DEPT ํ ์ด๋ธ์ ์กฐ์ธํ๊ณ , ๋ชจ๋ ์ด์ ์ ํํ ํ ๋ฐํํ๋ ์ฟผ๋ฆฌ..
SELECT *
FROM EMP, DEPT;
๐ธ EMP์ DEPT ํ ์ด๋ธ์ด ์ด๋ป๊ฒ ์กฐ์ธ๋๋์ง์ ๋ํ ์กฐ๊ฑด์ด ์ง์ ๋์ง ์์๊ธฐ ๋๋ฌธ์, CROSS JOIN(์นดํ ์์ ๊ณฑ)์ผ๋ก ๊ฐ์ฃผ๋์ด EMP ํ ์ด๋ธ์ ๋ชจ๋ ๋ ์ฝ๋์ DEPT ํ ์ด๋ธ์ ๋ชจ๋ ๋ ์ฝ๋๊ฐ ๊ฒฐํฉ๋จ.
๐ถ ???? ๊ฐ๊ตด.
๐ธ DEPT์ DEPTNO ์ปฌ๋ผ์ 4๊ฐ. EMP ์ปฌ๋ผ์ ์ด 12๊ฐ(=12๋ช ).
DEPT์ DEPTNO๊ฐ EMP ํ ์ด๋ธ์ ๋ชจ๋ ๋ฐ์ดํฐ์ ๊ฒฐํฉ๋์ด 12 * 4 (์นดํ ์์ ๊ณฑ) ๊ฐ์ ํ์ด ์ถ๋ ฅ๋จ.
๐ ํ์๋ ์ด ๋ถ๋ถ์ด ์ดํด๊ฐ ์ ์๊ฐ์ Java์ ์ด์ค for๋ฌธ๊ณผ ๋น์ทํ๋ค๊ณ ์ดํดํ์.
๋ฐ๋ผ์, ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๋ ค๋ฉด ์ด ์ด๋ฆ์ ๋น๊ตํ๋ ์กฐ๊ฑด์์ผ๋ก ์กฐ์ธํด์ผ ํ๋ค.
โ ๏ธ ์ค๋ผํด ๋ฌธ๋ฒ
SELECT *
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
ORDER BY EMPNO;
โ ๏ธ ANSI ๋ฌธ๋ฒ (๋ฏธ๊ตญ ํ์ค ๋ฌธ๋ฒ)
SELECT *
FROM EMP E JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
ORDER BY EMPNO;
๐ธ EMP ํ ์ด๋ธ์ ๋ถ์ ๋ฒํธ์ DEPT ํ ์ด๋ธ์ ๋ถ์ ๋ฒํธ๊ฐ ์ผ์นํ๋ ๋ ์ฝ๋๋ง ์ ํ๋๋ค.
์ดํ ๋ชจ๋ ์ด์ ์ ํํ๊ณ , EMPNO ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ์ฌ ๊ฒฐ๊ณผ ๋ฐํ!
์ด ๋, โญํ ์ด๋ธ์ ๋ณ์นญ์ ์ค์ ํด์ผํด. ์์ฃผ ์ค์ํ๋ค.
ํ ์ด๋ธ ๋ณ์นญ ์ค์
- ์์ชฝ ํ
์ด๋ธ ๋ชจ๋์ ์กด์ฌํ๋ ์ด์ ๋ํด์๋ ํ
์ด๋ธ ์ด๋ฆ์ ๋ช
์ํด์ผ ํจ.
(Java์ this ๊ฐ์??) - ๊ทผ๋ฐ ํ ์ด๋ธ ์ด๋ฆ์ด ๊ธธ๋ฉด(์.DEPARTMENTNUM) ํ์ดํ์ด ๊ธธ์ด์ ธ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ ์ค์๋ง(๋ณ์นญ) ์ง์
SELECT EMPNO, ENAME, E.DEPTNO, DNAME, JOB
FROM EMP E, DEPT D -- ์ค๋ผํด ์กฐ์ธ ๋ฐฉ์
WHERE E.DEPTNO = D.DEPTNO AND E.JOB = 'MANAGER';
๋ฑ๊ฐ ์กฐ์ธ (INNER JOIN)
- ํ ์ด๋ธ์ ์ฐ๊ฒฐํ ํ์ ์ถ๋ ฅ ํ์ ๊ฐ ํ ์ด๋ธ์ ํน์ ์ด๊ณผ ์ผ์นํ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ์ ํ๋ ๋ฐฉ์
- ANSI ์กฐ์ธ ๋ฐฉ์์ผ๋ก ์ฐ๊ฒฐ
โ ๏ธ ์ค๋ผํด 9๊น์ง๋ ์ค๋ผํด ์กฐ์ธ๋ง ์ฌ์ฉํ ์ ์์์ผ๋, ์ค๋ผํด 10๋ถํฐ๋ ANSI ์กฐ์ธ๋ ์ฌ์ฉ ๊ฐ๋ฅํด์ง.
SELECT EMPNO, ENAME, E.DEPTNO, DNAME, JOB
FROM EMP E JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
WHERE E.JOB = 'MANAGER';
๐ธ๊ธฐ๋ณธ ์์
๐ธ EMP์ DEPT ํ ์ด๋ธ์ ์กฐ์ธํ๊ณ , ๊ธ์ฌ๊ฐ 3000 ์ด์์ธ ์ฌ์ ์ ๋ณด ์ถ๋ ฅ
(์ฌ์๋ฒํธ, ์ด๋ฆ, ๊ธ์ฌ, ์ ์ฌ์ผ, ๋ถ์๋ฒํธ, ๋ถ์์ด๋ฆ)
(1) ์ค๋ผํด ๋ฌธ๋ฒ
SELECT EMPNO, ENAME, SAL, HIREDATE, E.DEPTNO, DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND SAL >= 3000;
(2) ANSI ๋ฌธ๋ฒ
SELECT EMPNO, ENAME, SAL, HIREDATE, E.DEPTNO, DNAME
FROM EMP E JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
WHERE E.SAL >= 3000;
๐ธ EMP ํ ์ด๋ธ ๋ณ์นญ์ E๋ก, DEPT ํ ์ด๋ธ ๋ณ์นญ์ D๋ก ํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ๋ฑ๊ฐ ์กฐ์ธ์ ํ์ ๋,
๊ธ์ฌ๊ฐ 2500 ์ด์ 3500 ์ดํ์ธ ์ฌ์์ ์ ๋ณด๊ฐ ์ถ๋ ฅ๋๋๋ก ์์ฑ
(1) ์ค๋ผํด ๋ฌธ๋ฒ
SELECT EMPNO, ENAME, SAL, E.DEPTNO
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
AND SAL BETWEEN 2500 AND 3500;
(2) ANSI ๋ฌธ๋ฒ
SELECT EMPNO, ENAME, SAL, E.DEPTNO
FROM EMP E JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
WHERE SAL BETWEEN 2500 AND 3500;
๋น๋ฑ๊ฐ ์กฐ์ธ
- ๋์ผ ์ด์ด ์๋ ๋ค๋ฅธ ์กฐ๊ฑด์ ์ฌ์ฉํ์ฌ ์กฐ์ธํ ๋ ์ฌ์ฉํ๋..์์ฃผ ์ฌ์ฉ๋์ง ์์.
๐ธ ์๋ฅผ ๋ค์ด..์ฌ์๋ค์ ๊ธ์ฌ ๋ฑ๊ธ์ ํ์ํ๊ธฐ ์ํด์๋ SAL๊ณผ SALGRADE๊ฐ ์ผ์นํ ์ ์์ผ๋ฏ๋ก (์๋ ํ ์ด๋ธ ์ฐธ์กฐ)
SAL์ LOSAL / HISAL ์ฌ์ด์ ์์ด์ผ ํ๋ค.
์ด๋ฐ ๊ฒฝ์ฐ์๋ BETWEEN A AND B ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๊ฒ ์ฒ๋ฆฌ ๊ฐ๋ฅ.
SELECT * FROM EMP;
SELECT * FROM SALGRADE;
SELECT ENAME, SAL, GRADE
FROM EMP E JOIN SALGRADE S
ON SAL BETWEEN LOSAL AND HISAL;
์์ฒด ์กฐ์ธ
- ๊ฐ์ ํ ์ด๋ธ์ ๋ ๋ฒ ์ฌ์ฉํ๋ ๊ฒ
๐ธ EMP ํ ์ด๋ธ์์ MGR์ด ์๋ ์ฌ๋ ์ค ๊ฐ ์ฌ์์ MGR ์ด๋ฆ์ ์กฐํ ํ ์ถ
SELECT E1.EMPNO, E1.ENAME, E1.MGR,
E2.EMPNO AS MGR_EMPNO,
E2.ENAME AS MGR_ENAME
FROM EMP E1 JOIN EMP E2
ON E1.MGR = E2.EMPNO;
์ธ๋ถ ์กฐ์ธ (OUTER JOIN)
- ๋ด๋ถ ์กฐ์ธ(INNER JOIN, ๋ฑ๊ฐ ์กฐ์ธ)์ ๊ฒฝ์ฐ, ํ์ชฝ์ ์ปฌ๋ผ์ ๊ฐ์ด ์๋ค๋ฉด ์กฐํ๋์ง ์๋๋ค.
- ๊ทธ๋ฌ๋ ์ธ๋ถ ์กฐ์ธ์ ๊ณตํต๋์ง ์์ ์ปฌ๋ผ๋ ํ์ ํฉ๋๋ค.
โ ๏ธ ์ค๋ผํด ๋ฌธ๋ฒ : (+) ๊ธฐํธ๋ฅผ ๋ถ์ด๋ฉด ๋ฐ์ดํฐ ๊ฐ์ด ๋ถ์กฑํ ํ ์ด๋ธ์ NULL ๊ฐ์ ๊ฐ๋ ํ์ด ์์ฑ๋์ด ๋ฐ์ดํฐ ๊ฐ์ด ์ถฉ๋ถํ ํ ์ด๋ธ์ ํ๋ค์ด NULLํ์ ์กฐ์ธ
SELECT ENAME, E.DEPTNO, DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO
ORDER BY E.DEPTNO;
โ ๏ธ ANSI ๋ฌธ๋ฒ (LEFT OUTER, RIGHT OUTER)
OPERATIONS์ ๊ฐ์ด ์๋๋ฐ๋ ์กฐํ๋จ ํ์ธ.(RIGHT OUTER. !!์ค๋ฅธ์ชฝ ํ ์ด๋ธ ๊ธฐ์ค์ผ๋ก ์กฐํ!!)
SELECT ENAME, E.DEPTNO, DNAME
FROM EMP E RIGHT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
ORDER BY E.DEPTNO;
NATURAL JOIN
- ๋๋ฑ ์กฐ์ธ๊ณผ ๋น์ทํ์ง๋ง WHERE ์กฐ๊ฑด์ ์์ด ์กฐ์ธํ๋ ๋ฐฉ์
- ๋ ํ ์ด๋ธ์ ๋์ผํ ์ด๋ฆ(์ปฌ๋ผ ๋๋ ์ด)์ ๊ฐ๋ ์ปฌ๋ผ์ ๋ชจ๋ ์กฐ์ธ ๋จ
SELECT EMPNO, ENAME, DNAME
FROM EMP NATURAL JOIN DEPT;
์ผ๋ฐ์ ์ธ ๋๋ฑ์กฐ์ธ์ธ ๊ฒฝ์ฐ๋ DEPTNO๊ฐ ์ด๋ ์์์ธ์ง ๋ชจํธํ์ฌ ์ ์ฟผ๋ฆฌ๋ฌธ์ฒ๋ผ ์์ฑํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
JOING ~ USING
- ๊ธฐ์กด์ ๋ฑ๊ฐ ์กฐ์ธ์ ๋์ ํ๋ ์กฐ์ธ ๋ฐฉ์
- FROM table1 JOIN table2 USING(๊ธฐ์ค์ด)
SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DNAME, LOC
FROM EMP JOIN DEPT USING(DEPTNO)
WHERE SAL >= 3000
ORDER BY DEPTNO, EMPNO;
JOIN ~ ON
- ๊ฐ์ฅ ๋ฒ์ฉ์ฑ ์๋ JOIN ~ ON ํค์๋๋ฅผ ์ฌ์ฉํ ์กฐ์ธ ๋ฐฉ์
- FROM table1 JOIN table2 ON (์กฐ์ธ ์กฐ๊ฑด์)
SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, E.DEPTNO, DNAME, LOC
FROM EMP E JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
WHERE SAL <= 3000
ORDER BY E.DEPTNO, EMPNO;
์ฐ์ต ๋ฌธ์
๐ธ ๊ธ์ฌ(SAL)๊ฐ 2000 ์ด๊ณผ์ธ ์ฌ์๋ค์ ๋ถ์ ์ ๋ณด, ์ฌ์ ์ ๋ณด๋ฅผ ๋ถ์๋ฒํธ, ๋ถ์์ด๋ฆ, ์ฌ์์ด๋ฆ, ๊ธ์ฌ ํ์
- ์ค๋ผํด ๋ฌธ๋ฒ๊ณผ ANSI ๋ฌธ๋ฒ์ผ๋ก ํ์(NATURAL JOIN, JOIN ~ ON, JOIN ~ USING)
- ์ค๋ผํด ๋ฌธ๋ฒ
SELECT E.DEPTNO, DNAME, ENAME, SAL
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
AND SAL > 2000;
- NATURAL JOIN
SELECT DEPTNO, DNAME, ENAME, SAL
FROM EMP NATURAL JOIN DEPT
WHERE SAL > 2000;
- JOIN ~ ON
SELECT E.DEPTNO, DNAME, ENAME, SAL
FROM EMP E JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
WHERE SAL > 2000;
- JOIN ~ USING
SELECT DEPTNO, DNAME, ENAME, SAL
FROM EMP JOIN DEPT USING(DEPTNO)
WHERE SAL > 2000;
๐ธ ๊ฐ ๋ถ์๋ณ ๋ถ์๋ฒํธ, ํ๊ท ๊ธ์ฌ, ์ต๋ ๊ธ์ฌ, ์ต์ ๊ธ์ฌ, ์ฌ์ ์ ์ถ๋ ฅ
- ์ค๋ผํด ๋ฌธ๋ฒ๊ณผ ANSI ๋ฌธ๋ฒ์ผ๋ก ํ์(NATURAL JOIN, JOIN ~ ON, JOIN ~ USING)
- ์ค๋ผํด ๋ฌธ๋ฒ
SELECT E.DEPTNO, TRUNC(AVG(SAL)), MAX(SAL), MIN(SAL), COUNT(*)
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
GROUP BY E.DEPTNO;
- NATURAL JOIN
SELECT DEPTNO, TRUNC(AVG(SAL)), MAX(SAL), MIN(SAL), COUNT(*)
FROM EMP NATURAL JOIN DEPT
GROUP BY DEPTNO;
- JOIN ~ ON
SELECT E.DEPTNO, TRUNC(AVG(SAL)), MAX(SAL), MIN(SAL), COUNT(*)
FROM EMP E JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
GROUP BY E.DEPTNO;
- JOIN ~ USING
SELECT DEPTNO, TRUNC(AVG(SAL)), MAX(SAL), MIN(SAL), COUNT(*)
FROM EMP JOIN DEPT USING(DEPTNO)
GROUP BY DEPTNO;
๐ธ ๋ชจ๋ ๋ถ์ ์ ๋ณด์ ์ฌ์ ์ ๋ณด๋ฅผ ๋ถ์๋ฒํธ, ๋ถ์ ์ด๋ฆ, ์ฌ์๋ฒํธ, ์ฌ์์ด๋ฆ, ์ง์ฑ , ๊ธ์ฌ๋ฅผ ์ฌ์ ์ด๋ฆ์์ผ๋ก ์ถ๋ ฅ
- ์ค๋ผํด ๋ฌธ๋ฒ๊ณผ ANSI ๋ฌธ๋ฒ
- ์ค๋ผํด ๋ฌธ๋ฒ
SELECT E.DEPTNO, DNAME, EMPNO, ENAME, JOB, SAL
FROM EMP E, DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO
ORDER BY ENAME;
- ANSI ๋ฌธ๋ฒ
SELECT E.DEPTNO, DNAME, EMPNO, ENAME, JOB, SAL
FROM EMP E RIGHT JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
ORDER BY ENAME;
'๐๏ธ Backend > Oracle' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ค๋ผํด(Oracle) - (DQL) : ์๋ธ์ฟผ๋ฆฌ (0) | 2023.02.20 |
---|---|
์ค๋ผํด(Oracle) - ์ข ํฉ ์ค์ต ๋ฌธ์ (SCOTT ๊ณ์ ) (1) | 2023.02.17 |
์ค๋ผํด(Oracle) - (DQL) : ์งํฉ ์ฐ์ฐ์ (0) | 2023.02.17 |
์ค๋ผํด(Oracle) - (DQL) : ํจ์(๋ค์คํ ํจ์) (1) | 2023.02.16 |
์ค๋ผํด(Oracle) - ๊ธฐ๋ณธ HR ๊ณ์ ์ฐ์ต ๋ฌธ์ (1) | 2023.02.16 |