본문 바로가기

나중에도 봐야겠지?

2024.04.05 SQL UNION, UNION ALL

SQL 문제를 복습하던 도중 놓쳤던 부분을 발견했다

 

이 문제는 UNION으로 풀었던 거다

 

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
SELECT DATE_FORMAT(SALES_DATE,'%Y-%m-%d') AS SALES_DATE,
       PRODUCT_ID,
       NULL,
       SALES_AMOUNT
FROM OFFLINE_SALE
WHERE SALES_DATE LIKE '2022-03%'
ORDER BY SALES_DATE ASC, PRODUCT_ID ASC, USER_ID ASC

 

답은 이거다

여기서 UNION 이란 무엇일까?

 

UNION 이란

  • 여러 쿼리문들을 합쳐서 하나의 쿼리문으로 만들어주는 방법이다.
  • 중복된 값을 제거하고 보여준다.
  • 중복된 값을 제거하는 연산이 추가로 수행되기 때문에 UNION ALL보다 속도가 느리다.

그렇다면 UNION ALL은 무엇일까?

 

UNION ALL 이란

  • UNION과 동일하게 여러 쿼리문들을 합쳐서 하나의 쿼리문으로 만들어주는 방법이다.
  • 중복된 값을 모두 보여준다.

내가 UNION ALL이 아닌 UNION으로 쓴 이유가 무엇일까?

중복이 있으면 안 되기 때문에 UNION으로 썼다

 

그렇다면 

SELECT DATE_FORMAT(SALES_DATE,'%Y-%m-%d') AS SALES_DATE,
       PRODUCT_ID,
       NULL,
       SALES_AMOUNT

 

NULL을 쓴 이유는 무엇일까?

이유는

SELECT DATE_FORMAT(SALES_DATE,'%Y-%m-%d') AS SALES_DATE,
       PRODUCT_ID,
       USER_ID,
       SALES_AMOUNT
FROM ONLINE_SALE


SELECT DATE_FORMAT(SALES_DATE,'%Y-%m-%d') AS SALES_DATE,
       PRODUCT_ID,
       NULL,
       SALES_AMOUNT
FROM OFFLINE_SALE

 

OFFLINE_SALE 테이블에서는 USER_ID가 없기 때문에 NULL로 표기해 주었다

그다음은 문제대로 풀어주면 된다

찾아보니 UNION은 실무에서 많이 쓰이지는 않는다고 한다

하지만 알고 있어야 꼭 써야 할 부분에서 쓸 수 있기 때문에

이것 또한 나에게 있어 중요한 자산이 될 것 같다