-
SQL - Join, ์๋ธ์ฟผ๋ฆฌDATABASE 2020. 7. 21. 14:17
๐ฏ SQL์ Join๊ณผ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์์๋ณธ๋ค.
JOIN
๊ฒ์ํ๊ณ ์ ํ๋ ์ปฌ๋ผ์ด ์ฌ๋ฌ๊ฐ์ ํ ์ด๋ธ์ ๋ถ์ฐ๋์ด์๋ ๊ฒฝ์ฐ ์ฌ๋ฌ ํ ์ด๋ธ์ ์ฐ๊ฒฐํด์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๋ฐฉ๋ฒ
EMPํ ์ด๋ธ๊ณผ DEPT ํ ์ด๋ธ์๋ DEPTNO ๋ผ๋ ๊ณตํต์ปฌ๋ผ์ด ์กด์ฌํ๋ค.
์ฌ๊ธฐ์ EMP ํ ์ด๋ธ์ DEPTNO๋ฅผ ์ธ๋ํค๋ผ๊ณ ํ๊ณ , DEPT ํ ์ด๋ธ์ DEPTNO๋ฅผ ๊ธฐ๋ณธํค๋ผ๊ณ ํ๋ค.
์ธ๋ํค(Foreign Key)๋ ๊ทธ ์์ฒด๋ก ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์๋ ๊ฑด ์๋๊ณ , ๋ค๋ฅธ ํ ์ด๋ธ์ ์ฐพ์๊ฐ์ ์ฐธ์กฐํ ๊ฐ์ ๋งํ๋ค.
์ฐธ์กฐ ๋นํ๋ dept ํ ์ด๋ธ์ ๋ถ๋ชจํ ์ด๋ธ/masterํ ์ด๋ธ ์ด๋ผํ๊ณ ์ฐธ์กฐํ๋ emp ํ ์ด๋ธ์ ์์ํ ์ด๋ธ/slave ํ ์ด๋ธ ์ด๋ผ๊ณ ํ๋ค.
๋ง์คํฐ ํ ์ด๋ธ์ ๊ธฐ๋ณธํค PK(D.DEPTNO)๊ฐ ์์ ํ ์ด๋ธ์ ์ฐธ์กฐํค,์ธ๋ํคFK(E.DEPTNO)๊ฐ ๋๋ค.
join ์ข ๋ฅ
- ์ค๋ผํด ์กฐ์ธ (์ค๋ผํด 8i)
- ANSI ์กฐ์ธ (์ค๋ผํด 9i ์ดํ)
์ค๋ผํด์กฐ์ธ
์ค๋ผํด์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ. ์ฌ๋ฌ ํ ์ด๋ธ์ ์ฐ๊ฒฐํ๋ ์กฐ์ธ ์กฐ๊ฑด์ where์ ์ ๋ช ์ํ๋ค.
์นดํ์์ ํ๋ก๋ํธCatasian Product
๋ชจ๋ ๊ฐ๋ฅํ ํ๋ค์ ์กฐ์ธ. ์กฐ๊ฑด์ ์๋ตํ ๊ฒฝ์ฐ ๋ฐ์
์ผ์นํ๋ ๋ฐ์ดํฐ๋ง ๋ฐํํ์ง ์๊ณ ์กฐ์ธํ๋ ๊ฐ ํ ์ด๋ธ์ ํ ๊ฐ์๋ฅผ ์๋ก ๊ณฑํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค. ๋ฐ๋ผ์ ์ ํจํ ๋ฐ์ดํฐ๋ก ์ฌ์ฉ๋์ง ๋ชปํ๋ค.
WHERE ์ ์ ์กฐ๊ฑด ๋ช ์ ์ํ๊ณ ๊ทธ๋ฅ SELECT ~ FROM ํํ๋ก๋ง ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํ๋ฉด ๊ฒฐ๊ณผ๋ก ๊ณฑ์งํฉ์ด ํ์ฑ๋๋ค.
Equi ์กฐ์ธ = ์ดํ์กฐ์ธ ์ด๋์กฐ์ธ
SELECT ๊ฒ์ํ ์ปฌ๋ผ๋ช ๋ช ์ FROM ์ฌ์ฉํ ๋๊ฐ์ ํ ์ด๋ธ ๋ช ๋ช ์ WHERE ๋๋ฑ์ฐ์ฐ์(=) ์ฌ์ฉํด์ '์กฐ์ธ์กฐ๊ฑด' ๋ช ์
์กฐ๊ฑด์์ = ์ฌ์ฉํ์ฌ ๊ณตํต์ ์ผ๋ก ์กด์ฌํ๋ ์ปฌ๋ผ์ ๊ฐ๋ค์ด ์ ํํ๊ฒ ์ผ์นํ๋ ํ์ ์ฐ๊ฒฐํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ค.
๋ค๋ฅธ๋ง๋ก ๋จ์์กฐ์ธ, ๋ด๋ถ์กฐ์ธ(์ด๋์ชผ์ธ)์ด๋ผ๊ณ ๋ ํ๋ค.
๊ณตํต์ปฌ๋ผ ์ฌ์ฉ ์ ๋ชจํธ์ฑ์ ํผํ๊ธฐ ์ํด์ ์ค๋ณต๋ ์ปฌ๋ผ์ ์กฐ์ธํ ํ ์ด๋ธ์์ ์ด๋ค ๊ฑธ ์ฌ์ฉํ ์ง ๊ณจ๋ผ์ค์ผ ๋๋ค.
์ด๊ฑธ ์ ํํด์ฃผ์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋๋ค. ๊ณตํต ์ปฌ๋ผ์ด ์ด๋ ํ ์ด๋ธ์ ์ํ๋์ง ๊ตฌ๋ถํ ์ ์๊ฒ ๋ช ์์ ์ผ๋ก ํ ์ด๋ธ๋ช ์ ์ ์ด์ฃผ๋ฉด ์ค๋ฅ๋ฅผ ํผํ ์ ์๋ค.
SELECT ENAME, DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;
์ ๋ ํธ ์ ์ ์ฌ์ฉ๋ ์ปฌ๋ผ์ ์์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ์กด์ฌํ๋ ์ปฌ๋ผ์ด ์๋๋ค. ๊ณตํต์ ์์. ์ด๋๋ ์ปฌ๋ผ๋ช ์์ ํ ์ด๋ธ๋ช ์ ์ง์ ํ์ง ์์๋ ๋๋ค.
FROM์ ์์๋ ํ ์ด๋ธ๋ช ์ ๋ณ์นญ์ ๋ถ์ผ ์ ์๋ค. ๋ณ์นญ์ ์ง์ ํ์ ๊ฒฝ์ฐ WHERE์ ๊ณผ SELECT์ ์ ํ ์ด๋ธ๋ช ์ด ์๋ ๋ณ์นญ์ ์ฌ์ฉํด์ผ ๋๋ค.
WHERE์ ๋ค์์ ์กฐ์ธ์กฐ๊ฑด์ ๋จผ์ ๋ช ์ํ๊ณ AND๋ OR ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด ๊ฒ์์กฐ๊ฑด์ ๋ช ์ํ๋ค.
Non-Equi์กฐ์ธ
๋ ํ ์ด๋ธ ๊ฐ์ ๊ณตํต์ปฌ๋ผ์ด ์๋ ๊ฒฝ์ฐ, where ์ ์ ๋๋ฑ์ฐ์ฐ์ ์ด์ธ์ ๋น๊ต์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ์กฐ์ธ ๋ฐฉ๋ฒ.
SELECT ENAME, SAL, GRADE FROM EMP E, SALGRADE S WHERE SAL BETWEEN LOSAL AND HISAL;
์๋ฅผ๋ค์ด ๋ฑ๊ธํ ์ด๋ธ์ ์ด์ฉํ ๋ฐฉ๋ฒ(๊ฒน์น๋ ์ปฌ๋ผ ์์, ๊ธ์ฌ๋ฅผ ๊ธฐ์ค์ ๋ฐ๋ผ 5๋ฑ๊ธ์ผ๋ก ๊ตฌ๋ถํ ํ ์ด๋ธ)์ด ์๋๋ฐ,
๊ฐ ์ฌ์์ ๊ธ์ฌ๊ฐ ๋ช ๋ฑ๊ธ์ธ์ง ํ์ ํ๋ ค๋ฉด ๊ทธ ๋ฐ์ดํฐ๊ฐ ์ผ์นํ๋์ง ๋น๊ต๋ฌธ์ผ๋ก ์์ฑํ ์ ์๋ค. ์ฌ๊ธฐ์๋ where ์ ์ ๋น๊ต๋ฌธ์ผ๋ก between a and b๋ฅผ ์ฌ์ฉํ๋ค. ์ด๊ฑธ ๋ถ๋ฑํธ ์ฐ์ฐ์๋ก ํ์ํ๋ฉด sal ≥ losal and sal ≤ hisal; ๋ก ๋ฐ๊ฟ์ธ ์ ์๋ค.
3๊ฐ์ ํ ์ด๋ธ์ ์กฐ์ธํ ๋ ์ดํ์กฐ์ธ๊ณผ ๋ ผ์ดํ์กฐ์ธ์ด ๊ฐ์ด ์ฐ์ผ ์ ์๋ค.
self์กฐ์ธ
์๊ธฐ์์ ์ ํ ์ด๋ธ์ ์ฐธ์กฐ. ํ ์ด๋ธ์ ๋ณ์นญ์ ์ฌ์ฉํ์ฌ ๊ฐ์์ ํ ์ด๋ธ์ ์์ฑํ๋ค.
SELECT E.ENAME, M.ENAME FROM EMP E, EMP M WHERE E.MGR = M.EMPNO;
์ฌ์์ ๊ด๋ฆฌ์ ๋ฒํธ๋ก ๊ด๋ฆฌ์๋ฅผ ์กฐํํ๊ณ ์ถ์ผ๋ฉด ๊ณ์ empํ ์ด๋ธ์ ๋ค์ ธ์ผํ๋ค. ์ ํ ์กฐ์ธ ํ์
๊ฐ์ ํ ์ด๋ธ์ด ํ๋ ๋ ์กด์ฌํ๋ ๊ฒ์ฒ๋ผ ์๊ฐํ ์ ์๋๋ก ๋ฐ๋์ ํ ์ด๋ธ ๋ณ์นญ์ ์ฌ์ฉํด์ผ ํ๋ค.
Outer ์กฐ์ธ
์กฐ์ธ์กฐ๊ฑด์ ๋ง์กฑํ์ง ๋ชปํ๋ ํ๋ค๋ ์ ๋ถ ์ถ๋ ฅํ๋ค.
๋๋ฝ๋ ์๋ฃ(NULL)๊ฐ ์์ผ๋ฉด ๋๋ฝ๋๊ฒ๊น์ง ์ถ๊ฐํด์ ๋ณด์ฌ์ค๋ค
์กฐ์ธ์ํฌ ๊ฐ์ด ์๋ ์กฐ์ธ์ธก์ (+)๋ฅผ ๋ถ์ฌ์ค๋ค. ํ ์ด๋ธ ์ค์ ํ๋ฒ๋ง ์ฌ์ฉ ๊ฐ๋ฅ.
์กฐ์ธ์ ์คํ๊ฒฐ๊ณผ๋ ๋ฐ๋์ ์กฐ์ธ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฐ์ดํฐ๋ง ์กฐํํ๋ฉฐ ์กฐ์ธ์กฐ๊ฑด์ ์๋ฐฐ๋๋ฉด ๋๋ฝ๋๋ค.
์กฐ๊ฑด์ ์ผ์นํ๋ ๋ฐ์ดํฐ๋ง ์กฐํํ๋ ์กฐ์ธ์ INNER ์กฐ์ธ์ด๋ผ ํ๊ณ ์์ ์ดํ, ๋ ผ์ดํ, ์ ํ์กฐ์ธ์ด ๋ชจ๋ ์ด๋์กฐ์ธ์ด๋ค.
EMP ํ ์ด๋ธ๊ณผ DEPT ํ ์ด๋ธ์์ DEPT ํ ์ด๋ธ์ ์๋ ๋ชจ๋ ์๋ฃ๋ฅผ ์ฌ์๋ฒํธ, ์ด๋ฆ, ์ ๋ฌด, EMP ํ ์ด๋ธ์ ๋ถ์๋ฒํธ, DEPT ํ ์ด๋ธ์ ๋ถ์๋ฒํธ,๋ถ์๋ช ,๊ทผ๋ฌด์ง๋ฅผ ์ถ๋ ฅํ๊ธฐ
ansi์กฐ์ธ
์กฐ์ธ ํ์์ด FROM ์ ์์ ์ง์ ๋๋ค.
์กฐ์ธ์กฐ๊ฑด์ WHERE์ ์ ์ฐ์ง ์๊ณ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ํตํด ์์ฑํ๋ค.
WHERE์ ์ ๊ฒ์์กฐ๊ฑด์ ์ง์ ํ ๋ ์ฌ์ฉ.
cross ์กฐ์ธ
SELECT EMPNO, ENAME, DNAME FROM DEPT CROSS JOIN EMP;
์ค๋ผํด ์กฐ์ธ์ ์นดํ์์์ด๋ ๋์ผํ ์กฐ๊ฑด ์๋ ์กฐ์ธ ๋ฐฉ๋ฒ์ด๋ค.
ํ๋กฌ์ ์กฐ์ธํ ํ ์ด๋ธ์ ๋ชจ๋ ๋์ดํ์ง ์๊ณ ,
ํ๋กฌ ๋ค์์ ํฌ๋ก์ค ์กฐ์ธ ์ ์ ๋ง๋ค์ด์ค๋ค.
natural ์กฐ์ธ
SELECT ํ ์ด๋ธ1.์ปฌ๋ผ, ํ ์ด๋ธ2.์ปฌ๋ผ FROM ํ ์ด๋ธ1 NATURAL JOIN ํ ์ด๋ธ2 [WHERE ๊ฒ์์กฐ๊ฑด];
์ดํ์กฐ์ธ๊ณผ ๋์ผํ๋ค. ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ์ปฌ๋ผ์ ๊ธฐ๋ฐ.
์์ชฝ ํ ์ด๋ธ์ ๋ฐ๋์ 1๊ฐ๋ง์ ๊ณตํต์ปฌ๋ผ๋ช ๋ง ์์ด์ผํ๋ค. 2๊ฐ ์ด์ ์์ผ๋ฉด ์๋ฑํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์จ๋ค.
FROM ์ ์์ NATURAL JOIN ํค์๋๋ฅผ ์ฌ์ฉํด ์กฐ์ธ ์กฐ๊ฑด์ ์ ์ด์ค๋ค.
WHERE์ ๊ฒ์์กฐ๊ฑด์ ์ง์ ํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์กฐ์ธ ์กฐ๊ฑด๊ณผ ๊ฒ์์กฐ๊ฑด์ ๋ถ๋ฆฌํ์ฌ ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์๋ค.
SELECT EMPNO, ENAME, DEPTNO FROM EMP NATURAL JOIN DEPT WHERE DEPTNO = 30;
์กฐ์ธ์ ์ฐธ์ฌํ๋ ํ ์ด๋ธ์ ๋ฐ๋์ ํ๊ฐ์ ๊ณตํต์ปฌ๋ผ์ด ์์ด์ผ ์ ํํ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ๋๋ฉฐ,
๋ ๊ฐ ์ด์์ ๊ณตํต์ปฌ๋ผ์ด ์๋ค๋ฉด ๋ ๊ณตํต์ปฌ๋ผ๊ฐ ๋ชจ๋ ๋ง์กฑํด์ผํด์ ์ ์ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋๋ค.
๊ณตํต์ปฌ๋ผ ์ฌ์ฉ์ ๋ณ์นญ ์ฌ์ฉํ ์ ์๋ค. ์ค๋ผํด์ด ์๋์ผ๋ก ๊ณตํต ์ปฌ๋ผ์ ์ฐพ์์ฃผ๊ธฐ ๋๋ฌธ์ ๋ณ์นญ ์ฌ์ฉ ์ ์๋ฌ ๋ฐ์.
using ์
SELECT ํ ์ด๋ธ1.์ปฌ๋ผ, ํ ์ด๋ธ2.์ปฌ๋ผ FROM ํ ์ด๋ธ1 [INNER] JOIN ํ ์ด๋ธ2 USING(๊ณตํต์ปฌ๋ผ) [WHERE ๊ฒ์์กฐ๊ฑด];
natural join์ ์ค๋ผํด์ด ๊ณตํต์ปฌ๋ผ์ ์๋์ผ๋ก ์ฐพ์์ฃผ๋๋ฐ using์ ๋ด๊ฐ ์ง์ ๊ณตํต์ปฌ๋ผ์ ๋ช ์ํด์ฃผ๋ ๋ฐฉ๋ฒ์ด๋ค.
๊ณตํต์ปฌ๋ผ์ด ์ฌ๋ฌ๊ฐ์ธ ๊ฒฝ์ฐ์ ๋ด๊ฐ ์ง์ ๋ช ์์ ์ผ๋ก ์ด๋ค ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ์กฐ์ธํ ๊ฑด์ง ์ง์ ํ๋ค. natural join๊ณผ ๊ฐ์ด ๊ณตํต์ปฌ๋ผ์๋ ๋ณ์นญ์ ์ฌ์ฉํ ์ ์๋ค.
์ค๋ผํด ์กฐ์ธ์ ์ดํ์กฐ์ธ๊ณผ ๋์ผํ ์คํ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
on ์
SELECT ํ ์ด๋ธ1.์ปฌ๋ผ, ํ ์ด๋ธ2.์ปฌ๋ผ FROM ํ ์ด๋ธ1 [INNER] JOIN ํ ์ด๋ธ2 ON ์กฐ์ธ์กฐ๊ฑด [WHERE ๊ฒ์์กฐ๊ฑด];
non-equi ์กฐ์ธ ๋๋ ์์ ์กฐ๊ฑด์ผ๋ก ์กฐ์ธ์ ์ฌ์ฉ
์กฐ์ธํ ์ปฌ๋ผ์ ๋ช ์ํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ค.
๋ณต์กํ ์กฐ๊ฑด์ ์กฐ์ธ์ด ๊ฐ๋ฅํ๋ค. (์๋ธ์ฟผ๋ฆฌ, AND/OR์ฐ์ฐ์, EXIST, IN ์ฐ์ฐ์)
FROM์์ JOIN ํค์๋ ์๋ค๋ก ์กฐ์ธํ ํ ์ด๋ธ๋ช ์ง์ ํ๊ณ ON ์ ์์ ์กฐ์ธ์กฐ๊ฑด์ ๋ช ์ํ๋ค
SELECT ENAME, DNAME, E.DEPTNO FROM EMP E JOIN DEPT D ON E.DEPTNO = D.DEPTNO;
๋ณ์นญ ์ฌ์ฉํ ์ ์๊ณ ON์ ์ ์ดํ์กฐ๊ฑด๋ ์ธ์ ์๋ค. WHERE ์ ์ ์ฌ์ฉํด ๊ฒ์์กฐ๊ฑด์ ์ง์ ํ๋ค.
์ฌ์ํ ์ด๋ธ๊ณผ ๋ถ์ ํ ์ด๋ธ์ ON ์ ์ฌ์ฉํด ์กฐ์ธ, ๋์ค์ ์ถ๊ฐ๋ก ๋ฑ๊ธ ํ ์ด๋ธ๊ณผ ์กฐ์ธ.
๋น๊ต์ฐ์ฐ์ ์ฌ์ฉํ๋ ๋ ผ์ดํ์กฐ์ธ์ ๊ฒฝ์ฐ ON์ ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
SELECT E.ENAME ์ฌ์๋ช , D.DNAME ๋ถ์๋ช , S.GRADE ๋ฑ๊ธ FROM EMP E JOIN DEPT D USING(DEPTNO) JOIN SALGRADE S ON E.SAL BETWEEN S.LOSAL AND S.HISAL;
๊ณตํต์ปฌ๋ผ์๋ ON์ ๋์ USING ์ ์ฌ์ฉ ๊ฐ๋ฅ.
SELECT EMPNO, ENAME, DNAME, SAL FROM EMP E JOIN DEPT D ON E.DEPTNO = D.DEPTNO AND SAL IN (800);
์๋ฌ๋ฆฌ๊ฐ 800์ธ ์ฌ์์ ์ ๋ณด ์ถ๋ ฅํ๊ธฐ
OUTER ์กฐ์ธ
LEFT / RIGHT / FULL
SELECT ํ ์ด๋ธ1.์ปฌ๋ผ, ํ ์ด๋ธ2.์ปฌ๋ผ FORM ํ ์ด๋ธ1 LEFT|RHINGT|FULL OUTER JOIN ํ ์ด๋ธ2 ON ์กฐ์ธ์กฐ๊ฑด | USING(์ปฌ๋ผ) [WHERE ๊ฒ์์กฐ๊ฑด];
์ข์ธก/์ฐ์ธก์ ๊ธฐ์ ํ ํ ์ด๋ธ์ ๋ชจ๋ ํ๋ค์ ์กฐ์ธ์กฐ๊ฑด ์ผ์น ์ฌ๋ถ์ ์๊ด์์ด ๋ชจ๋ ์ถ๋ ฅํ ์ ์๋ค.
FULL OUTER JOIN ์ LEFT JOIN๊ณผ RIGHT JOIN ์ ๊ฒฐ๊ณผ๋ฅผ ํฉ์งํฉ์ผ๋ก ์ฒ๋ฆฌํ ๊ฒฐ๊ณผ์ ๋์ผํ๋ค.
SELECT E.ENAME ์ฌ์๋ช , M.ENAME ๊ด๋ฆฌ์๋ช FROM EMP E LEFT OUTER JOIN EMP M ON E.MGR = M.EMPNO;
OUTER JOIN์ ์ฌ์ฉํด ์ฌ์๋ค์ ๋งค๋์ ์ ๋ณด ์ถ๋ ฅํ๊ธฐ
์๋ธ์ฟผ๋ฆฌ
ํ๋์ SELECT ๋ง์ผ๋ก ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์์๋, SELECT ๋๋ฒ ๋ ๋ฆด๊บผ ํ๊บผ๋ฒ์ ํด๋ฒ๋ฆฌ์!
select๋ฌธ ์์ ๋ ํ๋์ select๋ฌธ์ ์ค์ฒฉํ๋ ๊ฒ์ด ์๋ธ์ฟผ๋ฆฌ์ด๋ฉฐ ๋ฐ๊นฅ ์ชฝ SELECT๋ฌธ์ ๋ฉ์ธ์ฟผ๋ฆฌ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์๋ธ์ฟผ๋ฆฌ๋ ๋ฐ๋์ ๊ดํธ ์ฌ์ฉ
๋ฉ์ธ์ฟผ๋ฆฌ์์ ์๋ธ์ฟผ๋ฆฌ ์ปฌ๋ผ์ ์ฌ์ฉํ ์ ์๋ค
SELECT,FROM,WHERE,HAVING,ORDER BY,UPDATE,INSERT INTO์ ์๋ ์ฌ์ฉ๋ ์ ์๋ค.
์๋ธ์ฟผ๋ฆฌ์๋ GROUP BY๋ ์ฐ์ฌ๋ ORDER BY ๋ ์ฌ์ฉ๋ถ๊ฐ
1. EMPํ ์ด๋ธ์์ ์ค์ฝง์ ๋ถ์๋ฒํธ๋ฅผ ์ฐพ๋๋ค (์๋ธ์ฟผ๋ฆฌ)
2. EMP ํ ์ด๋ธ์์ 1๋ฒ์์ ์ฐพ์ ๋ถ์๋ฒํธ๋ฅผ ๊ฐ์ง ์ฌ๋์ ์ด๋ฆ์ ์ถ๋ ฅํ๋ค. (๋ฉ์ธ์ฟผ๋ฆฌ)
์กฐํ๋ ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ์ด ๋จ์ผํ์ธ์ง ๋ณต์ํ์ธ์ง์ ๋ฐ๋ผ ์ฐ์ฐ์๋ฅผ ๋ค๋ฅด๊ฒ ์ฌ์ฉํด์ผ ํ๋ค.
๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ
์๋ธ์ฟผ๋ฆฌ ์คํ ๊ฒฐ๊ณผ๊ฐ ํ๊ฐ์ ํ์ ๋ฐํํ๋ค
๋จ์ผํ ์ฐ์ฐ์ ์ฌ์ฉ (= , > , < , >= , <= , != ์ ๊ฐ์ ๋น๊ต์ฐ์ฐ์ )
๊ทธ๋ฃนํจ์๋ ๋จ์ผํ ๋ฆฌํด
๋ณต์ํ ์๋ธ์ฟผ๋ฆฌ
์๋ธ์ฟผ๋ฆฌ์ ์คํ ๊ฒฐ๊ณผ๊ฐ ์ฌ๋ฌ๊ฐ์ ํ์ ๋ฐํํ๋ค.
๋ณต์ํ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ผํจ. (IN, ANY, ALL, EXISTS)
์ฌ์ฉํ ์ ์๋ ์ฐ์ฐ์๊ฐ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ ๊ตฌ๋ถํด์ผ ํ๋ค.
IN ์ฐ์ฐ์
๋ฉ์ธ์ฟผ๋ฆฌ์ ๋น๊ต์กฐ๊ฑด์ด ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ์ค์์ ํ๋๋ผ๋ ์ผ์นํ๋ฉด ๊ฒ์ ๊ฐ๋ฅ.
SELECT * FROM EMP WHERE SAL IN (SELECT SAL FROM EMP WHERE ENAME IN ('MILLER', 'SCOTT'));
ALL์ฐ์ฐ์
๋ณต์ํ ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ๋ฉ์ธ ์ฟผ๋ฆฌ์ WHERE ์ ์์ ๋ถ๋ฑํธ ์กฐ๊ฑด์ผ๋ก ๋น๊ต๋ ๋ ์ฌ์ฉ๋๋ค.
์๋ธ์ฟผ๋ฆฌ์์ ๋ฐํ๋๋ ํ๋ค ์ ์ฒด์ ๋ํ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค.
์๋ธ์ฟผ๋ฆฌ์์ ๋ฐํ๋๋ ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ๋น๊ต
์๋ธ์ฟผ๋ฆฌ๊ฐ ๋ฐํ๋ ๋ชจ๋ ๊ฐ๋ณด๋ค ์์์ผ ์ต์์๊ธ๋ณด๋ค ์ ์ ์๊ธ์ ๋ฐ๋๋ค๋ ์กฐ๊ฑด์ด ์ผ์นํ๊ฒ ๋๋ค. ๊ทธ๋์ ALL ์ฐ์ฐ์๋ ์ต๋๊ฐ ์ต์๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋น๊ตํ๋๋ฐ ์ด์ฉ๋๋ค.
ANY ์ฐ์ฐ์
ALL ์ฐ์ฐ์์ ์ฌ์ฉ๋ฐฉ๋ฒ์ด ๋น์ทํ๋ค.
์๋ธ์ฟผ๋ฆฌ์์ ๋ฐํ๋๋ ํ๋ค ์ ์ฒด์ ๋ํด ํ๋์ ์กฐ๊ฑด๋ง ๋ง์กฑํ๋ฉด ๋๋ค.
์๋ธ์ฟผ๋ฆฌ์์ ๋ฐํ๋๋ ๊ฐ๋ค ์ค ์ด๋ ํ๋์ ๊ฐ๋ณด๋ค ํฌ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
SELECT ENAME, DEPTNO, SAL FROM EMP WHERE SAL > ANY (SELECT SAL FROM EMP WHERE JOB = "SALESMAN";
์ฌ์ ํ ์ด๋ธ์์ ์ง์ ์ด ์ธ์ผ์ฆ์ธ ์ฌ์์ ์ต์ ์๊ธ๋ณด๋ค ๋ง์ ์๊ธ์ ๋ฐ๋ ์ฌ์์ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๊ธฐ.
EXISTS ์ฐ์ฐ์
์๋ธ์ฟผ๋ฆฌ์ ์คํ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๋ฉ์ธ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ฑฐ๋ ์คํํ์ง ์๋ ๋ฌธ์ฅ์ ์์ฑํ ์ ์๋ค.
์๋ธ์ฟผ๋ฆฌ์์ ๊ฒ์๋ ๊ฒฐ๊ณผ๊ฐ ํ๋๋ ์์ผ๋ฉด ์ ๋ฌ๊ฐ์ด FALSE์ด๊ธฐ ๋๋ฌธ์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์๋ค.
SELECT * FORM EMP WHERE EXISTS ( SELECT EMPNO FROM EMP WHERE COMM IS NOT NULL );
์ฌ์๋ค ์ค ์ปค๋ฏธ์ ์ ๋ฐ๋ ์ฌ์์ด ํ ๋ช ์ด๋ผ๋ ์์ผ๋ฉด ๋ชจ๋ ์ฌ์ ์ ๋ณด ์ถ๋ ฅํ๊ธฐ
๋ค์ค์ปฌ๋ผ ์๋ธ์ฟผ๋ฆฌ
์๋ธ์ฟผ๋ฆฌ์์ ์ฌ๋ฌ๊ฐ์ ์ปฌ๋ผ๊ฐ์ ๊ฒ์ํ์ฌ ๋ฉ์ธ์ฟผ๋ฆฌ์ ์กฐ๊ฑด์ ๊ณผ ๋น๊ตํ๋ ์๋ธ์ฟผ๋ฆฌ.
๋ฉ์ธ์ฟผ๋ฆฌ์ ์กฐ๊ฑด์ ์์๋ ์๋ธ์ฟผ๋ฆฌ์ ์ปฌ๋ผ์๋งํผ ์ง์ ํด์ผ ํ๋ค. ์ผ๋์ผ ๋งค์นญ์ด ๋์ด์ผํจ.
PAIRWISE
์ปฌ๋ผ์ ์์ผ๋ก ๋ฌถ์ด์ ๋์๋น๊ต
SELECT DEPTNO, EMPNO, ENAME, SAL FROM EMP WHERE (DEPTNO, SAL) IN (SELECT DEPTNO, MAX(SAL) FROM EMP GROUP BY DEPTNO);
UNPAIRWISE
์ปฌ๋ผ๋ณ๋ก ๋๋์ด ๋น๊ตํ๊ณ ๋์ค์ AND ์ฐ์ฐ ์ฒ๋ฆฌ
SELECT DEPTNO, EMPNO, ENAME, SAL FROM EMP WHERE DEPTNO IN (SELECT DEPTNO FROM EMP GROUP BY DEPTNO) AND SAL IN (SELECT MAX(SAL) FROM EMP GROUP BY DEPTNO);
์ธ๋ผ์ธ๋ทฐ
SELECT column_list FROM (์๋ธ์ฟผ๋ฆฌ) alias WHERE ์กฐ๊ฑด์;
FROM ๋ค์ ํ ์ด๋ธ๋ช ์ด ์์ค๊ณ ์๋ธ์ฟผ๋ฆฌ๊ฐ ํ๋์ ๊ฐ์ํ ์ด๋ธ์ ๋ฐํํ๋ ํํ๋ก ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ.
ํ ์ด๋ธ 2๊ฐ๋ฅผ ์กฐ์ธํ๊ธฐ ๋๋ฌธ์ ๊ฒ์ํด๋ด์ผ ํ ๋ฐ์ดํฐ ๋ฒ์๊ฐ ์์ฃผ ๋์ด๋๋ค. ๊ทผ๋ฐ ์ธ๋ผ์ธ๋ทฐ๋ก ํ์ํ ํ๊ณผ ์ปฌ๋ผ๋ง์ผ๋ก ๊ตฌ์ฑ๋ ์งํฉ์ ์ฌ์ ์ํ๋ฉด ํจ์ฌ ์ ์ ์์ ๋ฐ์ดํฐ๊ฐ ์กฐ์ธ์ ์ฐธ์ฌํ๊ธฐ ๋๋ฌธ์ ๋ ํจ์จ์ ์ผ๋ก ์ฟผ๋ฆฌ๋ฌธ์ ์ฒ๋ฆฌํ ์ ์๋ค.
SELECT E.DEPTNO, TOTAL_SUM , TOTAL_AVG, CNT FROM (SELECT DEPTNO, SUM(SAL) TOTAL_SUM, AVG(SAL) TOTAL_AVG, COUNT(*) CNT FROM EMP GROUP BY DEPTNO ) E, DEPT D WHERE E.DEPTNO = D.DEPTNO;
์ฌ์ ํ ์ด๋ธ๊ณผ ๋ถ์ ํ ์ด๋ธ์์ ๋ถ์๋ณ ์๊ธ ์ดํฉ๊ณผ ํ๊ท ๊ทธ๋ฆฌ๊ณ ๋ถ์๋ณ ์ธ์์๋ฅผ ์ถ๋ ฅํ๊ธฐ
๐ NEXT : SQL ์กฐ์ธ๊ณผ ์๋ธ์ฟผ๋ฆฌ์ ์ค์ต๋ฌธ์ ํ์ด๋ณด๊ธฐ
๋ฐ์ํ'DATABASE' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SQL - DML, ํธ๋์ญ์ TCL (0) 2020.07.23 SQL ์กฐ์ธ, ์๋ธ์ฟผ๋ฆฌ ์ฐ์ต๋ฌธ์ ํ์ด๋ณด๊ธฐ (0) 2020.07.22 SQL - ๊ทธ๋ฃนํจ์, GROUP BY์ , HAVING์ (0) 2020.07.20 SQL - ๋จ์ผ ํ ํจ์(๋ฌธ์/์ซ์/๋ ์ง/๋ณํ/์กฐ๊ฑด) (0) 2020.07.19 SQL-SELECT๋ฌธ ์ดํด๋ณด๊ธฐ (0) 2020.07.18