
-- ❌ 내가 쓴 잘못된 코드
SELECT product_name FROM inventory
UNION ALL
CROSS JOIN (SELECT size_name FROM sizes)
UNION ALL이랑 CROSS JOIN을 섞어서 씀 ㅋㅋ
| 문법 | 동작 | 비유 |
|---|---|---|
| UNION ALL | 위아래로 합침 (행 추가) | 종이 2장 위아래로 붙이기 |
| CROSS JOIN | 모든 조합 곱하기 | 종이 2장 격자로 조합 |
SELECT name FROM table_A
UNION ALL
SELECT name FROM table_B
table_A:
name
----
사과
바나나
table_B:
name
----
딸기
포도
결과: 2 + 2 = 4행
name
----
사과
바나나
딸기
포도
→ 위아래로 쌓임!
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 ALL | CROSS JOIN |
|---|---|---|
| 방식 | 세로로 합침 | 가로로 조합 |
| 결과 행 수 | A + B | A × B |
| 컬럼 | 같아야 함 | 달라도 됨 |
UNION ALL = 세로로 쌓기 (컬럼 같아야 함)
CROSS JOIN = 가로로 곱하기 (모든 조합)
