오늘은 union과 join에 대해 배워보는 시간이었다.
union은 수직으로 테이블을 합치는 것
join은 수평으로 테이블을 합치는 것이다.
union은 합치려는 테이블끼리 컬럼의 형식(문자, 숫자), 컬럼의 순서, 열의 개수가 같아야 한다.
SELECT
FROM
UNION
SELECT
FROM의형식으로 만들고
두 테이블의 열 개수가 다르다면 서브쿼리를 이용해 두 테이블의 컬럼을 동일하게 맞춰줄 수 있다.
union에는 union과 union all이 있는데,
union: 중복 데이터 제거
union all: 중복 데이터 모두 표기이다.
반면, join은 컬럼 순서가 달라도 합칠 수 있다.
두 테이블의 공통 컬럼이 있는지 확인하는 것이 가장 중요하고 공통 컬럼이 여러 개인 경우 여러 컬럼을 기준으로 합칠 수 있다. 단 AND로 합쳐서 조건이 모두 같아야 한다.
공통 컬럼이 하나인 경우
SELECT 컬럼1, 컬럼2
FROM 테이블a
JOIN
SELECT 컬럼1, 컬럼2
FROM 테이블b
ON a.공통컬럼 = b.공통컬럼
공통컬럼이 여러 개인 경우
SELECT 컬럼1, 컬럼2
FROM 테이블 as a
JOIN
SELECT 컬럼1, 컬럼2
FROM 테이블 as b
ON a.공통컬럼 = b.공통컬럼 and a.공통컬럼2 = b.공통컬럼2
오늘 나온 숙제는 무려 Lv4!
ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량을 출력하는 SQL문을 작성해주세요. OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시해주세요. 결과는 판매일을 기준으로 오름차순 정렬해주시고 판매일이 같다면 상품 ID를 기준으로 오름차순, 상품ID까지 같다면 유저 ID를 기준으로 오름차순 정렬해주세요.
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,
# COALESCE(NULL, 'NULL') AS USER_ID,
SALES_AMOUNT
FROM OFFLINE_SALE
WHERE SALES_DATE LIKE '2022-03%'
ORDER BY SALES_DATE,
PRODUCT_ID,
USER_ID
이것이 정답 코드
부족한 점이 있었다면,
1. 년도-월-일까지의 데이터만 필요했는데, 시간까지 나와서 오답처리 되었다. 이를 해결하기 위해 DATE_FORMAT함수를 사용할 수 있다. SELECT에서 원하는 컬럼과 원하는 형식을 지정해주고, 2022-03 데이터만 필요하므로 WHERE절에서 날짜 조건을 걸어준다.
2. 2022년 3월이기 때문에 일은 모두 포함해야 해서 LIKE를 썼는데 이 때 %를 붙여줘야 한다.
3. OFFLINE TABLE은 USER_ID가 없어서 두 테이블이 union이 안 되는데 이 때 NULL을 임의로 지정하여 합칠 수 있다!(선호님 나이스)
4. 정답 예시에서는 이렇게 생긴 빈칸에 NULL을 입력해두었는데 그렇게 하려면 COALESCE함수를 사용하여 (지정하고자 하는 컬럼, 원하는 지정값)을 넣을 수 있다.