[MySQL] SubQuery

Hunie_07ยท2026๋…„ 2์›” 11์ผ

SQL

๋ชฉ๋ก ๋ณด๊ธฐ
12/18
post-thumbnail

๐Ÿ“Œ SubQuery (์„œ๋ธŒ์ฟผ๋ฆฌ)

  • ํ•˜์œ„์งˆ์˜(๋ถ€์†์งˆ์˜)
  • ํ•˜๋‚˜์˜ SQL๋ฌธ ์•ˆ์— SQL๋ฌธ์ด ์ค‘์ฒฉ(nested)๋˜์–ด ์žˆ๋Š” ๊ตฌ์กฐ
  • ์งˆ์˜๋ฅผ 1์ฐจ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ ๋ฐ˜ํ™˜ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์ดˆ๋กœ ๋‹ค์Œ ์งˆ์˜๋ฅผ ์ˆ˜ํ–‰
  • ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋กœ ํ˜„์žฌ ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ฐพ๊ฑฐ๋‚˜ ๊ฐ€๊ณตํ• ๋•Œ ์‚ฌ์šฉ

์„œ๋ธŒ์ฟผ๋ฆฌ ์—ฐ์‚ฐ์ž

  • WHERE ์ ˆ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์—ฐ์‚ฐ์ž

  • ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•˜๋Š” ์กฐ๊ฑด์ด๋‚˜ ์ˆ ์–ด ๊ฐ™์ด ์‚ฌ์šฉ

  • ์—ฐ์‚ฐ์ž ์ข…๋ฅ˜

    1) ๋น„๊ต: =, !=, >, <, >=, <=

    • ๋‹จ์ผํ–‰์œผ๋กœ ๋ฐ˜ํ™˜

    2) ์ง‘ํ•ฉ: IN, NOT IN

    • ๋‹ค์ค‘ํ–‰์œผ๋กœ ๋ฐ˜ํ™˜

    3) ์กด์žฌ: EXISTS, NOT EXISTS

    • ๋‹ค์ค‘ํ–‰์œผ๋กœ ๋ฐ˜ํ™˜

    4) ํ•œ์ •: ALL(๋ชจ๋‘), ANY(์ตœ์†Œ ํ•˜๋‚˜๋ผ๋„)

    • ๋‹ค์ค‘ํ–‰์œผ๋กœ ๋ฐ˜ํ™˜

0๏ธโƒฃ ์‚ฌ์šฉ ๋ฐ์ดํ„ฐ

bookbookclient
booksalepublisher

1๏ธโƒฃ ๋‹จ์ผ ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ

  • ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ ๊ฐ’์ด ๋‹จ์ผ ํ–‰(ํŠœํ”Œ)์ธ ๊ฒฝ์šฐ
  • '=' ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ
  • =, !=, >, <, >=, <=
main query
	WHERE ์กฐ๊ฑด์ ˆ = (sub query)

Ex) 'ํ˜ธ๋‚ ๋‘' ๊ณ ๊ฐ์˜ ์ด ์ฃผ๋ฌธ๋Ÿ‰ ์กฐํšŒ

  • booksale ํ…Œ์ด๋ธ”์—๋Š” ๊ณ ๊ฐ์ด๋ฆ„(clientName) ์—†์ด ๊ณ ๊ฐ๋ฒˆํ˜ธ(clientNo) ๋งŒ ์žˆ๊ธฐ์— bookclient์—์„œ 'ํ˜ธ๋‚ ๋‘' ๊ณ ๊ฐ์ด๋ฆ„์— ํ•ด๋‹นํ•˜๋Š” clientNo์„ ์ฐพ์•„ WHERE ์ ˆ์—์„œ booksale์˜ 'ํ˜ธ๋‚ ๋‘' clientNo์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.
-- ํ˜ธ๋‚ ๋‘ ๊ณ ๊ฐ์˜ ์ด์ฃผ๋ฌธ๋Ÿ‰ ์กฐํšŒ
SELECT sum(BS.bsQty) AS '์ด์ฃผ๋ฌธ๋Ÿ‰'
	FROM bookdb.booksale BS
    WHERE BS.clientNo = (SELECT BC.clientNo
							FROM bookdb.bookclient BC
                            WHERE BC.clientName = 'ํ˜ธ๋‚ ๋‘');

2๏ธโƒฃ ๋‹ค์ค‘ ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ

  • ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ ๊ฐ’์ด ์—ฌ๋Ÿฌ ํ–‰์ธ ๊ฒฝ์šฐ
    • IN, ANY, ALL, EXISTS ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ

1) IN, NOT IN

Ex) ๋„์„œ๋ฅผ ๊ตฌ๋งคํ•œ ์ ์ด ์žˆ๋Š” ๊ณ ๊ฐ๋ช… ์กฐํšŒ

  • booksale ํ…Œ์ด๋ธ”์ด ์ „์ฒด ๊ตฌ๋งค๋‚ด์—ญ์ด๊ธฐ์— ํ•ด๋‹น ํ…Œ์ด๋ธ”์— ์กด์žฌํ•˜๋Š” clientNo์ด bookclient ์•ˆ์—(IN) ์žˆ์œผ๋ฉด ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.
-- ๋„์„œ๋ฅผ ๊ตฌ๋งคํ•œ ์ ์ด ์žˆ๋Š” ๊ณ ๊ฐ๋ช… ์ถœ๋ ฅ
SELECT BC.clientNo, BC.clientName
	FROM bookdb.bookclient BC
	WHERE BC.clientNo IN (SELECT DISTINCT BS.clientNo 
							FROM bookdb.booksale BS);

2) Any, All

  • ๊ด€๊ณ„ ์—ฐ์‚ฐ์ž ๋’ค์— ์œ„์น˜
    • Any: ๊ฒ€์ƒ‰ ์กฐ๊ฑด์ด ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ ์ค‘์—์„œ ํ•˜๋‚˜๋ผ๋„ ๋งŒ์กฑํ•˜๋ฉด ์ฐธ
    • All: ๊ฒ€์ƒ‰ ์กฐ๊ฑด์ด ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ์˜ ๋ชจ๋“  ๊ฐ’์— ๋งŒ์กฑํ•˜๋ฉด ์ฐธ
      ( = ํ•˜๋‚˜๋ผ๋„ ๋งŒ์กฑํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฑฐ์ง“)

Ex) 2๋ฒˆ ๊ณ ๊ฐ์ด ์ฃผ๋ฌธํ•œ ๋„์„œ์˜ ์ตœ๊ณ  ์ฃผ๋ฌธ์ˆ˜๋Ÿ‰๋ณด๋‹ค ๋” ๋งŽ์€ ๋„์„œ๋ฅผ ๊ตฌ์ž…ํ•œ ๊ณ ๊ฐ์˜ ์ •๋ณด ์กฐํšŒ

  • ์‚ฌ์‹ค max() ์ง‘๊ณ„ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋˜์ง€๋งŒ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ALL ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 2๋ฒˆ ๊ณ ๊ฐ์ด ์ฃผ๋ฌธํ•œ bsQty ๋ฐ์ดํ„ฐ๋“ค๋ณด๋‹ค ๋ชจ๋‘ ํฐ bsQty ๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

  • clientNo 2๋ฒˆ ๊ณ ๊ฐ์ด ์ฃผ๋ฌธํ•œ ์ฃผ๋ฌธ์ˆ˜๋Ÿ‰(bsQty) ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

SELECT BS.bsQty FROM bookdb.booksale BS WHERE BS.clientNo = '2'
  • ์—ฌ๊ธฐ์„œ ALL ์„ ์ ์šฉํ•˜๋ฉด bsQty ๊ฐ€ 2 ์™€ 5 ๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๊ฒŒ ๋œ๋‹ค.
-- 2๋ฒˆ ๊ณ ๊ฐ์ด ์ฃผ๋ฌธํ•œ ๋„์„œ์˜ ์ตœ๊ณ  ์ฃผ๋ฌธ์ˆ˜๋Ÿ‰๋ณด๋‹ค ๋” ๋งŽ์€ ๋„์„œ๋ฅผ ๊ตฌ์ž…ํ•œ ๊ณ ๊ฐ์˜ ๊ณ ๊ฐ๋ฒˆํ˜ธ, ์ฃผ๋ฌธ๋ฒˆํ˜ธ, ์ฃผ๋ฌธ์ˆ˜๋Ÿ‰ ์ถœ๋ ฅ
SELECT BS.clientNo, BS.bsNo, BS.bsQty
	FROM bookdb.booksale BS
    WHERE BS.bsQty > ALL (SELECT BS.bsQty FROM bookdb.booksale BS WHERE BS.clientNo = '2');

3๏ธโƒฃ ์„œ๋ธŒ์ฟผ๋ฆฌ ์œ ํ˜•

1) ์Šค์นผ๋ผ(Scalar) ์„œ๋ธŒ์ฟผ๋ฆฌ

  • SELECT์ ˆ์— ์‚ฌ์šฉ
  • ๊ฒฐ๊ณผ ๊ฐ’์„ ๋‹จ์ผ ์ปฌ๋Ÿผ์˜ ์Šค์นผ๋ผ ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜
  • ์Šค์นผ๋ผ ๊ฐ’์ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ณณ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • SELECT๋ฌธ๊ณผ UPDATE SET๋ฌธ์— ์‚ฌ์šฉ
  • booksale ํ…Œ์ด๋ธ”์˜ clientNo ์„ bookClient ํ…Œ์ด๋ธ”๊ณผ ๋น„๊ตํ•˜์—ฌ clientName ์„ SELECT ํ•ด ์ด๋ฅผ AS ๊ณ ๊ฐ๋ช… ์œผ๋กœ ์ง€์ •ํ•˜์˜€๋‹ค.
  • ๊ฐ clientNo ์— ํ•ด๋‹นํ•˜๋Š” clientName ์€ ํ•˜๋‚˜์˜ ๊ฐ’์ธ ์Šค์นผ๋ผ ๊ฐ’์ด๊ธฐ์— SELECT ๋ฌธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
SELECT clientNo AS '๊ณ ๊ฐ๋ฒˆํ˜ธ', 
		(SELECT clientName 
		 FROM bookClient 
		 WHERE bookClient.clientNo = bookSale.clientNo) AS '๊ณ ๊ฐ๋ช…',
         sum(bsQty) AS '์ด์ฃผ๋ฌธ์ˆ˜๋Ÿ‰'
FROM bookSale
GROUP BY clientNo;

- ์ถœ๋ ฅ


2) ์ธ๋ผ์ธ ๋ทฐ(Inline View) ์„œ๋ธŒ์ฟผ๋ฆฌ

  • FROM ์ ˆ์—์„œ ์‚ฌ์šฉ
  • ํ…Œ์ด๋ธ”๋ช… ๋Œ€์‹  ์ธ๋ผ์ธ ๋ทฐ ๋ถ€์†์งˆ์˜๋ฅผ ์‚ฌ์šฉ(๊ฐ€์ƒํ…Œ์ด๋ธ”)
  • ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋‹ค์ค‘ ํ–‰, ๋‹ค์ค‘์—ด์ด์–ด๋„ ์ƒ๊ด€X
  • ๊ฐ€์ƒ ๋ทฐ ํ˜•ํƒœ๋กœ ์ œ๊ณต
  • ๊ฐœ๋ฐœ ์ค‘์— ๋ทฐ๊ฐ€ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋ทฐ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๊ด€๋ฆฌํ•  ์–‘์ด ๋งŽ์•„ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ๋‚˜ ์„ฑ๋Šฅ์ƒ ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ
  • ๋„์„œ ๊ฐ€๊ฒฉ์ด 25,000์› ์ด์ƒ์ธ ๋„์„œ๋ผ๋Š” ์ „์ œ์กฐ๊ฑด์ด ์žˆ๊ธฐ์— WHERE book.price >= 25000 ๋กœ ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ FROM ์ ˆ์—์„œ ํ•„ํ„ฐ๋งํ•œ ๋ชจ์Šต์ด๋‹ค.
-- ๋„์„œ ๊ฐ€๊ฒฉ์ด 25000์› ์ด์ƒ์ธ ๋„์„œ์— ๋Œ€ํ•˜์—ฌ ๋„์„œ๋ณ„๋กœ 
-- ๋„์„œ๋ช…, ๋„์„œ๊ฐ€๊ฒฉ, ์ดํŒ๋งค์ˆ˜๋Ÿ‰, ์ดํŒ๋งค์•ก ์ถœ๋ ฅ (์ดํŒ๋งค์•ก์˜ ๋‚ด๋ฆผ์ฐจ์ˆœ)
SELECT B.bookName, B.bookPrice,
	   sum(bsQty) AS '์ด์ฃผ๋ฌธ๋Ÿ‰', 
       sum(bookPrice * bsQty) AS '์ดํŒ๋งค์•ก'
FROM (SELECT bookNo, bookName, bookPrice FROM book
	  WHERE bookPrice >= 25000) B, bookSale
WHERE B.bookNo = bookSale.bookNo
GROUP BY B.bookNo
ORDER BY ์ดํŒ๋งค์•ก DESC;

- ์ถœ๋ ฅ


3) ์ค‘์ฒฉ ์„œ๋ธŒ์ฟผ๋ฆฌ

  • WHERE ์ ˆ์— ์„œ๋ธŒ์ฟผ๋ฆฌ (๊ฒฐ๊ณผ๋ฅผ ํ•œ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ)
  • ๋ถ€์†์งˆ์˜ ๋˜๋Š” ํ•˜์œ„์งˆ์˜
  • ํ•œ ์งˆ์˜๋ฌธ ์•ˆ์— ๋‹ค๋ฅธ ์งˆ์˜๋ฌธ์ด ์ค‘์ฒฉ(nested)
  • ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋กœ ํ˜„์žฌ ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ฐพ๊ฑฐ๋‚˜ ๊ฐ€๊ณต ๋ชฉ์ 
  • clientName ์ด ํ™๊ธธ๋™ ์ธ ๊ณ ๊ฐ์˜ clientNo ๋ฅผ ์ฐพ์•„ bookSale ํ…Œ์ด๋ธ”์—์„œ bsQty ๊ฐ’์˜ ํ•ฉ๊ณ„๋ฅผ ๊ตฌํ•œ๋‹ค.
SELECT sum(bsQty)
	FROM bookSale
    WHERE clientNo = 
    	(SELECT clientNo FROM bookClient WHERE clientName = 'ํ™๊ธธ๋™');

0๊ฐœ์˜ ๋Œ“๊ธ€