-
SQL ์กฐ์ธ, ์๋ธ์ฟผ๋ฆฌ ์ฐ์ต๋ฌธ์ ํ์ด๋ณด๊ธฐDATABASE 2020. 7. 22. 08:33
๐ฏ SQL Join๊ณผ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ํ์ฉํด ๋ค์ํ ์์ ๋ฅผ ํ์ด๋ณธ๋ค.
JOIN ์ค์ต๋ฌธ์
SCOTT ๊ณ์ ์ ์ฐ์ต์ฉ ํ ์ด๋ธ ์ฌ์ฉ
์ค๋ผํด ์กฐ์ธ๋ ์ฌ์ฉํด๋ณด๊ณ ANSI์กฐ์ธ๋ ์ฌ์ฉํด๋ณด๊ธฐ
1. ๋ถ์ ํ ์ด๋ธ๊ณผ ์ฌ์ํ ์ด๋ธ์์ ์ฌ๋ฒ, ์ฌ์๋ช , ๋ถ์์ฝ๋, ๋ถ์๋ช ์ ๊ฒ์ํ์์ค. ( ์ฌ์๋ช ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ ๊ฒ )
SELECT EMPNO, ENAME, DEPTNO, DNAME FROM EMP, DEPT ORDER BY ENAME;
2. ๋ถ์ ํ ์ด๋ธ๊ณผ ์ฌ์ํ ์ด๋ธ์์ ์ฌ๋ฒ, ์ฌ์๋ช , ๊ธ์ฌ , ๋ถ์๋ช ์ ๊ฒ์ํ์์ค. ๋จ, ๊ธ์ฌ๊ฐ 2000 ์ด์์ธ ์ฌ์์ ๋ํ์ฌ ๊ธ์ฌ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํ ๊ฒ.
3. ๋ถ์ ํ ์ด๋ธ๊ณผ ์ฌ์ ํ ์ด๋ธ์์ ์ฌ๋ฒ, ์ฌ์๋ช , ์ ๋ฌด, ๊ธ์ฌ , ๋ถ์๋ช ์ ๊ฒ์ํ์์ค. ๋จ, ์ ๋ฌด๊ฐ Manager์ด๋ฉฐ ๊ธ์ฌ๊ฐ 2500 ์ด์์ธ ์ฌ์์ ๋ํ์ฌ ์ฌ๋ฒ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ ๊ฒ.
4. ์ฌ์ ํ ์ด๋ธ๊ณผ ๊ธ์ฌ ๋ฑ๊ธ ํ ์ด๋ธ์์ ์ฌ๋ฒ, ์ฌ์๋ช , ๊ธ์ฌ, ๋ฑ๊ธ์ ๊ฒ์ํ์์ค. ๋จ, ๋ฑ๊ธ์ ๊ธ์ฌ๊ฐ ํํ๊ฐ๊ณผ ์ํ๊ฐ ๋ฒ์์ ํฌํจ๋๊ณ ๋ฑ๊ธ์ด 4์ด๋ฉฐ ๊ธ์ฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์์ ๋ ฌํ ๊ฒ.
SELECT EMPNO, ENAME, SAL, GRADE FROM EMP E, SALGRADE S WHERE SAL BETWEEN LOSAL AND HISAL AND GRADE = 4 ORDER BY SAL DESC;
5. ๋ถ์ ํ ์ด๋ธ, ์ฌ์ ํ ์ด๋ธ, ๊ธ์ฌ๋ฑ๊ธ ํ ์ด๋ธ์์ ์ฌ๋ฒ, ์ฌ์๋ช , ๋ถ์๋ช , ๊ธ์ฌ , ๋ฑ๊ธ์ ๊ฒ์ํ์์ค. ๋จ, ๋ฑ๊ธ์ ๊ธ์ฌ๊ฐ ํํ๊ฐ๊ณผ ์ํ๊ฐ ๋ฒ์์ ํฌํจ๋๋ฉฐ ๋ฑ๊ธ์ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํ ๊ฒ.
where์ ์์ e์ d์์ ๊ฒน์น๋ ์ปฌ๋ผ์ ๋ช ์ํด์ฃผ์ง ์์ผ๋ฉด ์นดํ ์กฐ์ธ์ด ๋์ด์ ์ฌ๋ฐ๋ฅธ ๋ฐ์ดํฐ๊ฐ์ ๋ถ๋ฌ์ค์ง ๋ชปํ๋ค.
SELECT EMPNO, ENAME, DNAME, SAL, GRADE FROM EMP E, DEPT D, SALGRADE S WHERE E.DEPTNO = D.DEPTNO AND SAL BETWEEN LOSAL AND HISAL ORDER BY GRADE DESC;
6. ์ฌ์ ํ ์ด๋ธ์์ ์ฌ์๋ช ๊ณผ ํด๋น ์ฌ์์ ๊ด๋ฆฌ์๋ช ์ ๊ฒ์ํ์์ค
SELECT E.ENAME ์ฌ์๋ช , M.ENAME ๊ด๋ฆฌ์๋ช FROM EMP E, EMP M WHERE E.MGR = M.EMPNO;
7. ์ฌ์ ํ ์ด๋ธ์์ ์ฌ์๋ช , ํด๋น ์ฌ์์ ๊ด๋ฆฌ์๋ช , ํด๋น ์ฌ์์ ๊ด๋ฆฌ์์ ๊ด๋ฆฌ์๋ช ์ ๊ฒ์ํ์์ค
SELECT E.ENAME ์ฌ์๋ช , M.ENAME ๊ด๋ฆฌ์๋ช , MM.ENAME "๊ด๋ฆฌ์์ ๊ด๋ฆฌ์๋ช " FROM EMP E, EMP M, EMP MM WHERE E.MGR = M.EMPNO AND M.MGR = MM.EMPNO;
8. 7๋ฒ ๊ฒฐ๊ณผ์์ ์์ ๊ด๋ฆฌ์๊ฐ ์๋ ๋ชจ๋ ์ฌ์์ ์ด๋ฆ๋ ์ฌ์๋ช ์ ์ถ๋ ฅ๋๋๋ก ์์ ํ์์ค.
๋๋ณด๊ธฐํ๋ฆฐ๋ต์)
์ OUTER๊ฐ EMPNO ์ชฝ์ผ๋ก ๋ถ๋์ง ์ดํดํด์ผ ํ๋ค.
SELECT E.ENAME ์ฌ์๋ช , M.ENAME ๊ด๋ฆฌ์๋ช , MM.ENAME "๊ด๋ฆฌ์์ ๊ด๋ฆฌ์๋ช " FROM EMP E, EMP M, EMP MM WHERE E.MGR = M.EMPNO(+) AND M.MGR = MM.EMPNO(+);
์ด ์ฌ์์ ๋งค๋์ ๊ฐ์ด NULL ์ด๋๊น M ์ ์กฐํํ๋ ์ปฌ๋ผ์ (+)๋ฅผ ๋ถ์ธ๋ค.
9. 20๋ฒ ๋ถ์์ ์ด๋ฆ๊ณผ ๊ทธ ๋ถ์์ ๊ทผ๋ฌดํ๋ ์ฌ์์ ์ด๋ฆ์ ์ถ๋ ฅํ์์ค.
SELECT DNAME, ENAME FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO AND D.DEPTNO = 20;
10. ์ปค๋ฏธ์ ์ ๋ฐ๋ ์ฌ์์ ์ด๋ฆ, ์ปค๋ฏธ์ , ๋ถ์์ด๋ฆ ์ถ๋ ฅํ์์ค.
11. ์ด๋ฆ์ ‘A’ ๊ฐ ๋ค์ด๊ฐ๋ ์ฌ์๋ค์ ์ด๋ฆ๊ณผ ๋ถ์๋ช ์ถ๋ ฅํ๊ธฐ.
12. DALLAS์ ๊ทผ๋ฌดํ๋ ์ฌ์ ์ค ๊ธ์ฌ 1500 ์ด์์ธ ์ฌ์์ ์ด๋ฆ, ๊ธ์ฌ, ์ ์ฌ์ผ , ๋ณด๋์ค(comm)์ ์ถ๋ ฅํ์์ค.
13. ์์ ์ ๊ด๋ฆฌ์ ๋ณด๋ค ์ฐ๋ด(sal)์ ๋ง์ด ๋ฐ๋ ์ฌ์์ ์ด๋ฆ๊ณผ ์ฐ๋ด์ ์ถ๋ ฅํ์์ค.
SELECT ENAME, SAL FROM EMP E JOIN EMP M ON E.MGR = M.EMPNO WHERE E.SAL > M.SAL; -- ๋ก!ERRRRRRORRRRR
๋ด๊ฐ ๋์น ๋ถ๋ถ >> ์ ํ ์กฐ์ธํ ์ํฉ์์ ๋๊ฐ์ ์ปฌ๋ผ์ ๊ฐ์ง ํ ์ด๋ธ 2๊ฐ๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ SELECT์์๋ ์ ๋ณด๋ฅผ ๋ฝ์์ฌ ํ ์ด๋ธ๋ช ์ ๋ช ์ํด ์ฃผ์ด์ผ ํ๋ค.
14. ์ง์ ์ค ํ์ฌ์๊ฐ ๊ธฐ์ค์ผ๋ก ๊ทผ๋ฌด ๊ฐ์ ์๊ฐ 30๋ (12 * 30๊ฐ์) ๋ณด๋ค ๋ง์ ์ฌ๋์ ์ด๋ฆ, ๊ธ์ฌ , ์ ์ฌ์ผ , ๋ถ์๋ช ์ ์ถ๋ ฅํ์์ค
SELECT ENAME, SAL, HIREDATE, DNAME FROM EMP E JOIN DEPT D USING(DEPTNO) WHERE MONTHS_BETWEEN(SYSDATE, HIREDATE) > 360;
MONTHS_BETWEEN์ ์ฌ์ฉํ ๋ S ๋น ๋จ๋ฆฌ์ง ์๊ฒ ์ฃผ์ํ ๊ฒ.
15. ๊ฐ ๋ถ์๋ณ๋ก 1982๋ ์ด์ ์ ์ ์ฌํ ์ง์๋ค์ ์ธ์์๋ฅผ ์ถ๋ ฅํ์์ค.
-- ์ค๋ผํด ์กฐ์ธ SELECT DEPTNO ๋ถ์๋ฒํธ, COUNT(ENAME) ์ธ์์ FROM EMP E, DEPT D where d.deptno = e.deptno and to_char(e.hiredate, 'yyyy') <=1982 group by d.dname;
์๋ธ์ฟผ๋ฆฌ ์ค์ต๋ฌธ์
1. ์ฌ์ ํ ์ด๋ธ์์ BLAKE ๋ณด๋ค ๊ธ์ฌ๊ฐ ๋ง์ ์ฌ์๋ค์ ์ฌ๋ฒ, ์ด๋ฆ , ๊ธ์ฌ๋ฅผ ๊ฒ์ํ์์ค.
์ฌ์ํ ์ด๋ธ์ BLAKE์ ๊ธ์ฌ๋ฅผ ๋จผ์ ์ฐพ๋๋ค.
WHERE ์ ์ ๋น๊ต์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด SELECT๋ฌธ์ ์์ฑํ๋ค.
2. ์ฌ์ ํ ์ด๋ธ์์ MILLER ๋ณด๋ค ๋ฆ๊ฒ ์ ์ฌํ ์ฌ์์ ์ฌ๋ฒ, ์ด๋ฆ, ์ ์ฌ์ผ์ ๊ฒ์ํ์์ค
๋ฐ๋ฌ๋ณด๋ค ๋ฆ๊ฒ ์ ์ฌํ ๊ฑฐ๋ฉด HIREDATE ์ซ์๊ฐ ๋ ์ปค์ผ ํ๋๊น ๋ถ๋ฑํธ๋ ๋ฐ๋๊ฐ ๋์ด์ผํ๋ค.
SELECT EMPNO, ENAME, HIREDATE FROM EMP WHERE HIREDATE > (SELECT HIREDATE FROM EMP WHERE ENAME = 'MILLER');
์ ๋ต!
3. ์ฌ์ ํ ์ด๋ธ์์ ์ฌ์ ์ ์ฒด ํ๊ท ๊ธ์ฌ๋ณด๋ค ๊ธ์ฌ๊ฐ ๋ง์ ์ฌ์๋ค์ ์ฌ๋ฒ, ์ด๋ฆ , ๊ธ์ฌ๋ฅผ ๊ฒ์ํ์์ค.
4. ์ฌ์ ํ ์ด๋ธ์์ ๋ถ์๋ณ ์ต๋ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์๋ค์ ์ฌ๋ฒ, ์ด๋ฆ, ๋ถ์์ฝ๋, ๊ธ์ฌ๋ฅผ ๊ฒ์ํ์์ค.
SELECT EMPNO, ENAME, DEPTNO, SAL FROM EMP WHERE SAL IN (SELECT MAX(SAL) FROM EMP GROUP BY DEPTNO);
๋ถ์๋ 4๊ฐ๊ฐ ์๊ณ ๊ทธ์ค 40์ ๋ฐ์ดํฐ๊ฐ์ด ์๋ค. ๋ฐ๋ผ์ 3๊ฐ ๋ถ์์ ๋ํ ์ต๋๊ธ์ฌ ์๋ธ์ฟผ๋ฆฌ๊ฐ ๋ฆฌํด๋๋ค.
๊ทธ๋ฃนํจ์๋ ๋จ์ผํ์ ๋ฆฌํดํ๋ค๊ณ ํ๋๋ฐ, ์ ์ ๊ธฐ์ ๋ณต์ํ ์๋ธ์ฟผ๋ฆฌ์ ์ฐ์ฐ์(IN)๊ฐ ๋ถ์ด๋ ๊ฒฐ๊ณผ๊ฐ ์ ๋์ค๋๊ฑฐ์ง? ํผ๋์ค๋ฌ์ ๋๋ฐ, GROUP BY๊ฐ ๋ถ์ด์ ๋ณต์ํ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋๋ ์๋ธ์ฟผ๋ฆฌ์์ ํ์ธํ๋ค.
๊ทธ๋์ ๋๋ฑ์ฐ์ฐ์(=)๊ฐ ์๋ IN ์ฐ์ฐ์๊ฐ ์ฌ์ฉ๋ ๊ฒ์ด๋ค.
5. Salgrade๊ฐ 2๋ฑ๊ธ์ธ ์ฌ์๋ค์ ํ๊ท ๊ธ์ฌ๋ณด๋ค ์ ๊ฒ ๋ฐ๋ ์ฌ์ ์ ๋ณด๋ฅผ ๊ฒ์ํ์์ค.
SELECT * FROM EMP E, SALGRADE S WHERE SAL < (SELECT AVG(SAL) FROM EMP WHERE S.GRADE = 2);
ํ๋ ธ๋ค! ์ด ์ฟผ๋ฆฌ๋ฌธ์ 8๋ช ์ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๊ฒ ๋๋ค.
๋ ํ ์ด๋ธ์ ๊ณตํต์ปฌ๋ผ์ด ์๋ ๋ ผ ์ดํ ์กฐ์ธ์ด๋ค.
๋ฐ๋ผ์ ์๋ธ์ฟผ๋ฆฌ WHERE ์ ์๋ ๋น๊ต์ฐ์ฐ์๋ฅผ ์จ์ค์ผ ํ๋๋ฐ ์๋ฑํ ์ดํ์ด ๋ค์ด๊ฐ์๋ค.
SELECT * FROM EMP WHERE SAL <= (SELECT AVG(SAL) FROM EMP E JOIN SALGRADE S ON E.SAL BETWEEN S.LOSAL AND S.HISAL WHERE S.GRADE = 2);
์ ๋ต! ์๋ธ์ฟผ๋ฆฌ ์์์ ANSI์กฐ์ธ์ ์ฌ์ฉํ ์ด ์ฟผ๋ฆฌ๋ฌธ์ 5๋ช ์ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๋ค.
์๋ก ๊ณตํต์ปฌ๋ผ์ด ์๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ ์กฐ์ธ์กฐ๊ฑด์ ๋ช ์ํ์ง ์์ผ๋ฉด ๊ฒ์์กฐ๊ฑด์ ์ ๋ ๊ฒ ์จ์ค๋ ๋จนํ์ง ์๋๋ค.
๋ฑ๊ธ๋ง์ผ๋ก ์ฌ์์ ๋ณด๋ฅผ ๋ฝ์๋ดค์ ๋ ๋ถํ์ํ ๋ชจ๋ ์ ๋ณด๊ฐ ๋ฆฌํด๋๋ ๊ฑธ ์ ์ ์๋๋ฐ, ์ด๊ฑด ์กฐ๊ฑด์ ์ด ๋ช ํํ์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ ผ์ดํ ์กฐ๊ฑด์ ์ SAL๋ฑ๊ธ์ ๋ฒ์๋ฅผ SAL BETWEEN S.LOSAL AND S.HISAL ์ด๋ ๊ฒ ๋ช ์ํด์ผ ํ๋ค.
ํ๊ท ์์ด ์๋ฑ๊ธ ์กฐ๊ฑด์ ์ด๋ค ๊ฐ ์ฌ์ด์ ํฌํจ๋๋์ง ํ์ธํ๋ ๊ฒ์ด ๋จผ์ ๊ณ , ๊ทธ ๋ค์ 2๋ฑ๊ธ์ ํด๋น๋๋ ๊ฐ์ ๊ฑธ๋ฌ๋ธ๋ค.
-- ์ค๋ผํด ์กฐ์ธ์ผ๋ก ์จ๋ณด๊ธฐ SELECT * FROM EMP WHERE SAL <= (SELECT AVG(SAL) FROM EMP E, SALGRADE S WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL AND S.GRADE = 2); -- ์์๋ ์ค์ํ๋ค๋ ๊ฑธ ์์๋ค
๐ NEXT : SQL DML ๋ช ๋ น๋ฌธ ์์๋ณด๊ธฐ
๋ฐ์ํ'DATABASE' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SQL - DDL ๋ช ๋ น์ด, ํ ์ด๋ธ ์์ฑ ์ ์ฝ์กฐ๊ฑด (0) 2020.07.24 SQL - DML, ํธ๋์ญ์ TCL (0) 2020.07.23 SQL - Join, ์๋ธ์ฟผ๋ฆฌ (0) 2020.07.21 SQL - ๊ทธ๋ฃนํจ์, GROUP BY์ , HAVING์ (0) 2020.07.20 SQL - ๋จ์ผ ํ ํจ์(๋ฌธ์/์ซ์/๋ ์ง/๋ณํ/์กฐ๊ฑด) (0) 2020.07.19