[SQL ๊ธฐ๋ณธ] ์๋ธ์ฟผ๋ฆฌ
1. ์๋ธ์ฟผ๋ฆฌ ์ ์
- ํ๋์ SQL ๋ฌธ์์ ํฌํจ๋์ด ์๋ ๋ ๋ค๋ฅธ SQL ๋ฌธ์ ๋งํจ.
- ์๋ธ์ฟผ๋ฆฌ๋ ๋ฐ๋์ ๊ดํธ๋ก ๋ฌถ์ด์ผ ํจ
- GROUP BY ์ ์ฌ์ฉ ๋ถ๊ฐ
2. ์๋ธ ์ฟผ๋ฆฌ ์ข ๋ฅ
1) ๋์ํ๋ ๋ฐฉ์์ ๋ฐ๋ผ
- ์ฐ๊ด ์๋ธ์ฟผ๋ฆฌ : ์๋ธ์ฟผ๋ฆฌ๊ฐ ๋ฉ์ธ์ฟผ๋ฆฌ ์ฐธ์กฐํ๊ณ ์์, ๋ฉ์ธ์ฟผ๋ฆฌ ์คํ๋ ๋ ๋ง๋ค ์ํ
SELECT *
FROM name n1
WHERE age =
(SELECT max(age)
FROM name n2
WHERE manage = n1.manage)
- ๋น์ฐ๊ด ์๋ธ์ฟผ๋ฆฌ : ๋ฉ์ธ์ฟผ๋ฆฌ์ ๋ ๋ฆฝ์ ์ํ, ์๋ธ์ฟผ๋ฆฌ ๋ ์์ ์คํ ๊ฐ๋ฅ(ํ๋ฒ๋ง)
* ๋ฉ์ธ ์ฟผ๋ฆฌ์ ๊ฐ ํ์ ๋ํด ์๋ธ ์ฟผ๋ฆฌ๊ฐ ์คํ๋จ.
SELECT *
FROM name
WHERE age =
(SELECT max(age)
FROM name)
2) ์์น์ ๋ฐ๋ผ
- ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ(SELECT ์ ์ฌ์ฉ)
- ์ธ๋ผ์ธ๋ทฐ(FROM ์ ์ฌ์ฉ)
- WHERE ์ ์๋ธ ์ฟผ๋ฆฌ
๐๏ธ WHERE ์ ์๋ธ ์ฟผ๋ฆฌ ์ข ๋ฅ
1. ๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ
- ์๋ธ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ 1๊ฐ์ ํ์ด ๋ฆฌํด ๋๋ ํํ
- ์ฐ์ฐ์ ์ข ๋ฅ
| ์ฐ์ฐ์ | ์๋ฏธ |
| = | ๊ฐ๋ค |
| <> | ๊ฐ์ง ์๋ค |
| > | ํฌ๋ค |
| >= | ํฌ๊ฑฐ๋ ๊ฐ๋ค |
| < | ์๋ค |
| <= | ์๊ฑฐ๋ ๊ฐ๋ค |
2. ๋ค์คํ ์๋ธ์ฟผ๋ฆฌ
- ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ์ฌ๋ฌ ํ์ด ๋ฆฌํด๋๋ ํํ
- ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํ๋๋ก ์์ฝํ๊ฑฐ๋ ๋ค์คํ ์๋ธ์ฟผ๋ฆฌ ์ฐ์ฐ์ ์ฌ์ฉ
- '=', '>', '<'์ ๊ฐ์ ๋น๊ต ์ฐ์ฐ์ ์ฌ์ฉ ๋ถ๊ฐ →
- ์ฐ์ฐ์ ์ข ๋ฅ
| ์ฐ์ฐ์ | ์๋ฏธ | ์์ |
| IN | ๊ฐ์ ๊ฐ ์ฐพ๊ธฐ | ENAME IN ('a', 'b') → a ๋๋ b ๊ฐ์ ์ฐพ์ |
| <ALL | >ANY | ์ต์๊ฐ ๋ฐํ | |
| >ALL | <ANY | ์ต๋๊ฐ ๋ฐํ | |
| EXISTS | ์๋ธ์ฟผ๋ฆฌ๊ฐ ํ๋ ์ด์์ ๊ฒฐ๊ณผ ๋ฐํ์ TRUE | |
| NOT EXISTS | ์๋ธ์ฟผ๋ฆฌ๊ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง ์์ผ๋ฉด TRUE |
๐๏ธ EXISTS | NOT EXISTS
1) EXISTS
- ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ํ๋๋ผ๋ ์กด์ฌํ๋ฉด ๋ฉ์ธ์ฟผ๋ฆฌ ์ถ๋ ฅ
2) NOT EXISTS (= NOT IN)
- ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด ๋ฉ์ธ์ฟผ๋ฆฌ ์ถ๋ ฅ
3. ๋ค์ค์ปฌ๋ผ ์๋ธ์ฟผ๋ฆฌ
- ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ์ฌ๋ฌ ์ปฌ๋ผ์ด ๋ฆฌํด๋๋ ํํ
- ๋ฉ์ธ์ฟผ๋ฆฌ์์ ๋น๊ต ์ปฌ๋ผ์ด 2๊ฐ ์ด์(์ปฌ๋ผ ๊ฐ์, ์์ ์ค์)
- ๋ฉ์ธ์ฟผ๋ฆฌ์ ์กฐ๊ฑด์ ์ ์ฌ๋ฌ ์ปฌ๋ผ์ ๋์ ๋น๊ต ๊ฐ๋ฅ
- ๋์ ๋น๊ต ์ ๋ฌ ๋ถ๊ฐ (ex. WHERE (sal, comm) > (2000, 0))
SELECT
FROM
WHERE (NAME, AGE) IN
(SELECT NAME, MAX(AGE)
FROM);
4. (์ํธ)์ฐ๊ด ์๋ธ์ฟผ๋ฆฌ
- ๋ฉ์ธ ์ฟผ๋ฆฌ์ ์๋ธ์ฟผ๋ฆฌ์ ๋น๊ต ์ํ
- ๋น๊ตํ ์ง๋จ์ด๋ ์กฐ๊ฑด์ ์๋ธ์ฟผ๋ฆฌ์์ ๋ช ์
๐๏ธ ์ธ๋ผ์ธ๋ทฐ(FROM ์ ์ฌ์ฉ)
- ์ฟผ๋ฆฌ ์์ ๋ทฐ์ ํํ๋ก ํ ์ด๋ธ์ฒ๋ผ ์กฐํํ ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๊ธฐ ์ํด ์ฌ์ฉ
- ํ ์ด๋ธ ๋ณ์นญ ๋ช ์ ํ์
- ๋ชจ๋ ์ฐ์ฐ์ ์ฌ์ฉ ๊ฐ๋ฅ
SELECT
FROM NAME N,
(SELECT MAX(AGE) AS MAX_AGE
FROM NAME) I
WHERE N.AGE = I.MAX_AGE;
# FROM ์ ์์ ์๋ ์๋ธ์ฟผ๋ฆฌ์ 'I' ์ ๊ฐ์ด ํ ์ด๋ธ๋ช ์ด ๋ฏธ์กด์ฌ ํ๊ธฐ ๋๋ฌธ์ ํ ์ด๋ธ ๋ณ์นญ ๋ช ์ ํ์
# MAX_AGE์ ๊ฐ์ด FROM ์ ์์ ๋ฏธ๋ฆฌ ๊ณ์ฐ ๋์ด ์์ผ๋ฏ๋ก ๊ทธ๋๋ก ์ ๋ฌํ์ฌ WHERE ์ ์์๋ ๋์ ๋น๊ต ๊ฐ๋ฅํด์ง
๐๏ธ ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ(SELECT ์ ์ฌ์ฉ)
- ํ๋์ ์ปฌ๋ผ์ฒ๋ผ ํํํ๊ธฐ ์ํด SELECT ์ ์ ์ฌ์ฉํ๋ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ๋งํจ
- ํ๊ฐ์ ํ, ํ๊ฐ์ ์ปฌ๋ผ(= ๋จ์ผ ํ ์๋ธ ์ฟผ๋ฆฌ ํํ)
- ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์กฐ์ธ ์ OUTER JOIN์ด ๊ธฐ๋ณธ์ผ๋ก ์ ์ฉ๋จ → ์ผ์นํ๋ ๋์์ด ์์ผ๋ฉด NULL ๋ฐํ
โญ๏ธ ์๋ธ์ฟผ๋ฆฌ ์ฃผ์ ์ฌํญ
- TOP-N ๋ถ์์ ์ ์ธํ๊ณ , ์๋ธ์ฟผ๋ฆฌ์ ORDER BY ์ ์ฌ์ฉ ๋ถ๊ฐ
- ๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ(=, <, >...)์ ๋ค์คํ ์๋ธ์ฟผ๋ฆฌ(IN, ANY, ALL)์์ ์ฐ์ฐ์ ์ ํ์ ์ฃผ์