SQL subquery - swkim0128/PARA GitHub Wiki
์๋ธ์ฟผ๋ฆฌ๋ ๋ค๋ฅธ ์ฟผ๋ฆฌ ๋ด๋ถ์ ํฌํจ๋์ด ์๋ select ๋ฌธ์ ์๋ฏธํ๋ค.
์๋ธ ์ฟผ๋ฆฌ๋ฅผ ํฌํจํ๊ณ ์๋ ์ฟผ๋ฆฌ๋ฅผ ์ธ๋ถ ์ฟผ๋ฆฌ(outer query) ๋๋ ๋ฉ์ธ ์ฟผ๋ฆฌ๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ์๋ธ ์ฟผ๋ฆฌ๋ ๋ด๋ถ ์ฟผ๋ฆฌ(inner query)๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
์๋ธ ์ฟผ๋ฆฌ๋ ๋น๊ต ์ฐ์ฐ์์ ์ค๋ฅธ์ชฝ์ ๊ธฐ์ ํด์ผ ํ๊ณ ๋ฐ๋์ ๊ดํธ๋ก ๊ฐ์ธ์ ธ ์์ด์ผ๋ง ํ๋ค.
์ค์ฒฉ ์๋ธ ์ฟผ๋ฆฌ(Nested Subquery) where ๋ฌธ์ ์์ฑํ๋ ์๋ธ ์ฟผ๋ฆฌ
- ๋จ์ผ ํ
- ๋ณต์(๋ค์ค) ํ
- ๋ค์ค ์ปฌ๋ผ
์ธ๋ผ์ธ ๋ทฐ(inline view) - from ๋ฌธ์ ์์ฑํ๋ ์๋ธ ์ฟผ๋ฆฌ
์ค์นผ๋ผ ์๋ธ ์ฟผ๋ฆฌ (Sclalar subquery) - select ๋ฌธ์ ์์ฑํ๋ ์๋ธ ์ฟผ๋ฆฌ
์ฃผ์ ์ฌํญ
- ์๋ธ์ฟผ๋ฆฌ๋ ๋ฐ๋์ ()๋ก ๊ฐ์ธ์ผ ํ๋ค.
- ์๋ธ ์ฟผ๋ฆฌ๋ ๋จ์ผ ํ ๋๋ ๋ค์ค ํ ๋น๊ต ์ฐ์ฐ์์ ํจ๊ป ์ฌ์ฉ๋๋ค.
์๋ธ ์ฟผ๋ฆฌ๊ฐ ์ฌ์ฉ์ด ๊ฐ๋ฅํ ๊ณณ
- select
- from
- where
- having
- order by
- insert ๋ฌธ์ values
- update ๋ฌธ์ set
Nested Subquery - ๋จ์ผ ํ
- ์๋ธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ๋จ์ผํ์ ๋ฆฌํด.
Nested Subquery - ๋ค์ค ํ
-
์๋ธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ๋ค์คํ์ ๋ฆฌํด : IN
-
์๋ธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ๋ค์คํ์ ๋ฆฌํด : ANY
-
์๋ธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ๋ค์คํ์ ๋ฆฌํด : ALL
Nested Subquery - ๋ค์ค ์ด
-
์๋ธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ๋ค์ค์ด์ ๋ฆฌํด.
์ธ๋ผ์ธ ๋ทฐ(Inline View)
-
FROM ์ ์ ์ฌ์ฉ๋๋ ์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์ธ๋ผ์ธ ๋ทฐ(inline view) ๋ผ ํ๋ค.
-
์๋ธ ์ฟผ๋ฆฌ๊ฐ from์ ์ ์ฌ์ฉ๋๋ฉด ๋ทฐ(view)์ฒ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋์ ์ผ๋ก ์์ฑ๋ ํ ์ด๋ธ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
-
์์์ ์ธ ๋ทฐ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ ์ ์ฅ๋์ง ์๋๋ค.
-
๋์ ์ผ๋ก ์์ฑ๋ ํ ์ด๋ธ์ด๊ธฐ ๋๋ฌธ์ column์ ์์ ๋กญ๊ฒ ์ฐธ์กฐ ๊ฐ๋ฅ.
์ธ๋ผ์ธ ๋ทฐ(inline view) - TopN ์ง์
-
๋ชจ๋ ์ฌ์์ ์ฌ๋ฒ, ์ด๋ฆ, ๊ธ์ฌ๋ฅผ ์ถ๋ ฅ.
์ฌ์ ์ ๋ณด๋ฅผ ๊ธ์ฌ์์ผ๋ก ์ ๋ ฌ
ํ ํ์ด์ง๋น 5๋ช ์ด ์ถ๋ ฅ
ํ์ฌ ํ์ด์ง๊ฐ 3ํ์ด์ง๋ผ๊ณ ๊ฐ์ .
์ธ๋ผ์ธ ๋ทฐ(inline view) - limit ํ์ฉ (Mysql)
-
๋ชจ๋ ์ฌ์์ ์ฌ๋ฒ, ์ด๋ฆ, ๊ธ์ฌ๋ฅผ ์ถ๋ ฅ.
์ฌ์ ์ ๋ณด๋ฅผ ๊ธ์ฌ์์ผ๋ก ์ ๋ ฌ.
ํ ํ์ด์ง๋น 5๋ช ์ด ์ถ๋ ฅ
ํ์ฌ ํ์ด์ง๊ฐ 3ํ์ด์ง๋ผ๊ณ ๊ฐ์
์ค์นผ๋ผ ์๋ธ ์ฟผ๋ฆฌ (Scalar Subquery)
-
select ์ ์ ์๋ ์๋ธ ์ฟผ๋ฆฌ
-
ํ ๊ฐ์ ํ๋ง ๋ฐํ
์ง๊ธ ์์ด๋๊ฐ IT_PROG์ธ ์ฌ์์ ์ฌ๋ฒ, ์ด๋ฆ, ์ง๊ธ ์์ด๋, ๋ถ์์ด๋ฆ
60๋ฒ ๋ถ์์ ๊ทผ๋ฌดํ๋ ์ฌ์์ ์ฌ๋ฒ, ์ด๋ฆ, ๊ธ์ฌ, ๋ถ์๋ฒํธ, 60๋ฒ๋ถ์์ ํ๊ท ๊ธ์ฌ
์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํ create
-
employees table์ emp_copy๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ณต์ฌ(์ปฌ๋ผ ์ด๋ฆ ๋์ผ)
create table emp_copy select * from employees;
-
employees table์ ๊ตฌ์กฐ๋ง emp_blank๋ผ๋ ์ด๋ฆ์ผ๋ก ์์ฑ(์ปฌ๋ผ ์ด๋ฆ ๋์ผ)
create table emp_blank select * from employees where 1 = 0;
-
50 ๋ฒ ๋ถ์์ ์ฌ๋ฒ(eid), ์ด๋ฆ(name), ๊ธ์ฌ(sal), ๋ถ์๋ฒํธ(did)๋ง emp50์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ์์ฑ
์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํ insert
-
employees table์์ ๋ถ์๋ฒํธ๊ฐ 80์ธ ์ฌ์์ ๋ชจ๋ ์ ๋ณด๋ฅผ emp_blank์ insert.
์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํ update
-
employees table์ ๋ชจ๋ ์ฌ์์ ํ๊ท ๊ธ์ฌ๋ณด๋ค ์ ๊ฒ ๋ฐ๋ emp50 table์ ์ฌ์์ ๊ธ์ฌ๋ฅผ 500 ์ธ์.
์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํ delete
-
employees table์ ๋ชจ๋ ์ฌ์์ ํ๊ท ๊ธ์ฌ๋ณด๋ค ์ ๊ฒ ๋ฐ๋ emp50 table์ ์ฌ์์ ํด์ฌ.