์ž๊ฒฉ์ฆ/SQLD

[SQL ๊ธฐ๋ณธ] ์„œ๋ธŒ์ฟผ๋ฆฌ

_silver 2025. 11. 9. 14:14

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 = ('a', 'b') 
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)์—์„œ ์—ฐ์‚ฐ์ž ์„ ํƒ์‹œ ์ฃผ์˜