header-img
Info :
๋ฐ€๋„
denseยน
์žฅ๋ž˜ํฌ๋ง : ๋‹จ์œ„ ๋ถ€ํ”ผ ๋‹น ์งˆ๋Ÿ‰์ด ๋ณด๋‹ค ๋นฝ๋นฝํ•œ ์‚ฌ๋žŒ ๋˜๊ธฐ

 

 

 

 

<์„œ๋ก >

์‹ค๋ฌด์—์„œ๋Š” ์ข…์ข… ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐใ…ก๊ธฐ์ค€ํ‚ค๊ฐ€ ๊ณต๋ฐฑ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•œ, ๋‹ค์‹œ ๋งํ•ด ํ•ฉ์ง‘ํ•ฉใ…ก๋ฅผ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•  ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธด๋‹ค. ํƒ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” ์ด๋ฅผ FULL OUTER JOIN์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ง€์›ํ•˜์ง€๋งŒ, mysql์—์„œ๋Š” ์•„์‰ฝ๊ฒŒ๋„ ์ด๋ฅผ ๊ณต์‹์ ์œผ๋กœ ์ง€์›ํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค. ๊ทธ๋Ÿฌ๋ฉด mysql์—์„œ๋Š” ํ•ฉ์ง‘ํ•ฉ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋ƒ๊ณ ? ๊ทธ๊ฑด ์•„๋‹ˆ๋‹ค. LEFT JOIN๊ณผ RIGHT JOIN์„ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ mysql์—์„œ๋„ ์ด๋ฅผ ๊ฐ„์ ‘์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์™ธ๊ตญ ๋ธ”๋กœ๊ทธ์— ํ•ด๋‹น ๋‚ด์šฉ์— ๋Œ€ํ•ด ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ํ‘œ์‹œํ•œ ํฌ์ŠคํŠธ๊ฐ€ ์žˆ์–ด ๋ฒˆ์—ญํ•ด ๊ฐ€์ ธ์™€ ๋ณธ๋‹ค.

 

 

FULL OUTER JOIN์˜ ํ˜•ํƒœ. ์ถœ์ฒ˜ //&nbsp;https://sql-joins.leopard.in.ua/

 

 

 

 

<๋ณธ๋ฌธ>

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

 

 

<์ฐธ๊ณ >

ubiq ๋ธ”๋กœ๊ทธ

sewonzzang๋‹˜ ๋ธ”๋กœ๊ทธ

 

 

 

๋”๋ณด๊ธฐ
TOOLS/SQL