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

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







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