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

    ๐Ÿ“ŒSQL ๋ฌธ๋ฒ• - UNION๊ณผ ์ง‘ํ•ฉ ์—ฐ์‚ฐ ํ™œ์šฉ๋ฒ•

    SQL์€ ๋‹จ์ˆœํžˆ ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ฒƒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์กฐํ•ฉํ•˜๊ฑฐ๋‚˜ ๋น„๊ตํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” SQL์˜ ์ง‘ํ•ฉ ์—ฐ์‚ฐ์ž๋“ค์„ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
    ์ก
    ์ก
    2025.04.07
    ยท
    9 min read

    4670

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


    โœ… ์ง‘ํ•ฉ ์—ฐ์‚ฐ์ด๋ž€?

    ๋‘ ๊ฐœ ์ด์ƒ์˜ SELECT ๊ฒฐ๊ณผ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ๊ฑฐ๋‚˜ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์—ฐ์‚ฐ์ž…๋‹ˆ๋‹ค.
    โ†’ ์ˆ˜ํ•™์—์„œ์˜ ํ•ฉ์ง‘ํ•ฉ, ๊ต์ง‘ํ•ฉ, ์ฐจ์ง‘ํ•ฉ ๊ฐœ๋…์„ SQL๋กœ ๊ตฌํ˜„ํ•œ ๊ฑฐ์˜ˆ์š”.


    โœด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ง‘ํ•ฉ ์—ฐ์‚ฐ์ž

    ์—ฐ์‚ฐ์ž

    ์˜๋ฏธ

    ์„ค๋ช…

    UNION

    ํ•ฉ์ง‘ํ•ฉ

    ๋‘ ๊ฒฐ๊ณผ๋ฅผ ํ•ฉ์ณ ์ค‘๋ณต ์ œ๊ฑฐ

    UNION ALL

    ํ•ฉ์ง‘ํ•ฉ (์ค‘๋ณต ํ—ˆ์šฉ)

    ๋‘ ๊ฒฐ๊ณผ๋ฅผ ํ•ฉ์ณ ์ค‘๋ณต๊นŒ์ง€ ๋ชจ๋‘ ํฌํ•จ

    INTERSECT

    ๊ต์ง‘ํ•ฉ

    ๋‘ ๊ฒฐ๊ณผ์— ๋ชจ๋‘ ํฌํ•จ๋˜๋Š” ๊ฐ’๋งŒ ๋ฐ˜ํ™˜

    EXCEPT

    ์ฐจ์ง‘ํ•ฉ

    ์ฒซ ๋ฒˆ์งธ ๊ฒฐ๊ณผ์—์„œ ๋‘ ๋ฒˆ์งธ ๊ฒฐ๊ณผ๋ฅผ ์ œ์™ธ

    MINUS

    ์ฐจ์ง‘ํ•ฉ (Oracle ์ „์šฉ)

    Oracle์—์„œ EXCEPT ๋Œ€์‹  ์‚ฌ์šฉ

    ๐Ÿ“Œ ์ฃผ์˜: ์ง‘ํ•ฉ ์—ฐ์‚ฐ์„ ์“ฐ๋ ค๋ฉด

    • SELECT ์ ˆ์˜ ์ปฌ๋Ÿผ ์ˆ˜์™€ ํƒ€์ž…์ด ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค!

    ์˜ˆ์‹œ ํ…Œ์ด๋ธ”

    ๐Ÿ—‚ Student_A ํ…Œ์ด๋ธ”

    name

    ๊น€์ฒ ์ˆ˜

    ์ด์˜ํฌ

    ๋ฐ•๋ฏผ์ˆ˜

    SELECT name FROM Student_A;

    ๐Ÿ—‚๏ธ Student_B ํ…Œ์ด๋ธ”

    name

    ์ด์˜ํฌ

    ์ •์˜ˆ๋ฆฐ

    ๋ฐ•๋ฏผ์ˆ˜

    SELECT name FROM Student_B;

    ๐Ÿ”— 1. UNION - ์ค‘๋ณต ์ œ๊ฑฐํ•œ ํ•ฉ์ง‘ํ•ฉ

    SELECT name FROM Student_A
    UNION
    SELECT name FROM Student_B;

    ๊ฒฐ๊ณผ name

    ๊น€์ฒ ์ˆ˜

    ์ด์˜ํฌ

    ๋ฐ•๋ฏผ์ˆ˜

    ์ •์˜ˆ๋ฆฐ

    ๐Ÿ“Œ ๋‘ SELECT ๊ฒฐ๊ณผ๋ฅผ ํ•ฉ์น˜๋˜, ์ค‘๋ณต์€ ์ œ๊ฑฐ


    ๐Ÿ”— 2. UNION ALL - ์ค‘๋ณต ํฌํ•จํ•œ ํ•ฉ์ง‘ํ•ฉ

    SELECT name FROM Student_A
    UNION ALL
    SELECT name FROM Student_B;

    ๊ฒฐ๊ณผ name

    ๊น€์ฒ ์ˆ˜

    ์ด์˜ํฌ

    ๋ฐ•๋ฏผ์ˆ˜

    ์ด์˜ํฌ

    ์ •์˜ˆ๋ฆฐ

    ๋ฐ•๋ฏผ์ˆ˜

    • ์ค‘๋ณต ํฌํ•จ โ†’ ๊ฐœ์ˆ˜๊นŒ์ง€ ํฌํ•จํ•œ ์ „์ฒด ํ•ฉ์ง‘ํ•ฉ

    • ์„ฑ๋Šฅ์ด ๋น ๋ฅด์ง€๋งŒ, ์ค‘๋ณต์„ ๊ฑธ๋Ÿฌ๋‚ด์ง€ ์•Š์œผ๋‹ˆ ์‚ฌ์šฉ ์‹œ ์ฃผ์˜๊ฐ€ ํ•„์š”


    ๐Ÿ”— 3. INTERSECT - ๊ต์ง‘ํ•ฉ

    SELECT name FROM Student_A
    INTERSECT
    SELECT name FROM Student_B;

    ๊ฒฐ๊ณผ name

    ์ด์˜ํฌ

    ๋ฐ•๋ฏผ์ˆ˜

    • ๋‘ ํ…Œ์ด๋ธ” ๋ชจ๋‘์— ์žˆ๋Š” ๊ณตํ†ต ์ด๋ฆ„๋งŒ ์ถœ๋ ฅ

    • ๊ณตํ†ต๋œ ํ–‰๋งŒ ์ถ”์ถœํ•˜๋ฏ€๋กœ, ์–ด๋–ค ๊ฐ’์ด ์–‘์ชฝ์— ์žˆ๋Š”์ง€ ํ™•์ธํ•  ๋•Œ ์œ ์šฉ

    • ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ DB: PostgreSQL, SQL Server, Oracle

    • โ— MySQL์—์„œ๋Š” ์ง€์›ํ•˜์ง€ ์•Š์Œ


    ๐Ÿ”— 4. EXCEPT / MINUS - ์ฐจ์ง‘ํ•ฉ

    -- PostgreSQL / SQL Server
    SELECT name FROM Student_A
    EXCEPT
    SELECT name FROM Student_B;
    
    -- Oracle
    SELECT name FROM Student_A
    MINUS
    SELECT name FROM Student_B;

    ๊ฒฐ๊ณผ name

    ๊น€์ฒ ์ˆ˜

    • Student_A์—๋Š” ์žˆ์ง€๋งŒ Student_B์—๋Š” ์—†๋Š” ๊ฐ’

    • ๋ฐ์ดํ„ฐ ๋น„๊ต, ๋น ์ง„ ๊ฐ’ ์ฐพ๊ธฐ์— ์ž์ฃผ ์‚ฌ์šฉ๋ผ์š”!


    ๐Ÿงช ์‹ค์ „ ์˜ˆ์ œ

    ๐ŸŽฏ A. ์ฃผ๋ฌธํ•œ ๊ณ ๊ฐ + ๋ฏธ์ฃผ๋ฌธ ๊ณ ๊ฐ ํฌํ•จ (์ค‘๋ณต ์ œ๊ฑฐ)

    SELECT custid FROM Orders
    UNION
    SELECT custid FROM Customer;

    ๐ŸŽฏ B. ์ฃผ๋ฌธํ•œ ์  ์žˆ๋Š” ๊ณ ๊ฐ ID ์ „์ฒด (์ค‘๋ณต ํฌํ•จ)

    SELECT custid FROM Orders
    UNION ALL
    SELECT custid FROM Orders; -- ์˜ˆ์‹œ๋ฅผ ์œ„ํ•ด ์ค‘๋ณต

    ๐ŸŽฏ C. ์ฃผ๋ฌธํ•œ ๊ณ ๊ฐ ์ค‘ ์‚ฌ์›์ด๊ธฐ๋„ ํ•œ ์‚ฌ๋žŒ

    SELECT name FROM Customer
    INTERSECT
    SELECT name FROM Employee;

    ๐ŸŽฏ D. ์ฃผ๋ฌธ ์•ˆ ํ•œ ๊ณ ๊ฐ ์ฐพ๊ธฐ

    SELECT name FROM Customer
    EXCEPT
    SELECT name FROM (
      SELECT DISTINCT name
      FROM Customer C
      JOIN Orders O ON C.custid = O.custid
    );

    โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ

    • ์ปฌ๋Ÿผ ์ˆ˜์™€ ์ˆœ์„œ๊ฐ€ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • ORDER BY๋Š” ๋งˆ์ง€๋ง‰ SELECT ๊ฒฐ๊ณผ์—๋งŒ ์ ์šฉ ๊ฐ€๋Šฅ!

    SELECT name FROM A
    UNION
    SELECT name FROM B
    ORDER BY name; -- OK

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

    ์—ฐ์‚ฐ์ž

    ์„ค๋ช…

    ๊ฒฐ๊ณผ ์˜ˆ์‹œ

    UNION

    ํ•ฉ์ง‘ํ•ฉ (์ค‘๋ณต ์ œ๊ฑฐ)

    ๊น€์ฒ ์ˆ˜, ์ด์˜ํฌ, ๋ฐ•๋ฏผ์ˆ˜, ์ •์˜ˆ๋ฆฐ

    UNION ALL

    ํ•ฉ์ง‘ํ•ฉ (์ค‘๋ณต ํฌํ•จ)

    ๊น€์ฒ ์ˆ˜, ์ด์˜ํฌ, ๋ฐ•๋ฏผ์ˆ˜, ์ด์˜ํฌ, ์ •์˜ˆ๋ฆฐ, ๋ฐ•๋ฏผ์ˆ˜

    INTERSECT

    ๊ต์ง‘ํ•ฉ (๊ณตํ†ต๋œ ๊ฐ’๋งŒ ์ถ”์ถœ)

    ์ด์˜ํฌ, ๋ฐ•๋ฏผ์ˆ˜

    EXCEPT

    ์ฐจ์ง‘ํ•ฉ (์•ž ํ…Œ์ด๋ธ”์—๋งŒ ์žˆ๋Š” ๊ฐ’)

    ๊น€์ฒ ์ˆ˜

    ๐Ÿ“˜ ํ•™์Šต ํŒ
    โ€ข ์ง‘ํ•ฉ ์—ฐ์‚ฐ์€ ์ฟผ๋ฆฌ ๋‘ ๊ฐœ๋ฅผ ํ•˜๋‚˜๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด ์œ ์šฉ
    โ€ข ์ค‘๋ณต ์ œ๊ฑฐ๊ฐ€ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์œผ๋‹ˆ UNION ALL์ด ๋” ๋น ๋ฆ„
    โ€ข INTERSECT, EXCEPT์€ ์กฐ๊ฑด ํ•„ํ„ฐ๋ง๋ณด๋‹ค ์ง๊ด€์ ์ผ ๋•Œ ์œ ๋ฆฌํ•จ
    โ€ข UNION๊ณผ UNION ALL์˜ ์„ฑ๋Šฅ ์ฐจ์ด ๊ธฐ์–ต!
    โ€ข INTERSECT, EXCEPT์€ ์ปฌ๋Ÿผ ์ˆ˜์™€ ์ˆœ์„œ๊ฐ€ ๋™์ผํ•ด์•ผ ์ž‘๋™
    โ€ข ORDER BY๋Š” ์ „์ฒด ์ง‘ํ•ฉ ์—ฐ์‚ฐ ๋’ค์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ







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