[์๋ธ์ฟผ๋ฆฌ SubQuery ๊ฐ๋
]
ํ๋์ ์ฟผ๋ฆฌ ์์ ๋ ๋ค๋ฅธ ํ๋์ ์ฟผ๋ฆฌ๊ฐ ๋ด๊ฒจ ์๋ ๊ฒ
ex) ์ฌ๋ฌ๊ฐ์ง ์กฐ๊ฑด์ด ํ๋ฒ์ ๋์ฌ๋ ๋น ๋ฅธ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํจ
SELECT select_list
FROM ํ
์ด๋ธ or ๋ทฐ
WHERE ์กฐ๊ฑด์ฐ์ฐ์ (SELECT select_list
FROM TABLE
WHERE ์กฐ๊ฑด);
* ์๋ธ์ฟผ๋ฆฌ๊ฐ ๋จผ์ ์ํ๋๊ณ ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ ๋ฉ์ธ์ฟผ๋ฆฌ๋ก ์ ํด์ค๋ค. (๋ฉ์ธ์ฟผ๋ฆฌ๊ฐ ๋จผ์ ์คํ๋ ๋๋ ์๋ค)
* ์๋ธ์ฟผ๋ฆฌ์ ์์น์ ๋ฐ๋ฅธ ์ด๋ฆ
SELECT (์๋ธ์ฟผ๋ฆฌ) <- 1ํ๋ง ๋ฐํ ์ ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ
FROM (์๋ธ์ฟผ๋ฆฌ) <- ์ธ๋ผ์ธ ๋ทฐ
WHERE (์๋ธ์ฟผ๋ฆฌ) <- ์๋ธ์ฟผ๋ฆฌ
* ์๋ธ์ฟผ๋ฆฌ ์ฃผ์์ฌํญ
WHERE์ ์ฐ์ฐ์ ์ค๋ฅธ์ชฝ์ ์์นํ๊ณ ๋ฐ๋์ ๊ดํธ๋ก ๋ฌถ๋๋ค.
ํน๋ณํ ๊ฒฝ์ฐ ์ ์ธ, ORDER BY ์ ์ด ์ฌ ์ ์๋ค.
๋จ์ผํ / ๋ค์คํ์ ๋ฐ๋ผ ์ฐ์ฐ์ ์ ํ์ด ์ค์ํ๋ค.
[๋จ์ผํ SubQuery]
๊ฒฐ๊ณผ๊ฐ์ด 1ํ๋ง ์ถ๋ ฅ๋๋ ๊ฒ
- = ๊ฐ๋ค
- <> ๊ฐ์ง์๋ค
- > ํฌ๋ค
- >= ํฌ๊ฑฐ๋ค ๊ฐ๋ค
- < ์๋ค
- <= ์๊ฑฐ๋ ๊ฐ๋ค
[๋ค์คํ SubQuery]
๊ฒฐ๊ณผ๊ฐ์ด 2๊ฑด ์ด์ ์ถ๋ ฅ๋๋ ๊ฒ
* ๋จ์ผํ ์ฐ์ฐ์ ์ฌ์ฉ ๋ถ๊ฐ !!
- IN ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ๊ฐ์ ๊ฐ ์ฐพ๊ธฐ
- EXISTS ์๋ธ์ฟผ๋ฆฌ ๊ฐ์ด ์์ ๊ฒฝ์ฐ ๋ฉ์ธ์ฟผ๋ฆฌ ์คํ
- >ANY ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๊ฐ ์ค ์ต์๊ฐ ๋ฐํ
- <ANY ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๊ฐ ์ค ์ต๋๊ฐ ๋ฐํ
- <ALL ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๊ฐ ์ค ์ต์๊ฐ ๋ฐํ
- >ALL ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๊ฐ ์ค ์ต๋๊ฐ ๋ฐํ
[๋ค์ค์ปฌ๋ผ SubQuery]
์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ์ฌ๋ฌ ์ปฌ๋ผ์ธ ๊ฒฝ์ฐ
ex) ๊ธฐ๋ณธํค๋ฅผ ์ฌ๋ฌ์ปฌ๋ผ ํฉ์ณ์ ๋ง๋ค์์ ๊ฒฝ์ฐ ํ๋ฒ์ ๋น๊ต
[์ํธ์ฐ๊ด SubQuery]
๋ฉ์ธ์ฟผ๋ฆฌ ๊ฐ์ ์๋ธ์ฟผ๋ฆฌ์ ์ฃผ๊ณ , ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์คํํ ํ ๋ฉ์ธ์ฟผ๋ฆฌ๋ก ๋ฐํํด์ ์ํํ๋ ์๋ธ์ฟผ๋ฆฌ
์๋ก ์ฃผ๊ณ ๋ฐ๋ ํํ ! (์ฑ๋ฅ์ด ๋งค์ฐ ๋์จ)
ex) emp2 ํ ์ด๋ธ ์ง์ ์ค ์์ ์ ์ง๊ธ์ ํ๊ท ์ฐ๋ด๊ณผ ๊ฐ๊ฑฐ๋ ๋ง์ด ๋ฐ๋ ์ฌ๋๋ค์ ์ ๋ณด ์ถ๋ ฅ
[์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ Scalar Sub Query]
SELECT ์ ์ ์ค๋ ์๋ธ์ฟผ๋ฆฌ, ํ๋ฒ์ ๊ฒฐ๊ณผ๋ฅผ 1ํ์ฉ ๋ฐํํ๋ค.
* Outer Join ๊ณผ ๋์ผํ๋ค. ์กฐ์ธ ์ปฌ๋ผ ๊ธฐ์ค, ์ค๋ณต๋ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ๋ง ( FROM ์ ๋ก ๋ด๋ฆฌ๋ฉด ๊ฐ์ ๊ฒฐ๊ณผ ๋์ผ)
* ๋ฐ์ดํฐ ์์ด ์ ์ ๊ฒฝ์ฐ JOIN ๋ณด๋ค , ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ๊ฐ ์๋๊ฐ ๋น ๋ฅด๋ค.
* ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด๋๊ณ ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ด๋ผ ๋น ๋ฅด๋ค. (ํ์ง๋ง ๋ฐ์ดํฐ๊ฐ ๋ง์์ง๋ฉด ์คํ๋ ค ์ค๋๊ฑธ๋ฆผ)
[ WITH ์ ์๋ธ์ฟผ๋ฆฌ ]
ํ ์ด๋ธ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ทฐ์ฒ๋ผ ๊ฐ์ ํ ์ด๋ธ๋ก ์์ฑ์ํจ ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ธฐ๋ฒ
*๋ฐ๋ณต์ํ์ฟผ๋ฆฌ๋ฅผ ํ๋ฒ๋ง ์ํํด์ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ณต ์ฌ์ฉํ๋ค. ์ผ๋ฐ์ ์ธ ์๋ธ์ฟผ๋ฆฌ๋ณด๋ค ํจ์จ์ด ์ข์.
[ Exists ์ฐ์ฐ์, IN ์ฐ์ฐ์ ์๋ธ์ฟผ๋ฆฌ]
IN : ๋ค์คํ ์ฐ์ฐ์, ๋ด๋ถ์ ์ผ๋ก ์ค๋ณต ๊ฐ์ ์ ๊ฑฐํ๋ ๊ฒ DISTINCT ์ฐ์ฐ ํ๋ค.
EXISTS : ์กด์ฌ ์ฌ๋ถ ํ์ธ, ํ๋๋ผ๋ ์กด์ฌํ๋ฉด ๊ฒ์ํ์ง ์๊ณ ๋น ์ ธ๋์ด (์ธ๋ฏธ ์กฐ์ธ)
SELECT * FROM tab1 WHERE c1 IN (SELECT c1 FROM t2)
SELECT * FROM t1 WHERE EXISTS (SELECT 1 FROM t2 WHERE t2.c1 = t1.c1)
* ๋๊ฐ๋ ๊ฒฐ๊ณผ๊ฐ์ ๊ฐ์ง๋ง ๋ค๋ฅธ ๋ฉ์ปค๋์ฆ์ด๋ค.
[ ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ NULL ์ฒ๋ฆฌ ์ฃผ์ ]
ํด๋น ๊ฐ์ด ์์ ๋ NULL ์ฒ๋ฆฌ์ ์ฌ์ํ ์ค์๋ฅผ ํ๊ฒ ๋๋ ๊ฒฝ์ฐ
SELECT name,(SELECT NVL(dname,'## not belog to a Dept..')
FROM dept2 d
WEHRE e.deptno = d.dcode) "DNAME"
FROM em2 e;
[ ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ ์ฑ๋ฅ ํฅ์ ]
์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ์ ์กฐ์ธ๋๋ ์ปฌ๋ผ์ ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด ๋นํจ์จ์ ์ด๊ฒ ๋๋ค. (full table scan)
CREATE INDEX IX_ORDER_T_01 ON ORDER_T (CUST_NO);
* ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ ์กฐ์ธ ์ปฌ๋ผ์ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ค. => ๋ฐฐ์ฐ ๋นจ๋ผ์ง๋ค.