공공부하자개발 · 영어 학습 노트
SQL
SQL 중급서브쿼리·조인·함수·DDL·인덱스0/11 완료
  • 01서브쿼리: 스칼라·인라인 뷰·상관 서브쿼리, DB별 차이
  • 02EXISTS·IN·NOT IN 과 NULL 함정
  • 03조인 심화: INNER·OUTER·SELF·CROSS, Oracle (+)
  • 04집합 연산: UNION·UNION ALL·INTERSECT·MINUS/EXCEPT
  • 05조건 로직: CASE·DECODE·IIF
  • 06NULL 처리 함수
  • 07문자·날짜 함수 DB별 비교
  • 08DDL 과 제약 조건
  • 09인덱스 기초
  • 10집계와 GROUP BY·HAVING
  • 11뷰·시퀀스·자동 증가
사이트 소개개인정보처리방침연락처
© 2026 공부하자
홈 › SQL 중급 › 04 / 11

집합 연산: UNION·UNION ALL·INTERSECT·MINUS/EXCEPT

섹션 6진행 0 / 11
1왜 배우는가2핵심 원리3코드 예제4응용 변형 예제5자주 하는 실수 (Tip)6정리‹ 이전다음 ›

3. 코드 예제

소스: sql-src/mid_04_set_ops/01_union.sql. 샘플 스키마에 orders_2024, orders_2025 두 테이블을 추가했습니다. 둘 다 orders 와 같은 구조이며, 연도별로 나뉜 주문 기록이라고 가정합니다. 가나상사·마바유통은 두 해 모두 주문한 고객입니다.

예제 1: UNION 으로 두 해 주문 고객을 중복 없이 합치기

sql
SELECT
       cust
  FROM orders_2024
UNION
SELECT
       cust
  FROM orders_2025
 ORDER BY cust;
text
CUST
--------
가나상사
다라전자
마바유통
사아물산
자차상사
카타무역
타차유통
파하공업
하파상사
(9행)

2024년 6곳, 2025년 5곳인데 결과는 9행입니다. 가나상사와 마바유통이 두 해 모두 있어 겹치는 2곳이 하나로 합쳐졌습니다.

예제 2: UNION ALL 로 중복을 그대로 유지

sql
SELECT
       cust
  FROM orders_2024
UNION ALL
SELECT
       cust
  FROM orders_2025
 ORDER BY cust;
text
CUST
--------
가나상사
가나상사
다라전자
마바유통
마바유통
사아물산
자차상사
카타무역
타차유통
파하공업
하파상사
(11행)

6 + 5 = 11행 그대로입니다. 가나상사와 마바유통이 두 번씩 나와 예제 1 과 차이가 정확히 2행입니다. "몇 명이 주문했나"에는 UNION, "주문이 총 몇 건인가"에는 UNION ALL 이 맞습니다.

예제 3: 컬럼 수·타입이 안 맞으면 오류

sql
SELECT
       id
     , cust
  FROM orders_2024
UNION
SELECT
       id
  FROM orders_2025;
text
예상 오류: Column count does not match
sql
SELECT
       cust
  FROM orders_2024
UNION
SELECT
       amt
  FROM orders_2025;
text
예상 오류: Data conversion error converting "가나상사"

첫 오류는 컬럼 개수(2개 vs 1개)가 안 맞아 실행 전에 바로 걸러졌습니다. 두 번째는 개수는 맞지만 자리(문자 cust ↔ 숫자 amt)가 안 맞아, DB 가 "가나상사"를 숫자로 바꾸려다 실패했습니다. 실무에서는 컬럼 순서를 맞바꿔 넣는 실수로 두 번째 오류를 자주 만납니다.

예제 4: 컬럼 이름은 첫 SELECT 기준

sql
SELECT
       cust AS customer
  FROM orders_2024
UNION
SELECT
       cust
  FROM orders_2025
 ORDER BY customer;
text
CUSTOMER
--------
가나상사
다라전자
마바유통
사아물산
자차상사
카타무역
타차유통
파하공업
하파상사
(9행)

결과 컬럼 이름이 CUSTOMER입니다. 첫 SELECT 에서 붙인 별칭이 전체 결과의 이름이 되므로, 뒤 SELECT 는 별칭을 붙이지 않아도 됩니다. ORDER BY 에도 이 이름(customer)을 씁니다.

예제 5: ORDER BY 를 중간에 쓰면 오류

sql
SELECT cust FROM orders_2024 ORDER BY cust UNION SELECT cust FROM orders_2025;
text
예상 오류: Syntax error in SQL statement

첫 번째 SELECT 뒤에 ORDER BY 를 바로 붙이면 UNION 앞에서 문법이 끊깁니다. 예제 1·2·4 처럼 ORDER BY 는 항상 맨 끝, 전체 결과에 한 번만 씁니다.

예제 6: 구분 컬럼을 추가해 출처 표시

sql
SELECT
       cust
     , amt
     , '2024' AS yr
  FROM orders_2024
UNION ALL
SELECT
       cust
     , amt
     , '2025' AS yr
  FROM orders_2025
 ORDER BY yr, cust;
text
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 로 합쳐도 각 행이 어느 해 데이터인지 그대로 구분됩니다.

예제 직접 실행

아래 폴더의 SQL 파일을 Git Bash 에서 H2 메모리 DB 로 실행합니다. 방언은 파일 안의 SET MODE 로 바꿉니다.

cd sql-src/mid_04_set_ops
ls *.sql
bash ../run.sh <파일>.sql
코드 예제
  • 예제 1: UNION 으로 두 해 주문 고객을 중복 없이 합치기
  • 예제 2: UNION ALL 로 중복을 그대로 유지
  • 예제 3: 컬럼 수·타입이 안 맞으면 오류
  • 예제 4: 컬럼 이름은 첫 SELECT 기준
  • 예제 5: ORDER BY 를 중간에 쓰면 오류
  • 예제 6: 구분 컬럼을 추가해 출처 표시
이전 섹션2 핵심 원리3 / 6다음 섹션4 응용 변형 예제