<์๋ก >
์ค๋ฌด์์๋ ์ข ์ข ๋ ๊ฐ ์ด์์ ํ ์ด๋ธ์ ๋ชจ๋ ๋ฐ์ดํฐใ ก๊ธฐ์คํค๊ฐ ๊ณต๋ฐฑ์ธ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ, ๋ค์ ๋งํด ํฉ์งํฉใ ก๋ฅผ ๋ถ๋ฌ์์ผ ํ ๊ฒฝ์ฐ๊ฐ ์๊ธด๋ค. ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ์ด๋ฅผ FULL OUTER JOIN์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ์ง์ํ์ง๋ง, mysql์์๋ ์์ฝ๊ฒ๋ ์ด๋ฅผ ๊ณต์์ ์ผ๋ก ์ง์ํ๊ณ ์์ง ์๋ค. ๊ทธ๋ฌ๋ฉด mysql์์๋ ํฉ์งํฉ์ ๊ตฌํํ ์ ์๋๊ณ ? ๊ทธ๊ฑด ์๋๋ค. LEFT JOIN๊ณผ RIGHT JOIN์ ๊ฒฐํฉํ๋ ๊ฒ์ผ๋ก mysql์์๋ ์ด๋ฅผ ๊ฐ์ ์ ์ผ๋ก ๊ตฌํํ ์ ์๋ค. ์ธ๊ตญ ๋ธ๋ก๊ทธ์ ํด๋น ๋ด์ฉ์ ๋ํด ์์ ์ ํจ๊ป ํ์ํ ํฌ์คํธ๊ฐ ์์ด ๋ฒ์ญํด ๊ฐ์ ธ์ ๋ณธ๋ค.
<๋ณธ๋ฌธ>
sales์ orders๋ผ๋ ๋ ํ ์ด๋ธ์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด์. sales์ orders์๋ ๋์ผํ๊ฒ id์ฃผ๋ฌธ ์์ด๋์ order_date(ํ์์ด ์ด์ง ๋ค๋ฅธ)์ฃผ๋ฌธ ์ผ์, amount์ฃผ๋ฌธ ๊ธ์ก ๋ฐ์ดํฐ๊ฐ ๋ค์ด ์๋ค.
SELECT *
FROM sales;
+------+---------------------+--------+
| id | order_date | amount |
+------+---------------------+--------+
| 1 | 2021-02-02 08:15:00 | 250 |
| 2 | 2021-02-02 08:30:00 | 200 |
| 3 | 2021-02-02 08:55:00 | 150 |
| 4 | 2021-02-02 09:15:00 | 125 |
| 5 | 2021-02-02 09:30:00 | 250 |
| 6 | 2021-02-02 09:45:00 | 200 |
| 7 | 2021-02-02 10:15:00 | 180 |
| 8 | 2021-02-02 10:30:00 | 125 |
| 9 | 2021-02-02 10:45:00 | 200 |
| 10 | 2021-02-02 11:15:00 | 250 |
| 11 | 2021-02-02 11:30:00 | 150 |
| 12 | 2021-02-02 11:45:00 | 200 |
+------+---------------------+--------+
SELECT *
FROM orders;
+------+------------+--------+
| id | order_date | amount |
+------+------------+--------+
| 5 | 2021-01-28 | 250 |
| 6 | 2021-01-29 | 250 |
| 7 | 2021-01-30 | 250 |
| 8 | 2021-01-31 | 250 |
| 9 | 2021-02-01 | 250 |
+------+------------+--------+
๋ง์ฝ ๋น์ ์ด ์ ์ฒด ๊ธฐ๊ฐ ๋์์ ๋งค์ถ ํฉ๊ณ๋ฅผ ๊ณ์ฐํ๋ค๊ฑฐ๋ ํ๋ ์ด์ ๋ก ๋ ํ ์ด๋ธ์ ํฉ์ณ์ผ ํ ํ์์ฑ์ด ์๋ค๋ฉด ์๋์ ๊ฐ์ด LEFT JOIN๊ณผ RIGHT JOIN์ UNION ALL๋ก ๊ฒฐํฉํด ์ฌ์ฉํ ์ ์๋ค. ์๋์ ๊ฐ์ ์์ผ๋ก.
mysql> SELECT * FROM sales
LEFT JOIN orders ON sales.id = orders.id
UNION ALL
SELECT * FROM sales
RIGHT JOIN orders ON sales.id = orders.id
WHERE sales.id IS NULL ;
+------+---------------------+--------+------+------------+--------+
| id | order_date | amount | id | order_date | amount |
+------+---------------------+--------+------+------------+--------+
| 5 | 2021-02-02 09:30:00 | 250 | 5 | 2021-01-28 | 250 |
| 6 | 2021-02-02 09:45:00 | 200 | 6 | 2021-01-29 | 250 |
| 7 | 2021-02-02 10:15:00 | 180 | 7 | 2021-01-30 | 250 |
| 8 | 2021-02-02 10:30:00 | 125 | 8 | 2021-01-31 | 250 |
| 9 | 2021-02-02 10:45:00 | 200 | 9 | 2021-02-01 | 250 |
| 1 | 2021-02-02 08:15:00 | 250 | NULL | NULL | NULL |
| 2 | 2021-02-02 08:30:00 | 200 | NULL | NULL | NULL |
| 3 | 2021-02-02 08:55:00 | 150 | NULL | NULL | NULL |
| 4 | 2021-02-02 09:15:00 | 125 | NULL | NULL | NULL |
| 10 | 2021-02-02 11:15:00 | 250 | NULL | NULL | NULL |
| 11 | 2021-02-02 11:30:00 | 150 | NULL | NULL | NULL |
| 12 | 2021-02-02 11:45:00 | 200 | NULL | NULL | NULL |
+------+---------------------+--------+------+------------+--------+
๋ค๋ง UNION ALL์ ๊ฒฝ์ฐ ํฉ์งํฉ์ด๊ธฐ ๋๋ฌธ์ ์ค๋ณต ํ์ด ์์ฌ ๋์ฌ ์ ์๋ค. ์ด๋ด ๊ฒฝ์ฐ์๋ UNION์ ์ฌ์ฉํด ์ฃผ๋ฉด ๋๋๋ฐ, UNION์ ๊ฒฝ์ฐ์๋ t1๊ณผ t2 ์ฌ์ด์ ์ค๋ณต ๊ฐ์ ๊ฑธ๋ฌ์ ์ถ๋ ฅํ๋ ๊ฒ์ด์ด์ ์ ๋ํฌ ๊ฐ์ ๊ฑฐ๋ฅด๋ ์ธ๋ฑ์ค๊ฐ ํ๋ ๋ ์ถ๊ฐ๋๋ค๊ณ ํ๋ค. ๊ทธ๋์ ใ ก์ค๋ณต์ ๊ฑฐ๋ฅด์ง ์๋ UNION ALL๊ณผ ๋๋นํด์ใ ก ๋ฐ์ดํฐ์ ํฌ๊ธฐ์ ๋ฐ๋ผ 1.5๋ฐฐ์์ 4๋ฐฐ๊น์ง ์ฑ๋ฅ ์ฐจ์ด๊ฐ ๋ ์๋ ์๋ค๊ณ .
๊ทธ๋ฌ๋๊น, ์ฌ๋งํ๋ฉด FULL OUTER JOIN์ ์ฌ์ฉํ ๋๋ UNION ALL์ ์ฐ๋ ๊ฒ ํจ์จ์ ์ด๊ฒ ๋ค. (+ ์ต์ํ์ผ๋ก SELECTํด์.)๋ฌผ๋ก ์ ์ด์ ๋ชจ๋ธ๋ง ์ฐจ์์์ ๊ฒฐํฉํ ์ผ์ ๋ฐฐ์ ํ๋๋ก ์ค๊ณํ๋ ๊ฒ ๊ฐ์ฅ ์ข๊ฒ ์ง๋ง.
<์ ๋ฆฌ>
๋ง์ง๋ง์ผ๋ก ๋ฌธ๋ฒ์ ์ ๋ฆฌํด ๋๊ณ ๊ธ์ ๋ง์น๋ค. ์์๋๋ก UNION ALL์ค๋ณต ๋ฏธ์ ๊ฑฐ, UNION์ค๋ณต ์ ๊ฑฐ์ผ๋ก FULL OUTER JOIN์ ์ ์ฉํ๋ ์ฟผ๋ฆฌ๋ค.
SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
UNION ALL
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id
WHERE t1.id IS NULL
SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
UNION
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id
<์ฐธ๊ณ >