์๋ธ ์ฟผ๋ฆฌSubquery๋ ๋ฉ์ธ ์ฟผ๋ฆฌMain query๋ฅผ ์คํํ๋ ๋ฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ๋ก ์กฐํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋ถ๊ฐ์ ์ธ SELECT๋ฌธ์ ๋งํ๋ค. ์ด๋ค ๋ฉ์ธ ์ฟผ๋ฆฌ์ ํฌํจ๋์ด ์๋ค๋ ์๋ฏธ์์ ๋ด๋ถ ์ฟผ๋ฆฌInner query๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํ๋ค. ์ด๋, ๋ฉ์ธ ์ฟผ๋ฆฌ๋ ์ธ๋ถ ์ฟผ๋ฆฌOuter query๋ก ์ง์นญ๋ ์ ์๋ค.
์๋ธ ์ฟผ๋ฆฌ์ ํํ / ์คํ ์กฐ๊ฑด
SELECT ์ด
FROM ํ
์ด๋ธ
WHERE ์กฐ๊ฑด์ ( SELECT ์ด
FROM ํ
์ด๋ธ
WHERE ์กฐ๊ฑด์ )
(1) ๋ฐ๋์ ๊ดํธ์ ๊ฐ์ธ์ง ํํ๋ก ์ฐ์ธ๋ค.
(2) SELECT๋ฌธ์ ํํ๋ก๋ง ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
(3) ์ฟผ๋ฆฌ์ ๋์์ ;์ธ๋ฏธ ์ฝ๋ก ์ ์ฌ์ฉํ ์ ์๋ค.
(4) ORDER BY์ ์ ์ฝ์ ํ ์ ์๋ค.
์๋ธ ์ฟผ๋ฆฌ์ ํน์ง
(1) ๋น๊ต ํน์ ์กฐํ์ ๋์์ด ๋ ๋ ์กฐํ ๋์์ ์ค๋ฅธ์ชฝ์ ๋์ธ๋ค.
(2) ๋ฉ์ธ ์ฟผ๋ฆฌ์์ ๋น๊ต๋ฅผ ์ํด ์กด์ฌํ๋ ์ฟผ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ ์๋ธ ์ฟผ๋ฆฌ์ SELECT ์ ์ ๋ฉ์ธ ์ฟผ๋ฆฌ์ ๋น๊ต ๋์๊ณผ ๊ฐ์ ์๋ฃํ๊ณผ ๊ฐ์ ๊ฐ์๋ก ์ง์ ๋ผ์ผ ํ๋ค.
(3) ๊ฒฐ๊ณผ๊ฐ ์ญ์ ๋ฉ์ธ ์ฟผ๋ฆฌ์ ์ฐ์ฐ์ ์ข ๋ฅ์ ๋์ผํด์ผ ํ๋ค.
(4) ๋ฉ์ธ ์ฟผ๋ฆฌ์์ ๊ด๊ณ๋ ๋จ๋ฐฉํฅ์ด๋ค. ์ด๋ Java ๊ฐ์ฒด์งํฅ์ ์์๊ณผ๋ ์ ์ฌํ ํํ์ธ๋ฐ, ์์๋นํ ์์ ๊ฐ์ฒด๋ ๋ถ๋ชจ ๊ฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง ๋ถ๋ชจ๋ ์์ ๊ฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ ํน์ง์ด ์๋ค.
(5) ๊ตฌ์กฐํ๋ฅผ ํตํด ์ฟผ๋ฆฌ์ ๊ฐ ๋ถ๋ถ์ ๊ฐ๋ ์ฑ ์๊ณ ๋ช ํํ๊ฒ ๋ณผ ์ ์๊ฒ ํด ์ค๋ค.
(6) ์์ ํน์ง ๋๋ฌธ์, ๋ณต์กํ JOIN๊ณผ UNION์ ๋ช ๋ฃํ๊ฒ ์ ๋ฆฌํ ์ ์๋ ๋์ฒด์ฌ๋ก ๊ธฐ๋ฅํ ์ ์๋ค.
์๋ธ ์ฟผ๋ฆฌ์ ์ฌ์ฉ์ฒ
(1) SELECT ์ ์์ ์ฌ์ฉ / ์ค์นผ๋ผ ์๋ธ ์ฟผ๋ฆฌScalar Subquery
(2) FROM ์ ์์ ์ฌ์ฉ / ์ธ๋ผ์ธ ๋ทฐInline View
(3) WHERE ์ ์์ ์ฌ์ฉ / ์ค์ฒฉ ์๋ธ ์ฟผ๋ฆฌNested Subquery
(4) HAVING ์ ์์ ์ฌ์ฉ
(5) ORDER BY ์ ์์ ์ฌ์ฉ
(6) INSERT๋ฌธ์ VALUES ๊ฐ ๋์ฒด์ฌ๋ก์จ ์ฌ์ฉ
(7) UPDATE๋ฌธ์ SET ๊ฐ ๋์ฒด์ฌ๋ก์จ ์ฌ์ฉ
์๋ธ์ฟผ๋ฆฌ์ ์ฌ์ฉ
์ด๋ฒ ํฌ์คํธ์์๋ ์๋ธ ์ฟผ๋ฆฌ์ ์ฌ์ฉ์ฒ ์ค SELECT, FROM, WHERE์ ์์ ์ฐ์ด๋ ๊ฒฝ์ฐ, ์ฆ ์ค์นผ๋ผ ์๋ธ ์ฟผ๋ฆฌ, ์ธ๋ผ์ธ ๋ทฐ, ์ค์ฒฉ ์๋ธ ์ฟผ๋ฆฌ์ ๋ํด ์์๋ณธ๋ค.
SELECT์ , ์ค์นผ๋ผ ์๋ธ ์ฟผ๋ฆฌScalar Subquery
ใ
ก์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ(Scalar Subquery)
์ ๋๋ฆฌ ๊ธ์ฌ์ ํ
์ด๋ธ ์ ์ฒด ํ๊ท ๊ธ์ฌ๋ฅผ ๊ตฌํ์์ค.
SELECT name
, salary
, (SELECT ROUND(AVG(salary), -1) FROM employee) AS ํ๊ท ๊ธ์ฌ
FROM employee
WHERE name = '์ ๋๋ฆฌ';
์ค์นผ๋ผ ์๋ธ ์ฟผ๋ฆฌ๋ SELECT์ ์์ ๋ํ๋๋ ์๋ธ ์ฟผ๋ฆฌ๋ค. ๋ค๋ฅธ ํ ์ด๋ธ์์ ์ด๋ ํ ๊ฐ์ ๋ถ๋ฌ์ฌ ๋ ์ฃผ๋ก ์ฐ์ด๋ฉฐ, '์ค์นผ๋ผ'๋ผ๋ ์ด๋ฆ์์ ๋ณด์ฌ์ง๋ฏ ๋จ์ผ ๊ฐ๋ง์ ๊ฐ์ ธ์ฌ ์ ์๋ค. ํด๋น ์๋ธ ์ฟผ๋ฆฌ๋ ์ผ์นํ๋ ๊ฐ์ด ์๋ค๋ฉด NULL์ ๋ฆฌํดํ๋ค(ํด๋น ๋ถ๋ถ์ ๊ทธ๋ฃน ํจ์์ ํน์ง์ด๊ธฐ๋ ํ๋ค.).
FROM์ , ์ธ๋ผ์ธ ๋ทฐInline View
ใ
ก์ธ๋ผ์ธ ๋ทฐ(Inline View)
์ง๊ธ์ด ์ฌ์์ธ ์ฌ๋๋ค์ ์ด๋ฆ๊ณผ ๊ธ์ฌ๋ฅผ ๊ตฌํ์์ค.
SELECT ex1.name
, ex1.salary
FROM (SELECT * FROM employee li
WHERE li.office_worker= '์ฌ์') ex1;
์ธ๋ผ์ธ ๋ทฐ๋ FROM ์ ์์ ๋ํ๋๋ ์๋ธ ์ฟผ๋ฆฌ๋ค. ํน์ ํ ์ด๋ธ์์ ์ ์ฒด ๋ฐ์ดํฐ๊ฐ ์๋๋ผ ์ผ๋ถ ๋ฐ์ดํฐ๋ง ์ถ์ถํด ์ฐ๊ฒฐํ๊ณ ์ ํ ๋ ์ด๋ค. ํ ์๋ธ ์ฟผ๋ฆฌ์ ๋ฌ๋ฆฌ ๊ผญ ๋ณ์นญalias์ ์ง์ ํด ์ค์ผ์ง๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. ์ฐธ๊ณ ๋ก, WITH ๋ฌธ์ ์ฌ์ฉํด๋ ๊ฒฐ๊ณผ๋ฌผ์ ๋์ผํ๊ธฐ ๋๋ฌธ์ ์์ ๋ง๋ ๊ฒ์ ์ทจ์ฌ์ ํํด ์ฐ๋ฉด ๋๋ค.
WITH
[๋ณ์นญ1] AS (SELECT๋ฌธ 1),
[๋ณ์นญ2] AS (SELECT๋ฌธ 2),
...,
[๋ณ์นญN] AS (SELECT๋ฌธ N)
SELECT
FROM ๋ณ์นญ1, ๋ณ์นญ2, ..., ๋ณ์นญN
WHERE์ , ์ค์ฒฉ ์๋ธ ์ฟผ๋ฆฌNested Subquery
ใ
กNested Subquery - ๋จ์ผ ํ
์ ๋๋ฆฌ๋ผ๋ ์ฌ๋์ ์ง๊ธ์ ๊ตฌํ์์ค.
SELECT office_worker
FROM employee
WHERE office_worker = (SELECT office_worker FROM employee WHERE name = '์ ๋๋ฆฌ')
ใ
กNested Subquery - ๋ณต์(๋ค์ค) ํ
์ ๋๋ฆฌ๋ณด๋ค ๊ธ์ฌ๊ฐ ๋์ ์ฌ๋๋ค์ ๊ตฌํ์์ค.
SELECT *
FROM employee
WHERE salary > (SELECT salary FROM employee WHERE name = '์ ๋๋ฆฌ')
์ง๊ธ์ด ์ฌ์์ธ ์ฌ๋๋ค์ ๊ตฌํ์์ค.
SELECT *
FROM employee
WHERE office_worker IN (SELECT office_worker FROM employee WHERE office_worker = '์ฌ์')
WHERE์ ์์ ๋ํ๋๋ ์๋ธ ์ฟผ๋ฆฌ๋ ์ค์ฒฉ ์๋ธ ์ฟผ๋ฆฌ๋ผ ๋ถ๋ฅธ๋ค. ์คํ ๊ฒฐ๊ณผ์ ํ ์, ์ด ์์ ๋ฐ๋ผ ๋จ์ผ ํ ์๋ธ ์ฟผ๋ฆฌ, ๋ค์ค ํ ์๋ธ ์ฟผ๋ฆฌ, ๋ค์ค ์ด ์๋ธ ์ฟผ๋ฆฌ๋ก ๋๋๋ฉฐ ์ด๋ฒ ํฌ์คํธ์์๋ ์ค๋ฌด์์ ์ฃผ๋ก ์ฌ์ฉ๋๋ ๋จ์ผ ํ/ ๋ค์ค ํ ์๋ธ ์ฟผ๋ฆฌ๋ง ๋ค๋ฃฌ๋ค.
๋จ์ผ ํ ์๋ธ ์ฟผ๋ฆฌ๋ >, >=, =, <=, <, <>, ^=, != ๋ฑ์ ์ฐ์ฐ์์ ํจ๊ป ์ฐ์ด๋ฉฐ, ๋ค์ค ํ ์๋ธ ์ฟผ๋ฆฌ๋ IN, ANY, SOME, ALL, EXISTS ๋ฑ์ ์ฐ์ฐ์์ ํจ๊ป ์ฐ์ธ๋ค. ์ถ๋ ฅํ๋ ํ ์์ ์ฐ๊ฒฐ์ง์ด์, ์ ์๋ฅผ ๋จ์ผ ํ ์ฐ์ฐ์, ํ์๋ฅผ ๋ค์ค ํ ์ฐ์ฐ์๋ผ ๋ถ๋ฅด๊ธฐ๋ ํ๋ค.
IN : ํ๋๋ผ๋ ์ผ์นํ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด TRUE
ANY, SOME : ๋ง์กฑํ๋ ๊ฒฐ๊ณผ๊ฐ ํ๋ ์ด์์ด๋ฉด TRUE
ALL : ๊ฒฐ๊ณผ๊ฐ ๋ชจ๋ ๋ง์กฑํ๋ฉด TRUE
EXISTS : ๊ฒฐ๊ณผ๊ฐ ์กด์ฌํ๋ฉด TRUE (ํ์ด 1๊ฐ ์ด์์ด๋ฉด TRUE)
<IN> ๋ถ์๋ณ ์ต๊ณ ๊ธ์ฌ์ ๋์ผํ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์ ์ ๋ณด
SELECT *
FROM emp
WHERE sal IN (SELECT MAX(sal) FROM emp GROUP BY deptno);
<SOME> ๋ฑ๊ฐ ๋น๊ต ์ฐ์ฐ์(=)์ ANY, SOME์ ํจ๊ป ์ฌ์ฉํ๋ฉด IN ์ฐ์ฐ์์ ๊ฐ์ ๊ธฐ๋ฅ ์ํ
SELECT *
FROM emp
WHERE sal = SOME (SELECT MAX(sal) FROM emp GROUP BY deptno);
<ANY> ๋ฑ๊ฐ ๋น๊ต ์ฐ์ฐ์๊ฐ ์๋ ๋์ ๋น๊ต ์ฐ์ฐ์์ ANY๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด?
< ANY : ๋ถ์ 30 ์ค ์ต๋๊ฐ๋ณด๋ค ์ ์ ๊ธ์ฌ๋ฅผ ๊ฐ์ง ์ฌ์์ ์ฐพ๊ฒ ๋จ
> ANY : ๋ถ์ 30 ์ค ์ต์๊ฐ๋ณด๋ค ๋์ ๊ธ์ฌ๋ฅผ ๊ฐ์ง ์ฌ์์ ์ฐพ๊ฒ ๋จ
SELECT *
FROM emp
WHERE sal < ANY (SELECT sal FROM emp WHERE deptno = 30);
<ALL> ๋ถ์ 30 ์ค ์ต๋ ๊ธ์ฌ๋ณด๋ค ๋ ๋ง์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์ ์ถ๋ ฅ
SELECT *
FROM emp
WHERE sal > ALL (SELECT sal FROM emp WHERE deptno = 30);
<EXISTS> ๋ถ์50์ด ์์ผ๋ฉด EMP ์ ์ฒด ์ถ๋ ฅ
SELECT *
FROM emp
WHERE EXISTS (SELECT dname FROM dept WHERE deptno = 50);
์ถ์ฒ
java์ ๊ฐ๋ฐ์ผ๊ธฐ ๋ธ๋ก๊ทธ