1. ์๋ธ์ฟผ๋ฆฌ subquery
- SQL ๋ฌธ์ ์คํํ๋ ๋ฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ๋ก ์กฐํํ๊ธฐ ์ํด SQL ๋ฌธ ๋ด๋ถ์์ ์ฌ์ฉํ๋ SELECT ๋ฌธ
- ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ๊ฐ์ ์ฌ์ฉํ์ฌ ๊ธฐ๋ฅ์ ์ํํ๋ ์์ญ์ ๋ฉ์ธ์ฟผ๋ฆฌ main query ๋ผ๊ณ ๋ถ๋ฅธ๋ค
SELECT ์กฐํํ ์นผ๋ผ
FROM ์กฐํํ ํ
์ด๋ธ
WHERE ์กฐ๊ฑด์ ( SELECT ์กฐํํ ์นผ๋ผ
FROM ์กฐํํ ํ
์ด๋ธ
WHERE ์กฐ๊ฑด์ )
-- 1. ์ด๋ฆ์ด JONES์ธ ์ฌ์์ ๊ธ์ฌ ์ถ๋ ฅํ๊ธฐ
SELECT SAL
FROM EMP
WHERE ENAME = 'JONES';
-- 2. ๊ธ์ฌ๊ฐ 2975๋ณด๋ค ๋์ ์ฌ์ ์ ๋ณด ์ถ๋ ฅํ๊ธฐ
SELECT *
FROM EMP
WHERE SAL > 2975;
-- 3. ์๋ธ์ฟผ๋ฆฌ๋ก JONES๋ณด๋ค ๋์ ๊ธ์ฌ ๋ฐ๋ ์ฌ์ ์ ๋ณด ์ถ๋ ฅํ๊ธฐ
SELECT *
FROM EMP
WHERE SAL > ( SELECT SAL
FROM EMP
WHERE ENAME = 'JONES');
(1) ์ฌ์ ์ด๋ฆ์ด JONES ์ธ ์ฌ์์ ๊ธ์ฌ๋ 2975
(2) ๊ธ์ฌ๊ฐ 2975๋ณด๋ค ๋์ ์ฌ์ ์ ๋ณด ์ถ๋ ฅํ๊ธฐ
(3) ์๋ธ์ฟผ๋ฆฌ๋ก JONES๋ณด๋ค ๋์ ๊ธ์ฌ ๋ฐ๋ ์ฌ์ ์ ๋ณด ์ถ๋ ฅํ๊ธฐ ( = (1) + (2) )
2. ๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ single-row subquery
- ์คํ ๊ฒฐ๊ณผ๊ฐ ๋จ ํ๋์ ํ์ผ๋ก ๋์ค๋ ์๋ธ์ฟผ๋ฆฌ
- ์๋ธ์ฟผ๋ฆฌ์์ ์ถ๋ ฅ๋๋ ๊ฒฐ๊ณผ๊ฐ ํ๋์ด๋ฏ๋ก ๋ฉ์ธ์ฟผ๋ฆฌ์ ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ ๋จ์ผํ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๋น๊ต
- ๋จ์ผํ ์ฐ์ฐ์ ( '>' : ์ด๊ณผ | '>=' : ์ด์ | '=' : ๊ฐ์ | '<=' : ์ดํ | '<' : ๋ฏธ๋ง | '<>' '^=' '!=' : ๊ฐ์ง ์์ )
- ์๋ธ์ฟผ๋ฆฌ์ ์์๋ก ์ฌ์ฉ๋ JONES๋ผ๋ ์ด๋ฆ์ผ๋ก ๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ด๋ฆ์ด ์ค๋ณต์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋์ค์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค
-- 1. ๋ ์งํ ๋ฐ์ดํฐ
SELECT *
FROM EMP
WHERE HIREDATE < ( SELECT HIREDATE
FROM EMP
WHERE ENAME = 'SCOTT' );
-- 2. ๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ์ ํจ์
SELECT E.EMPNO, E.ENAME, E.JOB, E.SAL, D.DEPTNO, D.DNAME, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
AND E.DEPTNO = 20
AND E.SAL < ( SELECT AVG(SAL)
FROM EMP );
(1) ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๊ฐ์ด ๋ ์ง(DATE) ์๋ฃํ์ผ ๋๋ ๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ๋ก์ ์ฌ์ฉ ๊ฐ๋ฅ
(2) ์๋ธ์ฟผ๋ฆฌ์์ ํน์ ํจ์๋ฅผ ์ฌ์ฉํ ๊ฒฐ๊ณผ ๊ฐ์ด ํ๋์ผ ๋ ๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ๋ก์ ์ฌ์ฉ ๊ฐ๋ฅ
3. ๋ค์คํ ์๋ธ์ฟผ๋ฆฌ multiple-row subquery
- ์คํ ๊ฒฐ๊ณผ ํ์ด ์ฌ๋ฌ ๊ฐ๋ก ๋์ค๋ ์๋ธ์ฟผ๋ฆฌ
- ๋จ์ผํ ์ฐ์ฐ์๋ ์ฌ์ฉํ ์ ์๊ณ ๋ค์คํ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ผ ๋ฉ์ธ์ฟผ๋ฆฌ๋ ๋น๊ต๊ฐ ๊ฐ๋ฅ
3-1. ๋ค์คํ ์ฐ์ฐ์ IN
- ๋ฉ์ธ์ฟผ๋ฆฌ์ ๋ฐ์ดํฐ๊ฐ ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ์ค ํ๋๋ผ๋ ์ผ์นํ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด true
- WHERE ์ ์ ์ฐ์ฐ์ IN๊ณผ ๊ฐ์ ์ญํ ์ ํ๋ค
-- 1.
SELECT *
FROM EMP
WHERE DEPTNO IN (20, 30);
-- 2.
SELECT *
FROM EMP
WHERE SAL IN ( SELECT MAX(SAL)
FROM EMP
GROUP BY DEPTNO );
(1) DEPTNO ๊ฐ 20์ด๊ฑฐ๋ 30์ธ EMP ํ ์ด๋ธ์ ๋ชจ๋ ํ ์ถ๋ ฅ
(2) SAL ์ด EMP ํ ์ด๋ธ์ ๊ฐ DEPTNO ๋ง๋ค์ MAX๊ฐ๊ณผ ๊ฐ์ EMP ํ ์ด๋ธ์ ๋ชจ๋ ํ ์ถ๋ ฅ
3-2. ๋ค์คํ ์ฐ์ฐ์ ANY, SOME
- ๋ฉ์ธ์ฟผ๋ฆฌ์ ์กฐ๊ฑด์์ ๋ง์กฑํ๋ ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ํ๋ ์ด์์ด๋ฉด true
-- 1. = ANY ์ฐ์ฐ์ ์ฌ์ฉํ๊ธฐ
SELECT *
FROM EMP
WHERE SAL = ANY ( SELECT MAX(SAL)
FROM EMP
GROUP BY DEPTNO );
-- 2. = SOME ์ฐ์ฐ์ ์ฌ์ฉํ๊ธฐ
SELECT *
FROM EMP
WHERE SAL = SOME ( SELECT MAX(SAL)
FROM EMP
GROUP BY DEPTNO );
(1)(2) ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ์ค ํ๋๋ง ์กฐ๊ฑด์์ ๋ง์กฑํ๋ฉด ์ถ๋ ฅ๋๋ค. ANY ์ฐ์ฐ์์ SOME ์ฐ์ฐ์๋ฅผ ๋ฑ๊ฐ ๋น๊ต ์ฐ์ฐ์(=)์ ํจ๊ป ์ฌ์ฉํ๋ฉด IN ์ฐ์ฐ์์ ์ ํํ ๊ฐ์ ๊ธฐ๋ฅ์ ์ํ
-- 3. DEPTNO ๊ฐ 30์ธ ๋ถ์ ์ฌ์๋ค์ ๊ธ์ฌ๋ณด๋ค ์ ์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์ ์ ๋ณด ์ถ๋ ฅ
SELECT *
FROM EMP
WHERE SAL < ANY ( SELECT SAL
FROM EMP
WHERE DEPTNO = 30 )
ORDER BY SAL, DEPTNO;
-- 4.
SELECT *
FROM EMP
WHERE SAL < ( SELECT MAX(SAL)
FROM EMP
GROUP BY DEPTNO )
ORDER BY SAL, DEPTNO;
-- 5. DEPTNO ๊ฐ 30์ธ ๋ถ์ ์ฌ์๋ค์ ๊ธ์ฌ๋ณด๋ค ๋ง์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์ ์ ๋ณด ์ถ๋ ฅ
SELECT *
FROM EMP
WHERE SAL > ANY ( SELECT SAL
FROM EMP
WHERE DEPTNO = 30 )
ORDER BY SAL, DEPTNO;
(3) < ANY ์ฐ์ฐ์๋ ๋ฉ์ธ ์ฟผ๋ฆฌ์ ์กฐ๊ฑด์์ธ SAL ๊ฐ์ด ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ๊ฐ์ธ DEPTNO๊ฐ 30์ธ ๋ถ์ ์ฌ์๋ค์ ๊ธ์ฌ๋ค ๋ณด๋ค ์ ์ผ๋ฉด true ๋ฅผ ๋ฐํํ์ฌ ์ถ๋ ฅ๋๋ค. ์ฆ SAL ๊ฐ์ด ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ๊ฐ ์ค ๊ฐ์ฅ ํฐ ๊ฐ๊ณผ ๋น๊ตํ์ฌ ์์ผ๋ฉด ์ถ๋ ฅํ๋ค. ์๋ฅผ๋ค์ด ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ 3000, 2800, 2500 ์ด๋ผ๊ณ ํ์ ๋ 2500๋ณด๋ค ๋ง๋๋ผ๋ 3000๋ณด๋ค๋ง ์์ผ๋ฉด ANY ์ฐ์ฐ์์ ์ ์์ ๋ฐ๋ผ true๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ
(4) (3)๋ฒ์ ์ํด < ANY ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ๊ฒ๊ณผ ANY ์ฐ์ฐ์ ์์ด < ์ฐ์ฐ์์ ์๋ธ์ฟผ๋ฆฌ์์ MAX ํจ์๋ฅผ ์ฌ์ฉํ ๊ฒฐ๊ณผ๊ฐ ๊ฐ๋ค
(5) > ANY ์ฐ์ฐ์๋ ๋ฉ์ธ ์ฟผ๋ฆฌ์ ์กฐ๊ฑด์์ธ SAL ๊ฐ์ด ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ๊ฐ์ธ DEPTNO๊ฐ 30์ธ ๋ถ์ ์ฌ์๋ค์ ๊ธ์ฌ๋ค ๋ณด๋ค ๋ง์ผ๋ฉด true ๋ฅผ ๋ฐํํ์ฌ ์ถ๋ ฅ๋๋ค. ์ฆ SAL ๊ฐ์ด ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ๊ฐ ์ค ๊ฐ์ฅ ์์ ๊ฐ๊ณผ ๋น๊ตํ์ฌ ์์ผ๋ฉด ์ถ๋ ฅํ๋ค. ์๋ฅผ๋ค์ด ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ 3000, 2800, 2500 ์ด๋ผ๊ณ ํ์ ๋ 3000๋ณด๋ค ์๋๋ผ๋ 2500๋ณด๋ค๋ง ํฌ๋ฉด ANY ์ฐ์ฐ์์ ์ ์์ ๋ฐ๋ผ true๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ
3-3. ๋ค์คํ ์ฐ์ฐ์ ALL
- ANY, SOME ์ฐ์ฐ์์ ๋ฌ๋ฆฌ ๋ฉ์ธ์ฟผ๋ฆฌ์ ์กฐ๊ฑด์์ ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ๋ชจ๋๊ฐ ๋ง์กฑํ๋ฉด true
-- 1. DEPTNO ๊ฐ 30์ธ ๋ถ์ ์ฌ์๋ค์ ๊ธ์ฌ๋ณด๋ค ์ ์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์ ์ ๋ณด ์ถ๋ ฅ
SELECT *
FROM EMP
WHERE SAL < ALL ( SELECT SAL
FROM EMP
WHERE DEPTNO = 30 );
-- 2. DEPTNO ๊ฐ 30์ธ ๋ถ์ ์ฌ์๋ค์ ๊ธ์ฌ๋ณด๋ค ๋ง์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์ ์ ๋ณด ์ถ๋ ฅ
SELECT *
FROM EMP
WHERE SAL > ALL ( SELECT SAL
FROM EMP
WHERE DEPTNO = 30 );
(1) < ALL ์ฐ์ฐ์๋ ์๋ธ์ฟผ๋ฆฌ์ ๋ชจ๋ ๊ฒฐ๊ณผ๊ฐ๋ณด๋ค ์์ ๊ฐ์ ๊ฐ์ง ๋ฉ์ธ์ฟผ๋ฆฌ์ ํ๋ง ์ถ๋ ฅ๋๋ค. ์ฆ ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ์ค ์ต์๊ฐ๋ณด๋ค ์์ ๊ฐ์ ๊ฐ์ง ๋ฐ์ดํฐ๋ง ์ถ๋ ฅ๋๋ค
(2) > ALL ์ฐ์ฐ์๋ ์๋ธ์ฟผ๋ฆฌ์ ๋ชจ๋ ๊ฒฐ๊ณผ๊ฐ๋ณด๋ค ํฐ ๊ฐ์ ๊ฐ์ง ๋ฉ์ธ์ฟผ๋ฆฌ์ ํ๋ง ์ถ๋ ฅ๋๋ค. ์ฆ ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ์ค ์ต๋๊ฐ๋ณด๋ค ํฐ ๊ฐ์ ๊ฐ์ง ๋ฐ์ดํฐ๋ง ์ถ๋ ฅ๋๋ค
3-4. ๋ค์คํ ์ฐ์ฐ์ EXISTS
- ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ์กด์ฌํ๋ฉด ( ์ฆ, ํ์ด 1๊ฐ ์ด์์ผ ๊ฒฝ์ฐ ) true
- ํน์ ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๊ฐ์ ์กด์ฌ ์ ๋ฌด๋ฅผ ํตํด ๋ฉ์ธ์ฟผ๋ฆฌ์ ๋ฐ์ดํฐ ๋ ธ์ถ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํด์ผ ํ ๋ ์ฌ์ฉ
4. ๋ค์ค์ด ์๋ธ์ฟผ๋ฆฌ multiple-column subquery
- ์๋ธ์ฟผ๋ฆฌ์ SELECT ์ ์ ๋น๊ตํ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๊ฐ ์ง์ ํ๋ ๋ฐฉ์
- ๋ฉ์ธ์ฟผ๋ฆฌ์ ๋น๊ตํ ์ด์ ๊ดํธ๋ก ๋ฌถ์ด ๋ช ์ํ๊ณ ์๋ธ์ฟผ๋ฆฌ์์๋ ๊ดํธ๋ก ๋ฌถ์ ๋ฐ์ดํฐ์ ๊ฐ์ ์๋ฃํ ๋ฐ์ดํฐ๋ฅผ SELECT ์ ์ ๋ช ์ํ์ฌ ์ฌ์ฉ
-- 1.
SELECT *
FROM EMP
WHERE (DEPTNO, SAL) IN (SELECT DEPTNO, MAX(SAL)
FROM EMP
GROUP BY DEPTNO );
(1) ๋ฉ์ธ์ฟผ๋ฆฌ ์กฐ๊ฑด์ ์ (DEPTNO, SAL) ๊ณผ ์๋ธ์ฟผ๋ฆฌ์ SELECT ์ ์ DEPTNO, MAX(SAL) ์ด ๊ฐ์ ์๋ฃํ
5. FROM ์ ์ ์ฌ์ฉํ๋ ์๋ธ์ฟผ๋ฆฌ : ์ธ๋ผ์ธ ๋ทฐ inline view ์ WITH ์
- FROM ์ ์ ์ฌ์ฉํ๋ ์๋ธ์ฟผ๋ฆฌ๋ ์ธ๋ผ์ธ ๋ทฐ inline view ๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค
- FROM ์ ์ ์ง์ ํ ์ด๋ธ์ ๋ช ์ํ์ฌ ์ฌ์ฉํ๊ธฐ์๋ ํ ์ด๋ธ ๋ด ๋ฐ์ดํฐ ๊ท๋ชจ๊ฐ ๋๋ฌด ํฌ๊ฑฐ๋ ํ์ฌ ์์ ์ ๋ถํ์ํ ์นผ๋ผ์ด ๋ง์ ์ผ๋ถ ํ๊ณผ ์นผ๋ผ๋ง ์ฌ์ฉํ๊ณ ์ ํ ๋ ์ ์ฉ
- ์ธ๋ผ์ธ ๋ทฐ๋ ํน์ ํ ์ด๋ธ ์ ์ฒด ๋ฐ์ดํฐ๊ฐ ์๋ SELECT ๋ฌธ์ ํตํด ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ์ถ์ถํด ์จ ํ ๋ณ์นญ์ ์ฃผ์ด ์ฌ์ฉ
- FROM ์ ์ ๋๋ฌด ๋ง์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ง์ ํ๋ฉด ๊ฐ๋ ์ฑ์ด๋ ์ฑ๋ฅ์ด ๋จ์ด์ง ์ ์๊ธฐ ๋๋ฌธ์ ๊ฒฝ์ฐ์ ๋ฐ๋ผ WITH ์ ์ฌ์ฉ
- WITH ์ ์ ๋ฉ์ธ์ฟผ๋ฆฌ๊ฐ ๋ SELECT๋ฌธ ์์์ ์ฌ์ฉํ ์๋ธ์ฟผ๋ฆฌ์ ๋ณ์นญ์ ๋จผ์ ์ง์ ํ ํ ๋ฉ์ธ์ฟผ๋ฆฌ์์ ์ฌ์ฉ
WITH
[๋ณ์นญ 1] AS (SELECT๋ฌธ 1),
[๋ณ์นญ 2] AS (SELECT๋ฌธ 2),
…
[๋ณ์นญ n] AS (SELECT๋ฌธ n),
SELECT
FROM ๋ณ์นญ 1, ๋ณ์นญ 2, … , ๋ณ์นญ n
…
-- 1. ์ธ๋ผ์ธ ๋ทฐ ์ฌ์ฉํ๊ธฐ
SELECT E10.EMONO, E10.ENAME, E10.DEPTNO, D.DNAME, D.LOC
FROM (SELECT * FROM EMP WHERE DEPTNO = 10) E10,
(SELECT * FROM DEPT) D
WHERE E10.DEPTNO = D.DEPTNO;
-- 2. WITH ์ ์ฌ์ฉํ๊ธฐ
WITH
E10 AS (SELECT * FROM EMP WHERE DEPTNO = 10),
D AS (SELECT * FROM DEPT)
SELECT E10.EMONO, E10.ENAME, E10.DEPTNO, D.DNAME, D.LOC
FROM E10, D
WHERE E10.DEPTNO = D.DEPTNO;
(1) ์ธ๋ผ์ธ ๋ทฐ๋ฅผ ์ฌ์ฉํ์ฌ FROM ์ ์์์ ์๋ธ์ฟผ๋ฆฌ ์ฌ์ฉ
(2) WITH ์ ์ ์ฌ์ฉํ์ฌ ๋ฉ์ธ์ฟผ๋ฆฌ ์์ ์ ์ ์๋ธ์ฟผ๋ฆฌ์ ๋ณ์นญ์ ๋ฏธ๋ฆฌ ์ง์
6. SELECT ์ ์ ์ฌ์ฉํ๋ ์๋ธ์ฟผ๋ฆฌ : ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ scalar subquery
- SELECT ์ ์ ์ฌ์ฉํ๋ ์๋ธ์ฟผ๋ฆฌ๋ ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ scalar subquery ๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค
- SELECT ์ ์ ํ๋์ ์นผ๋ผ ์์ญ์ผ๋ก์ ๊ฒฐ๊ณผ ์ถ๋ ฅ์ด ๊ฐ๋ฅ
- ๋ฐ๋์ ํ๋์ ๊ฒฐ๊ณผ๋ง ๋ฐํํ๋๋ก ์์ฑํด์ผํ๋ค
SELECT EMPNO, ENAME, JOB, SAL,
( SELECT GRADE
FROM SALGRADE
WHERE E.SAL BETWEEN LOSAL AND HISAL ) AS SALGRADE,
DEPTNO,
( SELECT DNAME
FROM DEPT
WHERE E.DEPTNO = DEPT.DEPTNO ) AS DNAME
FROM EMP E;