[ํ๋ก๊ทธ๋๋จธ์ค level 4] ์คํ๋ผ์ธ/์จ๋ผ์ธ ํ๋งค ๋ฐ์ดํฐ ํตํฉํ๊ธฐ
๋ฌธ์ ์ค๋ช
๋ค์์ ์ด๋ ์๋ฅ ์ผํ๋ชฐ์ ์จ๋ผ์ธ ์ํ ํ๋งค ์ ๋ณด๋ฅผ ๋ด์ ONLINE_SALE ํ ์ด๋ธ๊ณผ ์คํ๋ผ์ธ ์ํ ํ๋งค ์ ๋ณด๋ฅผ ๋ด์ OFFLINE_SALE ํ ์ด๋ธ ์ ๋๋ค. ONLINE_SALE ํ ์ด๋ธ์ ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋์ด์์ผ๋ฉฐ ONLINE_SALE_ID, USER_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE๋ ๊ฐ๊ฐ ์จ๋ผ์ธ ์ํ ํ๋งค ID, ํ์ ID, ์ํ ID, ํ๋งค๋, ํ๋งค์ผ์ ๋ํ๋ ๋๋ค.
Column nameTypeNullable
ONLINE_SALE_ID | INTEGER | FALSE |
USER_ID | INTEGER | FALSE |
PRODUCT_ID | INTEGER | FALSE |
SALES_AMOUNT | INTEGER | FALSE |
SALES_DATE | DATE | FALSE |
๋์ผํ ๋ ์ง, ํ์ ID, ์ํ ID ์กฐํฉ์ ๋ํด์๋ ํ๋์ ํ๋งค ๋ฐ์ดํฐ๋ง ์กด์ฌํฉ๋๋ค.
OFFLINE_SALE ํ ์ด๋ธ์ ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋์ด์์ผ๋ฉฐ OFFLINE_SALE_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE๋ ๊ฐ๊ฐ ์คํ๋ผ์ธ ์ํ ํ๋งค ID, ์ํ ID, ํ๋งค๋, ํ๋งค์ผ์ ๋ํ๋ ๋๋ค.
Column nameTypeNullable
OFFLINE_SALE_ID | INTEGER | FALSE |
PRODUCT_ID | INTEGER | FALSE |
SALES_AMOUNT | INTEGER | FALSE |
SALES_DATE | DATE | FALSE |
๋์ผํ ๋ ์ง, ์ํ ID ์กฐํฉ์ ๋ํด์๋ ํ๋์ ํ๋งค ๋ฐ์ดํฐ๋ง ์กด์ฌํฉ๋๋ค.
๋ฌธ์
ONLINE_SALE ํ ์ด๋ธ๊ณผ OFFLINE_SALE ํ ์ด๋ธ์์ 2022๋ 3์์ ์คํ๋ผ์ธ/์จ๋ผ์ธ ์ํ ํ๋งค ๋ฐ์ดํฐ์ ํ๋งค ๋ ์ง, ์ํID, ์ ์ ID, ํ๋งค๋์ ์ถ๋ ฅํ๋ SQL๋ฌธ์ ์์ฑํด์ฃผ์ธ์. OFFLINE_SALE ํ ์ด๋ธ์ ํ๋งค ๋ฐ์ดํฐ์ USER_ID ๊ฐ์ NULL ๋ก ํ์ํด์ฃผ์ธ์. ๊ฒฐ๊ณผ๋ ํ๋งค์ผ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํด์ฃผ์๊ณ ํ๋งค์ผ์ด ๊ฐ๋ค๋ฉด ์ํ ID๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์, ์ํID๊น์ง ๊ฐ๋ค๋ฉด ์ ์ ID๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํด์ฃผ์ธ์.
๋ฌธ์ ํ์ด
SELECT * FROM
(SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE SALES_DATE LIKE '2022-03%'
UNION ALL
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM OFFLINE_SALE
WHERE SALES_DATE LIKE '2022-03%')TOTAL
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;
์ฐ์ ONLINE_SALE ํ ์ด๋ธ์์ 2022๋ 3์ ๊ตฌ์ ํ ํ๋งค ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ค.
LIKE-์์ผ๋์นด๋ ์กฐํฉ์ผ๋ก 2022๋ 3์ ๊ตฌ์ ํ ํ๋งค ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๊ณ , SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT๋ฅผ ์ถ์ถํ๋ค.
๊ทธ๋ฆฌ๊ณ , OFFLINE_SALE ํ ์ด๋ธ์์ ONLINE_SALE ํ ์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ ๋ฐฉ์๊ณผ ๋์ผํ๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋ฝ์๋๋๋ฐ, ์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ USER_ID๋ ๊ธฐ์กด์ OFFLINE_SALE ํ ์ด๋ธ์ ์กด์ฌํ์ง ์์ง๋ง, NULL๋ก ํ์ํด์ผ ํ๊ธฐ ๋๋ฌธ์ NULL AS USER_ID๋ก NULL ๋ฐ์ดํฐ๋ค์ USER_ID ๋ผ๋ ์ปฌ๋ผ์ผ๋ก ํํํ๋๋ก ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ๋ ํ ์ด๋ธ์ ํฉ์ณ์ฃผ๋ UNION ์ฐ์ฐ์ ์ฌ์ฉํ๋๋ฐ,
UNION ์ฐ์ฐ์๋ UNION ALL๊ณผ UNION์ด ์๋ค. ๋ ์ฐ์ฐ์ ์ฐจ์ด์ ์ ์ค๋ณต ์ฒ๋ฆฌ ์ฌ๋ถ์ ๋ ํ ์ด๋ธ์ ์ปฌ๋ผ์ด ๋์ผํ์ง ํ์ธํ๋ ๊ฒ์ด๋ค.
๋จผ์ UNION์ ๋ ํ ์ด๋ธ์ ๋์ผํ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ ํ๋์ ๋ฐ์ดํฐ๋ง ์ถ์ถํ๋ค. ์ฆ, ์ค๋ณต์ ํ์ฉํ์ง ์๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ํ ์ด๋ธ์ ์ปฌ๋ผ์ด ๊ฐ์์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ค. ๋ง์ฝ ํ ํ ์ด๋ธ์ด A,B๋ผ๋ ์ปฌ๋ผ์ ๊ฐ์ง๋๋ฐ ๋ค๋ฅธ ํ ์ด๋ธ์ด A,B,C ์ปฌ๋ผ์ ๊ฐ์ง ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
๊ทธ๋ฆฌ๊ณ UNION ALL์ ๋ ํ ์ด๋ธ์ ๋์ผํ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋๋ผ๋ ์ค๋ณต ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ๋ค. ๊ทธ๋ฆฌ๊ณ , ์ปฌ๋ผ์ด ๋ค๋ฅด๋๋ผ๋ ํฉ์ณ์ค ์ ์๋ค.
์ด ๋ฌธ์ ์์ ๋ ํ ์ด๋ธ์ ์ปฌ๋ผ์ด ๋์ผํ๊ณ , ๋์ผํ ๋ ์ง, ์ํ ID ์กฐํฉ์ ๊ดํด์๋ ํ๋์ ๋ฐ์ดํฐ๋ง ์กด์ฌํ๋ฏ๋ก UNION์ ์ฌ์ฉํด์ค๋ ์ ๋ต ์ฒ๋ฆฌ๊ฐ ๋๋ค.
์ด๋ ๊ฒ ํฉ์น ๋ ํ ์ด๋ธ์ 'TOTAL'์ด๋ผ๋ ๋ณ์นญ์ผ๋ก ALIASํด์ฃผ๊ณ , ํ๋์ ํ ์ด๋ธ์ฒ๋ผ SELECT ... FROM ...์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ณ ORDER BY๋ก ์ ์ ํ๊ฒ ์ ๋ ฌํด์ค๋ค.