๐Ÿ“ŒSQL ๋ฌธ๋ฒ• - ์„œ๋ธŒ์ฟผ๋ฆฌ(Subquery)

์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” SQL ์ฟผ๋ฆฌ ์•ˆ์— ๋˜ ๋‹ค๋ฅธ ์ฟผ๋ฆฌ๊ฐ€ ๋“ค์–ด์žˆ๋Š” ํ˜•ํƒœ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์„œ๋ธŒ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค.
avatar
2025.04.07
ยท
8 min read

4668

์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” SQL ์ฟผ๋ฆฌ ์•ˆ์— ๋˜ ๋‹ค๋ฅธ ์ฟผ๋ฆฌ๊ฐ€ ๋“ค์–ด์žˆ๋Š” ํ˜•ํƒœ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
'์ฟผ๋ฆฌ ์•ˆ์˜ ์ฟผ๋ฆฌ'๋กœ, ๋ณต์žกํ•œ ์กฐ๊ฑด์ด๋‚˜ ๊ณ„์‚ฐ์„ ๊น”๋”ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… ์„œ๋ธŒ์ฟผ๋ฆฌ๋ž€?

์„œ๋ธŒ์ฟผ๋ฆฌ(Subquery) ๋Š”
๋‹ค๋ฅธ SQL ๋ฌธ์žฅ ์•ˆ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ•˜์œ„ SELECT ๋ฌธ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

๋ณดํ†ต WHERE, FROM, SELECT ์ ˆ ์•ˆ์—์„œ ์‚ฌ์šฉ๋˜๊ณ ,
ํ•˜๋‚˜์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜, ์—ฌ๋Ÿฌ ํ–‰/์—ด์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ์–ด์š”.


๐Ÿ”น ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ์œ„์น˜

์œ„์น˜

์˜ˆ์‹œ ์„ค๋ช…

WHERE ์ ˆ

์กฐ๊ฑด์„ ์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ

FROM ์ ˆ

ํ…Œ์ด๋ธ”์ฒ˜๋Ÿผ ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉ

SELECT ์ ˆ

ํŠน์ • ์—ด์˜ ๊ฐ’์„ ์„œ๋ธŒ์ฟผ๋ฆฌ๋กœ ๊ณ„์‚ฐ

์˜ˆ์‹œ ๊ณตํ†ต ํ…Œ์ด๋ธ” ์„ค์ •

4669

๐Ÿ”ธ ๋‹จ์ผ ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ (์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ)

ํ•˜๋‚˜์˜ ๊ฐ’(์Šค์นผ๋ผ ๊ฐ’)์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ

SELECT name
FROM Customer
WHERE custid = (
  SELECT custid
  FROM Orders
  WHERE saleprice = 30000
);

๐Ÿ“Œ ํ•ด์„
โ€ข ์„œ๋ธŒ์ฟผ๋ฆฌ: saleprice๊ฐ€ 30000์ธ ์ฃผ๋ฌธ์˜ custid โ†’ 2 ๋ฐ˜ํ™˜
โ€ข ๋ฉ”์ธ์ฟผ๋ฆฌ: custid = 2์ธ ๊ณ ๊ฐ โ†’ ์ด์˜ํฌ


๐Ÿ”ธ ๋‹ค์ค‘ ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ

์—ฌ๋Ÿฌ ํ–‰์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ๋กœ, IN, ANY, ALL ๋“ฑ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ

--IN
SELECT name
FROM Customer
WHERE custid IN (
  SELECT custid
  FROM Orders
  WHERE saleprice >= 20000
);

๐Ÿ“Œ ํ•ด์„
๐Ÿ”น ์„œ๋ธŒ์ฟผ๋ฆฌ: Orders ํ…Œ์ด๋ธ”์—์„œ saleprice >= 20000 ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ชจ๋“  custid ๋ฐ˜ํ™˜ (โ†’ 2)
๐Ÿ”น ๋ฉ”์ธ์ฟผ๋ฆฌ: Customer ํ…Œ์ด๋ธ”์—์„œ ํ•ด๋‹น custid๋ฅผ ๊ฐ€์ง„ name ์ถ”์ถœ (โ†’ ์ด์˜ํฌ)


๐Ÿ”ธ ๋‹ค์ค‘ ์—ด ์„œ๋ธŒ์ฟผ๋ฆฌ

๋‘ ๊ฐœ ์ด์ƒ์˜ ์ปฌ๋Ÿผ(์—ด)์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ

SELECT *
FROM Orders
WHERE (custid, saleprice) IN (
  SELECT custid, saleprice
  FROM Orders
  WHERE saleprice >= 20000
);

๐Ÿ“Œ ํ•ด์„
๐Ÿ”น ์„œ๋ธŒ์ฟผ๋ฆฌ: Orders ํ…Œ์ด๋ธ”์—์„œ saleprice >= 20000์ธ ํ–‰์˜ custid, saleprice ํŠœํ”Œ ๋ฐ˜ํ™˜
๐Ÿ”น ๋ฉ”์ธ์ฟผ๋ฆฌ: Orders ํ…Œ์ด๋ธ”์—์„œ ํ•ด๋‹น (custid, saleprice) ์Œ์ด ์กด์žฌํ•˜๋Š” ํ–‰ ์ถœ๋ ฅ (โ†’ 2,25000 ๋ฐ 2,30000 ํฌํ•จ)


๐Ÿ”ธ ์ƒ๊ด€ ์„œ๋ธŒ์ฟผ๋ฆฌ (Correlated Subquery)

๋ฉ”์ธ ์ฟผ๋ฆฌ์˜ ํ–‰๋งˆ๋‹ค ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ๋ฐ˜๋ณต ์‹คํ–‰ํ•˜๋Š” ๊ตฌ์กฐ

SELECT name
FROM Customer C
WHERE EXISTS (
  SELECT *
  FROM Orders O
  WHERE O.custid = C.custid AND O.saleprice > 20000
);
  • ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ๋ฐ”๊นฅ ์ฟผ๋ฆฌ์˜ ๊ฐ’์„ ์ฐธ์กฐ

  • ์„ฑ๋Šฅ์— ์ฃผ์˜, ํ•„์š”ํ•  ๋•Œ๋งŒ ์‚ฌ์šฉ!

    ๐Ÿ“Œ ํ•ด์„
    โ€ข ๊ณ ๊ฐ๋งˆ๋‹ค ์ฃผ๋ฌธ์„ ์ฐพ์•„๋ณด๋ฉฐ 25000 ์ด์ƒ์ธ ์ฃผ๋ฌธ์ด ์กด์žฌํ•˜๋ฉด TRUE
    โ€ข ์ด์˜ํฌ๋Š” ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ฃผ๋ฌธ์ด ์žˆ์œผ๋ฏ€๋กœ ์ถœ๋ ฅ
    โ€ข ๊น€์ฒ ์ˆ˜, ๋ฐ•๋ฏผ์ˆ˜๋Š” ์ œ์™ธ๋จ
    ๐Ÿ”น ์„œ๋ธŒ์ฟผ๋ฆฌ: Orders ํ…Œ์ด๋ธ”์„ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ๋ฐ”๊นฅ์˜ Customer์˜ custid์— ํ•ด๋‹นํ•˜๋Š” ์ฃผ๋ฌธ ์ค‘ saleprice > 20000 ์กฐ๊ฑด์„ ํ™•์ธ
    ๐Ÿ”น ๋ฉ”์ธ์ฟผ๋ฆฌ: ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ฃผ๋ฌธ์ด ์กด์žฌํ•˜๋Š” ๊ณ ๊ฐ์˜ name๋งŒ ์ถœ๋ ฅ (โ†’ ์ด์˜ํฌ)


๐Ÿ”ธ EXISTS ์„œ๋ธŒ์ฟผ๋ฆฌ

์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ์กด์žฌํ•˜๋ฉด TRUE, ์•„๋‹ˆ๋ฉด FALSE

SELECT name
FROM Customer C
WHERE EXISTS (
  SELECT *
  FROM Orders O
  WHERE O.custid = C.custid
);
  • ๊ฒฐ๊ณผ์˜ ๋‚ด์šฉ์ด ์ค‘์š”ํ•œ ๊ฒŒ ์•„๋‹ˆ๋ผ, ์กด์žฌ ์—ฌ๋ถ€๋งŒ ํŒ๋‹จ!

    ๐Ÿ“Œ ํ•ด์„
    โ€ข custid๊ฐ€ Orders์— ์กด์žฌํ•˜๋ฉด ์ถœ๋ ฅ
    โ€ข ์ฃผ๋ฌธ ๊ธฐ๋ก์ด ์žˆ๋Š” ๊ณ ๊ฐ: ๊น€์ฒ ์ˆ˜(1), ์ด์˜ํฌ(2)
    โ€ข ์ฃผ๋ฌธ ์—†๋Š” ๋ฐ•๋ฏผ์ˆ˜(3)๋Š” ์ œ์™ธ๋จ


๐Ÿ“ฆ ์‹ค์ „ ์˜ˆ์ œ ์ •๋ฆฌ

-- ์ตœ๊ณ ๊ฐ€ ๋„์„œ๋ฅผ ์ฃผ๋ฌธํ•œ ๊ณ ๊ฐ ์ด๋ฆ„
SELECT DISTINCT name
FROM Customer C, Orders O, Book B
WHERE C.custid = O.custid AND O.bookid = B.bookid
AND B.price = (SELECT MAX(price) FROM Book);

-- ์ฃผ๋ฌธ์ด ์—†๋Š” ๊ณ ๊ฐ ์ฐพ๊ธฐ
SELECT name
FROM Customer C
WHERE NOT EXISTS (
  SELECT *
  FROM Orders O
  WHERE C.custid = O.custid
);

๐Ÿง  ๋งˆ๋ฌด๋ฆฌ

๊ตฌ๋ถ„

์„ค๋ช…

์‚ฌ์šฉ ํ‚ค์›Œ๋“œ

๋‹จ์ผ ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ

ํ•˜๋‚˜์˜ ๊ฐ’ ๋ฐ˜ํ™˜, ์กฐ๊ฑด๋ฌธ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ

=, >, <, != ๋“ฑ

๋‹ค์ค‘ ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ

์—ฌ๋Ÿฌ ํ–‰ ๋ฐ˜ํ™˜, ๋ชฉ๋ก ๋น„๊ต

IN, ANY, ALL

๋‹ค์ค‘ ์—ด ์„œ๋ธŒ์ฟผ๋ฆฌ

์—ฌ๋Ÿฌ ์ปฌ๋Ÿผ์„ ํŠœํ”Œ ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜

(A, B) IN (SELECT A, B)

์ƒ๊ด€ ์„œ๋ธŒ์ฟผ๋ฆฌ

๋ฐ”๊นฅ ์ฟผ๋ฆฌ์˜ ๊ฐ’์„ ์ฐธ์กฐํ•˜๋ฉฐ ํ–‰๋งˆ๋‹ค ๋ฐ˜๋ณต ์‹คํ–‰๋จ

๋ฐ”๊นฅ ์ฟผ๋ฆฌ์˜ ์ปฌ๋Ÿผ ์‚ฌ์šฉ

EXISTS ์„œ๋ธŒ์ฟผ๋ฆฌ

๊ฒฐ๊ณผ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€๋งŒ ํŒ๋‹จ (TRUE/FALSE)

EXISTS, NOT EXISTS

๐Ÿ“˜ ํ•™์Šต ํŒ
โ€ข ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋” ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.
โ€ข ๋‹จ์ผ ๊ฐ’์ธ์ง€, ์—ฌ๋Ÿฌ ํ–‰์ธ์ง€์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์—ฐ์‚ฐ์ž๋ฅผ ์จ์•ผ ํ•ด์š”.
โ€ข ์ƒ๊ด€ ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ๊ฐ€๋…์„ฑ ์ข‹์ง€๋งŒ ์„ฑ๋Šฅ ๋ถ€๋‹ด์ด ์žˆ์„ ์ˆ˜ ์žˆ์–ด์š”.







- ์ปฌ๋ ‰์…˜ ์•„ํ‹ฐํด