๊ด€๋ฆฌ ๋ฉ”๋‰ด

bom's happy life

[SQL ์ฝ”ํ…Œ] ์˜คํ”„๋ผ์ธ/์˜จ๋ผ์ธ ํŒ๋งค ๋ฐ์ดํ„ฐ ํ†ตํ•ฉํ•˜๊ธฐ(UNION/UNION ALL/์ธ๋ผ์ธ๋ทฐ/NULL AS ์ปฌ๋Ÿผ๋ช…/LIKE/DATE_FORMAT) ๋ณธ๋ฌธ

Algorithm๐Ÿ’Œ/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[SQL ์ฝ”ํ…Œ] ์˜คํ”„๋ผ์ธ/์˜จ๋ผ์ธ ํŒ๋งค ๋ฐ์ดํ„ฐ ํ†ตํ•ฉํ•˜๊ธฐ(UNION/UNION ALL/์ธ๋ผ์ธ๋ทฐ/NULL AS ์ปฌ๋Ÿผ๋ช…/LIKE/DATE_FORMAT)

bompeach 2023. 8. 13. 17:37

A) UNION

(SELECT DATE_FORMAT(SALES_DATE, "%Y-%m-%d") AS SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE AS N
WHERE SALES_DATE LIKE '2022-03%'
UNION
SELECT DATE_FORMAT(SALES_DATE, "%Y-%m-%d") AS SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM OFFLINE_SALE AS F
WHERE SALES_DATE LIKE '2022-03%')
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID

 

A) FROM์ ˆ์— ์ธ๋ผ์ธ๋ทฐ + UNION ALL ์‚ฌ์šฉ

SELECT 
    DATE_FORMAT(T.SALES_DATE, '%Y-%m-%d') AS SALES_DATE,
    T.PRODUCT_ID,
    T.USER_ID,
    T.SALES_AMOUNT
FROM 
(
    SELECT *
    FROM ONLINE_SALE
    
    UNION ALL
    
    SELECT 
        OFFLINE_SALE_ID AS ONLINE_SALE_ID,
        NULL AS USER_ID,
        PRODUCT_ID,
        SALES_AMOUNT,
        SALES_DATE
    FROM OFFLINE_SALE        
) AS T

WHERE SALES_DATE LIKE '2022-03%'
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;

 

 

์ •๋ฆฌ๋œ ๋‹ต MYSQL, ORACLE  -->

 

** NULL AS USER_ID ๋ถ€๋ถ„ : UNION ํ•˜๋ ค๋ฉด ์นผ๋Ÿผ ์ˆ˜๊ฐ€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค๋Š” ์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œ์ผœ์•ผ ํ•˜๋Š”๋ฐ OFFLINE_SALE ํ…Œ์ด๋ธ”์— USER_ID๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— NULL AS USER_ID ๋กœ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.

 

A) ๋…„๋„๊ฐ€  ๋‹ค 2022๋…„ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ฌ๋งŒ 03์›”์„ ์ฐพ๋„๋ก ํ•ด์คŒ

-- MYSQL
(SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM OFFLINE_SALE 
WHERE DATE_FORMAT(SALES_DATE, '%m') = '03')
UNION ALL
(SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE DATE_FORMAT(SALES_DATE, '%m') = '03')
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;

-- ORACLE
(SELECT TO_CHAR(SALES_DATE, 'YYYY-MM-DD') AS SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM OFFLINE_SALE 
WHERE TO_CHAR(SALES_DATE, 'MM') = '03')
UNION ALL
(SELECT TO_CHAR(SALES_DATE, 'YYYY-MM-DD') AS SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE TO_CHAR(SALES_DATE, 'MM') = '03')
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;

 

 + LIKE ์‚ฌ์šฉํ•ด์„œ ๋…„๋„๊นŒ์ง€ ์ฐพ๋„๋ก ํ•˜๊ธฐ

-- MYSQL
(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%')
 ORDER BY SALES_DATE ASC, PRODUCT_ID ASC, USER_ID ASC

 


 

# UNION / UNION ALL ?

- ๋‘ ๊ฐœ์˜ SELECT ๋ฌธ์„ ํ•ฉ์น˜๋Š” ๊ฒƒ

- ๋‘ ๊ฐœ์˜ SELECT ๋ฌธ์„ ํ•ฉ์น˜๋Š” ๊ฒƒ์ด๊ธฐ์— ์ œ์•ฝ์กฐ๊ฑด์ด ๋งŽ๋‹ค.

 

# UNION / UNION ALL ์ œ์•ฝ์กฐ๊ฑด ?

- ์ƒ์œ„ SQL๋ฌธ๊ณผ ํ•˜์œ„ SQL๋ฌธ์˜ ์ปฌ๋Ÿผ ๊ฐœ์ˆ˜๊ฐ€ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค.

- ์ƒ์œ„ SQL๋ฌธ๊ณผ ํ•˜์œ„ SQL๋ฌธ์˜ ์ปฌ๋Ÿผ ์œ„์น˜๊ฐ€ ๋™์ผํ•œ ์ปฌ๋Ÿผ๋“ค์ด ๊ฒฐํ•ฉ๋œ๋‹ค.

** ์ปฌ๋Ÿผ ์ด๋ฆ„๋งŒ ๋™์ผํ•˜๋‹ค๊ณ  ๊ฒฐํ•ฉ์ด ์•ˆ๋œ๋‹ค.

- ์ปฌ๋Ÿผ๋ช…์€ ์ตœ์ƒ์œ„ SQL๋ฌธ์˜ ๋ช…์นญ์„ ๋”ฐ๋ฅด๊ฒŒ ๋œ๋‹ค.

 

# UNION / UNION ALL ์ฐจ์ด์  ?

- UNION์€ ์ค‘๋ณต๋œ ํ–‰์„ ์ œ๊ฑฐํ•˜์ง€๋งŒ UNION ALL์€ ์ค‘๋ณต๋œ ํ–‰์„ ํ—ˆ์šฉํ•œ๋‹ค.

- ์ค‘๋ณต๋œ ํ–‰์„ ๊ผญ ์ œ๊ฑฐํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋ณดํ†ต UNION ALL์„ ์‚ฌ์šฉํ•œ๋‹ค.

- ์‹ค์ œ ํ™˜๊ฒฝ์—์„œ๋Š” UNION์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋“œ๋ฌผ๋‹ค.