33. SQL - 반복해서 틀리는 것들 (#5) - UNION ALL vs CROSS JOIN (1)

Jason·2026년 1월 22일

SQL

목록 보기
29/47

🤯 내가 헷갈렸던 것

-- ❌ 내가 쓴 잘못된 코드
SELECT product_name FROM inventory
UNION ALL
CROSS JOIN (SELECT size_name FROM sizes)

UNION ALL이랑 CROSS JOIN을 섞어서 씀 ㅋㅋ


💡 핵심 차이

문법동작비유
UNION ALL위아래로 합침 (행 추가)종이 2장 위아래로 붙이기
CROSS JOIN모든 조합 곱하기종이 2장 격자로 조합

📊 UNION ALL - 행을 합친다

SELECT name FROM table_A
UNION ALL
SELECT name FROM table_B

table_A:

name
----
사과
바나나

table_B:

name
----
딸기
포도

결과: 2 + 2 = 4행

name
----
사과
바나나
딸기
포도

위아래로 쌓임!


📊 CROSS JOIN - 모든 조합을 만든다

SELECT a.name, b.color
FROM fruits a
CROSS JOIN colors b

fruits:

name
----
사과
바나나

colors:

color
-----
빨강
노랑

결과: 2 × 2 = 4행

name   | color
-------|------
사과   | 빨강
사과   | 노랑
바나나 | 빨강
바나나 | 노랑

모든 조합이 생김!


🎯 언제 뭘 쓰나?

상황사용
두 쿼리 결과를 합쳐서 보고 싶을 때UNION ALL
NULL 채우면서 기존 데이터 유지할 때UNION ALL
모든 경우의 수/조합 만들 때CROSS JOIN
A × B × C 곱집합 필요할 때CROSS JOIN

✅ 올바른 코드

문제: 모든 음료 × 모든 사이즈 조합

-- ✅ 정답
SELECT i.product_name, s.size_name
FROM inventory i
CROSS JOIN sizes s

UNION ALL은 필요 없음!


📝 같이 쓰는 경우

NULL 행 확장할 때는 둘 다 씀:

-- 1. 기존 데이터 (NULL 아닌 것)
SELECT product_id, category
FROM products
WHERE category IS NOT NULL

UNION ALL  -- 위아래로 합침!

-- 2. NULL인 것 × (0,1,2) 조합
SELECT p.product_id, c.category
FROM products p
CROSS JOIN (  -- 모든 조합!
    SELECT 0 category
    UNION ALL SELECT 1
    UNION ALL SELECT 2
) c
WHERE p.category IS NULL

🔥 한줄 정리

UNION ALL = 합치기 (+)
CROSS JOIN = 곱하기 (×)


🤔 순서 바꾸면 결과 달라지나?

UNION ALL:

SELECT * FROM A UNION ALL SELECT * FROM B
-- vs
SELECT * FROM B UNION ALL SELECT * FROM A

→ 행 순서만 다름, 데이터는 같음

CROSS JOIN:

SELECT * FROM A CROSS JOIN B
-- vs
SELECT * FROM B CROSS JOIN A

→ 행 순서만 다름, 조합은 같음

결론: 순서 바꿔도 결과 데이터는 같다! (행 정렬 순서만 다름)


🤝 공통점

공통점설명
ON 조건 없음둘 다 JOIN 조건이 필요 없음!
두 테이블 결합둘 다 2개를 합치는 역할
결과 행 증가둘 다 원본보다 행이 늘어남

⚔️ 차이점 (핵심!)

구분UNION ALLCROSS JOIN
방식세로로 합침가로로 조합
결과 행 수A + BA × B
컬럼같아야 함달라도 됨

🔥 최종 한줄 정리

UNION ALL = 세로로 쌓기 (컬럼 같아야 함)
CROSS JOIN = 가로로 곱하기 (모든 조합)

profile
Data Analyst | Thoughts Become Things. 할 수 있다고 생각하면 할 수 있다. 할 수 없다고 생각하면 할 수 없다. | www.linkedin.com/in/명수-제-7ab843200

0개의 댓글