소스: sql-src/mid_04_set_ops/01_union.sql. 샘플 스키마에 orders_2024, orders_2025 두 테이블을 추가했습니다. 둘 다 orders 와 같은 구조이며, 연도별로 나뉜 주문 기록이라고 가정합니다. 가나상사·마바유통은 두 해 모두 주문한 고객입니다.
SELECT
cust
FROM orders_2024
UNION
SELECT
cust
FROM orders_2025
ORDER BY cust;CUST
--------
가나상사
다라전자
마바유통
사아물산
자차상사
카타무역
타차유통
파하공업
하파상사
(9행)2024년 6곳, 2025년 5곳인데 결과는 9행입니다. 가나상사와 마바유통이 두 해 모두 있어 겹치는 2곳이 하나로 합쳐졌습니다.
SELECT
cust
FROM orders_2024
UNION ALL
SELECT
cust
FROM orders_2025
ORDER BY cust;CUST
--------
가나상사
가나상사
다라전자
마바유통
마바유통
사아물산
자차상사
카타무역
타차유통
파하공업
하파상사
(11행)6 + 5 = 11행 그대로입니다. 가나상사와 마바유통이 두 번씩 나와 예제 1 과 차이가 정확히 2행입니다. "몇 명이 주문했나"에는 UNION, "주문이 총 몇 건인가"에는 UNION ALL 이 맞습니다.
SELECT
id
, cust
FROM orders_2024
UNION
SELECT
id
FROM orders_2025;예상 오류: Column count does not matchSELECT
cust
FROM orders_2024
UNION
SELECT
amt
FROM orders_2025;예상 오류: Data conversion error converting "가나상사"첫 오류는 컬럼 개수(2개 vs 1개)가 안 맞아 실행 전에 바로 걸러졌습니다. 두 번째는 개수는 맞지만 자리(문자 cust ↔ 숫자 amt)가 안 맞아, DB 가 "가나상사"를 숫자로 바꾸려다 실패했습니다. 실무에서는 컬럼 순서를 맞바꿔 넣는 실수로 두 번째 오류를 자주 만납니다.
SELECT
cust AS customer
FROM orders_2024
UNION
SELECT
cust
FROM orders_2025
ORDER BY customer;CUSTOMER
--------
가나상사
다라전자
마바유통
사아물산
자차상사
카타무역
타차유통
파하공업
하파상사
(9행)결과 컬럼 이름이 CUSTOMER입니다. 첫 SELECT 에서 붙인 별칭이 전체 결과의 이름이 되므로, 뒤 SELECT 는 별칭을 붙이지 않아도 됩니다. ORDER BY 에도 이 이름(customer)을 씁니다.
SELECT cust FROM orders_2024 ORDER BY cust UNION SELECT cust FROM orders_2025;예상 오류: Syntax error in SQL statement첫 번째 SELECT 뒤에 ORDER BY 를 바로 붙이면 UNION 앞에서 문법이 끊깁니다. 예제 1·2·4 처럼 ORDER BY 는 항상 맨 끝, 전체 결과에 한 번만 씁니다.
SELECT
cust
, amt
, '2024' AS yr
FROM orders_2024
UNION ALL
SELECT
cust
, amt
, '2025' AS yr
FROM orders_2025
ORDER BY yr, cust;CUST | AMT | YR
---------+-----+-----
가나상사 | 500 | 2024
다라전자 | 300 | 2024
마바유통 | 700 | 2024
사아물산 | 200 | 2024
자차상사 | 450 | 2024
카타무역 | 150 | 2024
가나상사 | 600 | 2025
마바유통 | 800 | 2025
타차유통 | 500 | 2025
파하공업 | 250 | 2025
하파상사 | 300 | 2025
(11행)합친 결과만 보면 어느 테이블에서 온 행인지 알 수 없으므로, 리터럴 값 '2024'·'2025' 를 컬럼으로 하나 추가했습니다. 이렇게 하면 UNION ALL 로 합쳐도 각 행이 어느 해 데이터인지 그대로 구분됩니다.