• Feed
  • Explore
  • Ranking
/
/
    ๐Ÿ’พ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

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

    ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” SQL ์ฟผ๋ฆฌ ์•ˆ์— ๋˜ ๋‹ค๋ฅธ ์ฟผ๋ฆฌ๊ฐ€ ๋“ค์–ด์žˆ๋Š” ํ˜•ํƒœ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์„œ๋ธŒ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค.
    ์ก
    ์ก
    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

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







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