가능하다.
2️⃣ USER_ID 값이 달라도 UNION ALL이 되나?
👉 UNION ALL은 "컬럼 개수 & 데이터 타입"만 맞으면 된다!
UNION은 중복 제거, UNION ALL은 중복 제거 X
USER_ID가 온라인에선 숫자(INT), 오프라인에선 NULL인데 둘 다 같은 NULL 가능
→ NULL은 데이터 타입이 따로 없고, 어떤 타입에도 포함될 수 있음!
✅ 그래서 합칠 수 있어!
3️⃣ DATE_FORMAT()에 별칭(SALES_DATE) 다르게 줘도 되는 이유?
👉 UNION ALL은 "첫 번째 SELECT" 기준으로 컬럼명을 정한다!
예를 들어 아래처럼 되어 있어도 문제없어:
SELECT DATE_FORMAT(ONS.SALES_DATE, '%Y-%m-%d') AS 판매날짜, ...
UNION ALL
SELECT DATE_FORMAT(OFS.SALES_DATE, '%Y-%m-%d') AS 날짜, ...
만약 UNION ALL이나 UNION을 사용했을 때 컬럼 개수와 데이터 타입이 같지만, 서로 다른 의미를 가진 컬럼이 포함된다면? 어떻게 구분할 수 있을까?
1️⃣ 컬럼명이 다르면? (문제 없음!)
SELECT ONS.ORDER_DATE AS SALES_DATE, ONS.PRODUCT_ID, ONS.USER_ID, ONS.SALES_AMOUNT
FROM ONLINE_SALE AS ONS
UNION ALL
SELECT OFS.PURCHASE_DATE AS SALES_DATE, OFS.PRODUCT_ID, NULL AS USER_ID, OFS.SALES_AMOUNT
FROM OFFLINE_SALE AS OFS;
✅ 첫 번째 SELECT에서 SALES_DATE라고 했고,
✅ 두 번째 SELECT에서는 PURCHASE_DATE였지만,
👉 UNION ALL은 첫 번째 SELECT 기준으로 컬럼명을 맞추기 때문에 최종적으로 "SALES_DATE"가 됨.
💡 즉, 컬럼명이 달라도 문제없다! 첫 번째 SELECT 기준으로 자동 정해짐.
🎯 2️⃣ 컬럼명이 같지만 의미가 다르면? (헷갈릴 수 있음)
이게 중요한 포인트야! 만약 컬럼 개수와 데이터 타입이 같은데, 의미가 다른 컬럼이 섞이면?
👉 헷갈릴 수 있음!
SELECT ONS.ORDER_DATE AS DATE, ONS.PRODUCT_ID, ONS.USER_ID, ONS.SALES_AMOUNT
FROM ONLINE_SALE AS ONS
UNION ALL
SELECT OFS.PURCHASE_DATE AS DATE, OFS.PRODUCT_ID, NULL AS USER_ID, OFS.SALES_AMOUNT
FROM OFFLINE_SALE AS OFS;
💡 여기서 ORDER_DATE와 PURCHASE_DATE는 사실 다르게 쓰여야 하는데, 같은 DATE 컬럼으로 묶임.
👉 이러면 분석할 때 "이 날짜가 주문일인지 구매일인지" 헷갈릴 수 있음!
🔥 해결 방법 1: 명확한 별칭을 사용하자!
SELECT ONS.ORDER_DATE AS ORDER_OR_PURCHASE_DATE, ONS.PRODUCT_ID, ONS.USER_ID, ONS.SALES_AMOUNT
FROM ONLINE_SALE AS ONS
UNION ALL
SELECT OFS.PURCHASE_DATE AS ORDER_OR_PURCHASE_DATE, OFS.PRODUCT_ID, NULL AS USER_ID, OFS.SALES_AMOUNT
FROM OFFLINE_SALE AS OFS;
✅ 이렇게 하면 최종 컬럼명은 "ORDER_OR_PURCHASE_DATE"로 정리됨 → 덜 헷갈림!
🔥 해결 방법 2: 소스(Source) 컬럼 추가하기
ONLINE_SALE인지 OFFLINE_SALE인지 구분하려면, 아예 "소스" 컬럼을 추가하면 됨!
SELECT ONS.ORDER_DATE AS SALES_DATE, ONS.PRODUCT_ID, ONS.USER_ID, ONS.SALES_AMOUNT, 'ONLINE' AS SOURCE
FROM ONLINE_SALE AS ONS
UNION ALL
SELECT OFS.PURCHASE_DATE AS SALES_DATE, OFS.PRODUCT_ID, NULL AS USER_ID, OFS.SALES_AMOUNT, 'OFFLINE' AS SOURCE
FROM OFFLINE_SALE AS OFS;
UNION 또는 UNION ALL을 사용할 때, SELECT문의 컬럼 순서는 반드시 같아야 할까?
컬럼 순서가 왜 중요할까?
UNION ALL이나 UNION은 컬럼 개수와 데이터 타입만 맞으면 합칠 수 있어요.
하지만, 각 SELECT문의 컬럼 순서가 다르면 엉뚱한 데이터가 들어갈 수 있어요!
SELECT ONS.ORDER_DATE AS SALES_DATE, ONS.PRODUCT_ID, ONS.USER_ID, ONS.SALES_AMOUNT
FROM ONLINE_SALE AS ONS
UNION ALL
SELECT OFS.PRODUCT_ID, OFS.PURCHASE_DATE AS SALES_DATE, NULL AS USER_ID, OFS.SALES_AMOUNT
FROM OFFLINE_SALE AS OFS;
🚨 문제점
첫 번째 SELECT에서는 ORDER_DATE → PRODUCT_ID → USER_ID → SALES_AMOUNT 순서인데,
두 번째 SELECT에서는 PRODUCT_ID → PURCHASE_DATE → USER_ID → SALES_AMOUNT 순서로 다름!
그럼 PRODUCT_ID가 날짜 컬럼(SALES_DATE)로 들어가고, PURCHASE_DATE가 PRODUCT_ID로 들어가서 데이터가 꼬여버림.
✅ 올바른 예시 (순서 맞춤)
SELECT ONS.ORDER_DATE AS SALES_DATE, ONS.PRODUCT_ID, ONS.USER_ID, ONS.SALES_AMOUNT
FROM ONLINE_SALE AS ONS
UNION ALL
SELECT OFS.PURCHASE_DATE AS SALES_DATE, OFS.PRODUCT_ID, NULL AS USER_ID, OFS.SALES_AMOUNT
FROM OFFLINE_SALE AS OFS;
✔ 각 SELECT문의 컬럼 순서를 동일하게 맞췄음
✔ SALES_DATE → PRODUCT_ID → USER_ID → SALES_AMOUNT 순서가 동일!
✔ 올바르게 합쳐짐!
💡 결론: 컬럼 개수 & 데이터 타입 & 순서까지 맞춰야 한다!
✅ 컬럼 개수는 같아야 함
✅ 컬럼의 데이터 타입도 같아야 함
✅ 컬럼의 순서도 맞춰야 함 (순서가 다르면 데이터가 잘못 매칭됨)
2️⃣ UNION ALL은 첫 번째 SELECT의 컬럼명을 따라간다!
3️⃣ 컬럼 개수 & 데이터 타입만 맞으면 UNION ALL 가능!
4️⃣ 첫 번째 SELECT에서 숫자면, 두 번째 SELECT도 숫자로 맞춰야 한다!