๐SQL ๋ฌธ๋ฒ - UNION๊ณผ ์งํฉ ์ฐ์ฐ ํ์ฉ๋ฒ

SQL์ ๋จ์ํ ํ
์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๊ฒ๋ฟ๋ง ์๋๋ผ,
์ฌ๋ฌ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์กฐํฉํ๊ฑฐ๋ ๋น๊ตํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค.
์ด๋ฒ ๊ธ์์๋ SQL์ ์งํฉ ์ฐ์ฐ์๋ค์ ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
โ ์งํฉ ์ฐ์ฐ์ด๋?
๋ ๊ฐ ์ด์์ SELECT ๊ฒฐ๊ณผ๋ฅผ ํ๋๋ก ๋ฌถ๊ฑฐ๋ ๋น๊ตํ ์ ์๋๋ก ํด์ฃผ๋ ์ฐ์ฐ์
๋๋ค.
โ ์ํ์์์ ํฉ์งํฉ, ๊ต์งํฉ, ์ฐจ์งํฉ ๊ฐ๋
์ SQL๋ก ๊ตฌํํ ๊ฑฐ์์.
โด ์ฌ์ฉ ๊ฐ๋ฅํ ์งํฉ ์ฐ์ฐ์
์ฐ์ฐ์ | ์๋ฏธ | ์ค๋ช |
| ํฉ์งํฉ | ๋ ๊ฒฐ๊ณผ๋ฅผ ํฉ์ณ ์ค๋ณต ์ ๊ฑฐ |
| ํฉ์งํฉ (์ค๋ณต ํ์ฉ) | ๋ ๊ฒฐ๊ณผ๋ฅผ ํฉ์ณ ์ค๋ณต๊น์ง ๋ชจ๋ ํฌํจ |
| ๊ต์งํฉ | ๋ ๊ฒฐ๊ณผ์ ๋ชจ๋ ํฌํจ๋๋ ๊ฐ๋ง ๋ฐํ |
| ์ฐจ์งํฉ | ์ฒซ ๋ฒ์งธ ๊ฒฐ๊ณผ์์ ๋ ๋ฒ์งธ ๊ฒฐ๊ณผ๋ฅผ ์ ์ธ |
| ์ฐจ์งํฉ (Oracle ์ ์ฉ) | Oracle์์ |
๐ ์ฃผ์: ์งํฉ ์ฐ์ฐ์ ์ฐ๋ ค๋ฉด
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 ALL์ด ๋ ๋น ๋ฆ
โข INTERSECT, EXCEPT์ ์กฐ๊ฑด ํํฐ๋ง๋ณด๋ค ์ง๊ด์ ์ผ ๋ ์ ๋ฆฌํจ
โข UNION๊ณผ UNION ALL์ ์ฑ๋ฅ ์ฐจ์ด ๊ธฐ์ต!
โข INTERSECT, EXCEPT์ ์ปฌ๋ผ ์์ ์์๊ฐ ๋์ผํด์ผ ์๋
โข ORDER BY๋ ์ ์ฒด ์งํฉ ์ฐ์ฐ ๋ค์๋ง ์ฌ์ฉ ๊ฐ๋ฅ