UNION์ ์ฌ์ฉํ ๊ธด ํํ
UNION์ ์ฌ์ฉํ ์กฐ๊ฑด ๋ถ๊ธฐ๋ ์๊ฐํ๊ธฐ ์ฝ์ง๋ง ์ฑ๋ฅ์ ์ธ ์ธก๋ฉด์์ ๋ณด๋ฉด SELECT๋ฌธ์ ์ฌ๋ฌ๊ฐ ์คํํ์ฌ ํ ์ด๋ธ ์ ๊ทผ ํ์๊ฐ ์ฆ๊ฐ -> I/O๋น์ฉ ์ฆ๊ฐ
1. UNION ์ฌ์ฉํ ์กฐ๊ฑด ๋ถ๊ธฐ ์์
SELECT Item_name, year, price_tax_ex AS price
FROM Items
WHERE year <=2001
UNION ALL
SELECT Item_name, year, price_tax_in AS price
FROM Items
WHERE year > 2001;
๊ฑฐ์ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๋๋ฒ ์คํํ์ฌ ๊ฐ๋ ์ฑ ์ ํ
Items ํ ์ด๋ธ์ 2ํ ์ ๊ทผํ์ฌ ์ฑ๋ฅ ์ ํ
-> ์ ํํ ํ๋จ ์์ด UNION ์ฌ์ฉํ๋ ๊ฒ์ ์์ ํ์
2. SELECT ๊ตฌ๋ฅผ ์ฌ์ฉํ ์กฐ๊ฑด ๋ถ๊ธฐ ์์
SELECT item_name, year,
CASE WHEN year<=2001 THEN price_tax_ex,
WHEN year<=2001 THEN price_tax_in END AS price
FROM Items;
ํ ์ด๋ธ์ 1ํ๋ง ์ ๊ทผํ์ฌ ์ฑ๋ฅ ๊ฐ์
์ง๊ณ์ ์กฐ๊ฑด ๋ถ๊ธฐ
1. ์ง๊ณ ๋์์ผ๋ก ์กฐ๊ฑด ๋ถ๊ธฐ
| ์ง์ญ ์ด๋ฆ(location) | ์ฑ๋ณ(sex) | ์ธ๊ตฌ(pop) |
๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ๋ ํ ์ด๋ธ๋ก๋ถํฐ
| ์ง์ญ ์ด๋ฆ(location) | ๋จ์ฑ ์ธ๊ตฌ | ์ฌ์ฑ ์ธ๊ตฌ |
์์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ํ ๊ตฌ๋ฌธ ์์ฑ
- UNION ์ฌ์ฉ
๋จ์ฑ ์ธ๊ตฌ๋ฅผ ์ง์ญ๋ณ๋ก ๊ตฌํ๊ณ ์ฌ์ฑ ์ธ๊ตฌ๋ฅผ ์ง์ญ๋ณ๋ก ๊ตฌํ ํ merge
SELECT location, SUM(pop_m) AS pop_m, SUM(pop_fm) AS pop_wom
FROM (SELECT location, pop AS pop_m, null AS pop_fm
FROM Population
WHERE sex='1'
UNION
SELECT location, NULL AS pop_fm, pop AS pop_fm
WHERE sex='2') TMP
GROUP BY location;
Seq Scan 2ํ ์ํ
- CASE ์ฌ์ฉ
SELECT location,
SUM(CASE WHEN sex='1' THEN pop ELSE 0 END) AS pop_m,
SUM(CASE WHEN sex='2' THEN pop ELSE 0 END AS pop_fm
FROM Population
GROUP BY location;
Seq Scan 1ํ ์ํ
2. ์ง์ฝ ๊ฒฐ๊ณผ๋ก ์กฐ๊ฑด ๋ถ๊ธฐ
์์๋ ํ์ ๊ฐ์์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๋ฅผ ๋ค๋ฅด๊ฒ ๋ฐํํ๋ ์ฟผ๋ฆฌ ์์ฑํ๊ธฐ


- UNION ์ฌ์ฉ
SELECT emp_name, MAX(team) AS team
FROM Employees
GROUP BY emp_name
HAVING count(*)=1
UNION
SELECT emp_name, '2๊ฐ๋ฅผ ๊ฒธ๋ฌด' AS team
FROM Employees
GROUP BY emp_name
HAVING count(*)=2
UNION
SELECT emp_name, '3๊ฐ ์ด์์ ๊ฒธ๋ฌด' AS team
FROM Employees
GROUP BY emp_name
HAVING count(*)>=3;
3๋ฒ์ TABLE ACCESS FULL ๋ฐ์
emp_name์ผ๋ก ๊ทธ๋ฃนํํ ์งํฉ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ฏ๋ก HAVING ๊ตฌ ์ฌ์ฉ
- CASE ์ ์ฌ์ฉ
SELECT emp_name,
CASE WHEN COUNT(*)=1 THEN MAX(team)
WHEN COUNT(*)=2 THEN '2๊ฐ๋ฅผ ๊ฒธ๋ฌด'
WHEN COUNT(*)=3 THEN '3๊ฐ ์ด์์ ๊ฒธ๋ฌด'
END AS team
FROM Employees
GROUP BY emp_name;
UNION์ด ๊ผญ ํ์ํ ๊ฒฝ์ฐ
1. UNION์ ์ฌ์ฉํ ์๋ฐ์ ์๋ ๊ฒฝ์ฐ
์ฌ๋ฌ ๊ฐ์ ์๋ก ๋ค๋ฅธ ํ ์ด๋ธ์์ ๊ฒ์ํ ๊ฒฐ๊ณผ๋ฅผ ๋จธ์งํ๋ ๊ฒฝ์ฐ
SELECT col_1
FROM Table_A
WHERE col_2='A'
UNION
SELECT col_3
FROM Table_B
WHERE col_4='B'
2. UNION์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ฑ๋ฅ์ ์ผ๋ก ์ข์ ๊ฒฝ์ฐ
์ธ๋ฑ์ค์ ๊ด๋ จ๋ ๊ฒฝ์ฐ
ํ ์ด๋ธ์ ํฌ๊ธฐ๊ฐ ์ปค TABLE FULL SCAN๋ณด๋ค INDEX RANGE SCAN์ด ํจ์จ์ ์ผ ๊ฒฝ์ฐ ์ธ๋ฑ์ค์ UNION ์กฐํฉ์ด ๋ ์ฑ๋ฅ์ด ์ข์ ์ ์๋ค
OR, IN ์ฌ์ฉ ์ WHERE๊ตฌ๋ฌธ์์ ํด๋น ํ๋์ ๋ถ์ฌ๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์์ -> ํ ์ด๋ธ์ด ํฌ๊ณ WHERE ์กฐ๊ฑด์ผ๋ก ์ ํ๋๋ ๋ ์ฝ๋ ์๊ฐ ์ถฉ๋ถํ ์๋ค๋ฉด UNION์ด ๋ ๋น ๋ฆ
์ ์ฐจ ์งํฅํ๊ณผ ์ ์ธํ
์กฐ๊ฑด ๋ถ๊ธฐ๋ ์กฐ๊ฑด ๋ถ๊ธฐ๋ฅผ ์ํด ๋ง๋ค์ด์ง CASE ์์ ์ฌ์ฉํ๋ ๊ฒ์ด UNION์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ์ข์
SQL ๊ตฌ๋ฌธ ๋ด๋ถ์๋ ์(expression)์ ์์ฑ -> ์ ์ธ์ ์ธ ์์ ์ ์ ํ์
'SQL > SQL ๋ ๋ฒจ์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [SQL ๋ ๋ฒจ์ ] 6์ฅ: ๊ฒฐํฉ (0) | 2022.04.25 |
|---|---|
| [SQL ๋ ๋ฒจ์ ] 5์ฅ: ๋ฐ๋ณต๋ฌธ (0) | 2022.04.18 |
| [SQL ๋ ๋ฒจ์ ] 4์ฅ: ์ง์ฝ๊ณผ ์๋ฅด๊ธฐ (0) | 2022.04.18 |
| [SQL ๋ ๋ฒจ์ ] 2์ฅ: SQL ๊ธฐ์ด (0) | 2022.04.10 |
| [SQL ๋ ๋ฒจ์ ] 1์ฅ: DBMS ์ํคํ ์ฒ (0) | 2022.04.03 |
๋๊ธ