https://school.programmers.co.kr/learn/courses/30/lessons/131537
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
MySQL - LV4
UNION 사용
1. 두 개의 테이블을 합친 뒤 조건에 맞는 데이터를 SELECT 하는 문제
JOIN을 많이 사용하다보니 단순하게 테이블을 합친다는 개념으로만 접근해
UNION이 아닌 JOIN을 먼저 떠올리는 경우가 있으니 조심.
- UNION : 테이블을 ROW로 합치기
- JOIN : 테이블을 COLUMN으로 합치기
2. UNION을 사용할 때는 두 테이블의 컬럼과 데이터 형식이 동일해야 하는데,
문제에서 주어진 테이블 중 OFFLINE_SALE 에는 USER_ID 컬럼이 존재하지 않아 추가해주어야 한다.
문제에서도 OFFLINE_SALE 테이블의 USER_ID 값은 NULL 로 표시해주라고 나와있다.
테이블에 임시 컬럼을 추가하는 방법은 SELECT 문을 활용하여 사용할 수 있다.
SELECT '컬럼에 들어갈 값' AS 컬럼명
문제에서 NULL값으로 지정해주라고 되어있어 'NULL' 로 입력하다보니 NULL 그 자체의 값이 아니라 문자 'NULL'로 인식되어 틀렸다고 나왔다. 문제에서 요구한 것은 문자 'NULL'이 아닌 NULL 그 자체의 값이므로 SELECT 문에서
SELECT NULL AS USER_ID
를 입력해주니 통과가 되었다.
3. 문제의 정답 여부와는 상관이 없지만 UNION / UNION ALL 의 차이
- UNION의 경우 합치는 테이블의 중복값을 제거한다. → 따라서 정렬을 발생 시킨다.
- UNION ALL 의 경우 합치는 테이블의 중복값을 제거하지 않고 모든 데이터를 합친다. → 정렬을 발생시키지 않는다.
[정답 코드]
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
-- 3월의 데이터만 가져와야 하는 상황에서 사용할 수 있는 조건문 작성방식 2가지
-- WHERE SALES_DATE >= '2022-03-01' AND SALES_DATE < '2022-04-01'
WHERE MONTH(SALES_DATE) = 3
UNION ALL
-- UNION 은 두 테이블 사이의 중복값을 제거하여 정렬이 일어나고,
-- 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 >= '2022-03-01' AND SALES_DATE < '2022-04-01'
WHERE MONTH(SALES_DATE) = 3
ORDER BY SALES_DATE ASC, PRODUCT_ID ASC, USER_ID ASC
'문제풀이 > 프로그래머스' 카테고리의 다른 글
[MYSQL/Lv3] 조건별로 분류하여 주문상태 출력하기 (0) | 2023.07.20 |
---|---|
[python/파이썬] Lv0 문제 풀이 중 참조 (2) | 2023.07.10 |
[MYSQL/Lv1] 자동차 대여 기록에서 장기/단기 대여 구분하기 (0) | 2023.04.26 |