MySQL 등의 RDBMS에서 사용하는 Union연산자는 여러 테이블에 존재하는 같은 column의 값을 한번의 쿼리로 추출할 수 있도록 돕습니다.
Union을 사용할 때 주의점이 있습니다.
1. 대응하는 필드의 이름이 같아야 한다. 같지 않다면 AS를 사용하여 같게 만듭니다.
2. 대응되는 각 필드의 타입이 같아야 합니다.
프로그래머스 코딩테스트에 나온 문제를 예로 들어보겠습니다. (감사합니다. 프로그래머스♥)
여러테이블에 존재하는 같은 column을 하나로 뭉치게하는 union문을 사용하면 잘 합쳐지겠죠?
일단 다른 조건들은 확인하지 않고 진행해 볼게요.
SELECT sales_date, product_id, user_id, sales_amount
FROM online_sale
WHERE sales_date >= "2022-03-01" AND sales_date < "2022-04-01"
UNION
SELECT sales_date, product_id, NULL AS user_id, sales_amount
FROM offline_sale
WHERE sales_date >= "2022-03-01" AND sales_date < "2022-04-01"
이렇게 합치게 되면 sales_date에 년, 월, 일 뿐만아니라 시간 분 초까지 나오게 됩니다.
정말 이런 기능을 누가 알려주었으면 좋겠어요ㅠ
DATE_FORMAT 기능을 사용해서 연월일만 나오게 구현을 하는 방법이 있습니다. 또 이 안에도 또 신기한 기능이 있습니다.DATE_FORMAT( column name, "%Y-%m-%d") 로 하면 년 월 일이 숫자로 잘 나옵니다. 하지만....
DATE_FORMAT( column name, "%Y-%M-%d") 대문자로 작성을 하면 월이.... 영어로 나옵니다 신기하네요. 컴퓨터의 세계란..
SELECT DATE_FORMAT(sales_date, "%Y-%m-%d"), product_id, user_id, sales_amount
FROM online_sale
WHERE sales_date >= "2022-03-01" AND sales_date < "2022-04-01"
UNION
SELECT DATE_FORMAT(sales_date, "%Y-%m-%d"), product_id, NULL AS user_id, sales_amount
FROM offline_sale
WHERE sales_date >= "2022-03-01" AND sales_date < "2022-04-01"
아무튼 나머지 조건들은 order by로 정렬 정렬하면 됩니다. 오름차순이면 asc , 내림차순이면 desc 등등으로 변경하면 됩니다.
union으로 2개의 table을 같은 column값으로 묶는 쿼리문을 사용해 본 재미난 시간을 가져봤는데요. 재밌네요
https://school.programmers.co.kr/learn/courses/30/lessons/131537
'코딩 개발' 카테고리의 다른 글
Error Handling (0) | 2022.11.14 |
---|---|
MYSQL - WITH (0) | 2022.11.07 |
Bcrypt & JWT (0) | 2022.11.07 |
암호화의 종류 (0) | 2022.11.07 |
Session & Token (0) | 2022.11.07 |