집합 연산자란?
집합 연산자는 여러 SQL 쿼리 결과를 하나의 집합처럼 보고, 그 결과들을 결합하는 연산자다.
합집합은 UNION, 중복을 허용한 합집합은 UNION ALL, 교집합은 INTERSECT, 차집합은 MINUS로 표현한다.
SQL Server에서는 MINUS 대신 EXCEPT를 사용한다. 따라서 집합 연산자는 각각의 SELECT 결과를 세로 방향으로 붙이고, 지정한 연산 방식에 따라 하나의 결과로 합치는 기능이라고 보면 된다.
조인과 집합연산자의 차이
조인은 두 테이블의 데이터를 가로 방향으로 붙이는 개념이고, 집합 연산자는 여러 결과를 세로 방향으로 합치는 개념이다
UNION과 UNION ALL
UNION
UNION은 여러 결과를 합친 뒤 중복을 제거해서 반환하는 연산자다.
예시)한국 지사 직원과 미국 지사 직원 정보를 합쳐서 결과보기
SELECT EMP_ID, EMP_NAME
FROM EMPLOYEE_KOREA
UNION
SELECT EMP_ID, EMP_NAME
FROM EMPLOYEE_USA;
두 결과를 UNION하면 내부적으로 정렬이 수행되고 동일한 값은 하나만 남긴다. 따라서 결과를 합칠 때 겹치는 행은 하나로 처리한다
UNION ALL
UNION ALL은 결과를 그대로 이어 붙이는 연산자다.
UNION과 달리 중복 제거를 하지 않고, 정렬도 하지 않는다. 단순히 첫 번째 결과 밑에 두 번째 결과를 붙이는 방식이다.
예시)
SELECT EMP_ID, EMP_NAME
FROM EMPLOYEE_KOREA
UNION ALL
SELECT EMP_ID, EMP_NAME
FROM EMPLOYEE_USA;
결과가 두테이블에 모두 존재하면 UNION ALL 을 사용시 두번 출력된다 결과를 빠르게 단순 결합하고싶다면 UNION ALL이 더 적합하다 실무에서도 중복제거가 필요한게 아니라면 UNION ALL이 더 효율적일수 있다
INTERSECT와 MINUS(EXCEPT)
INTERSECT
INTERSECT는 두 결과의 교집합을 반환하는 연산자다 따라서 양쪽 결과 모두 존재하는 데이터만 출력된다
예시)
SELECT EMP_ID, EMP_NAME
FROM EMPLOYEE_KOREA
INTERSECT
SELECT EMP_ID, EMP_NAME
FROM EMPLOYEE_USA;
UNION ALL을 제외한 집합 연산자들은 모두 내부적으로 정렬과 중복 제거를 수행한다 그래서 INTERSECT도 단순 비교가 아니라 정리된 집합끼리의 교집합을 구하는 방식이다
MINUS(EXCEPT)
MINUS는 첫 번째 결과에서 두 번째 결과를 뺀 차집합을 반환하는 연산자다.
따라서 A-B 개념이다 SQL Server에서는 같은 의미로 EXCEPT를 사용한다.
예시) 한국 지사 직원 중에서 미국 지사에도 있는 직원 리스트
SELECT EMP_ID, EMP_NAME
FROM EMPLOYEE_KOREA
MINUS
SELECT EMP_ID, EMP_NAME
FROM EMPLOYEE_USA;
MINUS는 첫 번째 쿼리 기준으로 두 번째 쿼리와 겹치는 행을 제거한다
집합 연산자의 특징
- UNION : 정렬 O, 중복 제거 O
- UNION ALL : 정렬 X, 중복 제거 X
- INTERSECT : 정렬 O, 중복 제거 O
- MINUS(EXCEPT) : 정렬 O, 중복 제거 O
성능적 측면에서 UNION ALL이 제일 가볍고 정확한 연산 필요시에는 UNION, INTERSECT, MINUS를 사용한다
집합 연산자의 실행 순서
집합 연산자를 여러개 섞어서 사용할때 우선순위가 있는데 INTERSECT가 가장 먼저 실행되고, 그다음은 UNION, UNION ALL, MINUS(EXCEPT)가 같은 우선순위를 가진다
예시)
SELECT EMP_ID FROM EMPLOYEE_KOREA
UNION
SELECT EMP_ID FROM EMPLOYEE_USA
INTERSECT
SELECT EMP_ID FROM EMPLOYEE_KOREA;
괄호가 없기 때문에 B INTERSECT C가 먼저 실행되고, 그 결과를 A와 UNION하게 된다.
집합 연산자는 위에서 아래로만 무조건 읽는 것이 아니라, INTERSECT 우선 실행을 먼저 고려해야 한다.
괄호를 사용한 실행 순서 변경
집합 연산자에서 괄호를 사용하면 실행순서를 바꿀수 있다 이때 괄호가 우선순위가 가장 높다
예시)
(
SELECT EMP_ID FROM EMPLOYEE_KOREA
UNION
SELECT EMP_ID FROM EMPLOYEE_USA
)
INTERSECT
SELECT EMP_ID FROM EMPLOYEE_KOREA;
먼저 A와 B를 UNION한 결과를 만든 뒤, 그 결과를 C와 INTERSECT하게 된다.
결국 집합 연산자 문제는 우선순위와 괄호 여부를 함께 봐야 한다는 점이 중요하다.
컬럼명은 첫 번째 쿼리를 따른다
집합 연산자의 결과 컬럼명은 가장 처음 오는 SELECT문의 컬럼명을 따른다
집합 연산자 사용 시 주의사항
- 집합 연산자에 참여하는 SELECT문은 컬럼 수가 반드시 같아야 한다
- 자료형이 맞아야한다
- ORDER BY는 마지막에만 쓴다
예시)
SELECT EMP_ID, EMP_NAME
FROM EMPLOYEE_KOREA
UNION
SELECT EMP_ID, EMP_NAME
FROM EMPLOYEE_USA
ORDER BY EMP_ID;
이렇게 하면 UNION으로 합쳐진 전체 결과를 마지막에 EMP_ID 기준으로 정렬하게 된다.
따라서 개별 SELECT 결과마다 ORDER BY를 거는 것이 아니라, 최종 결과 전체에 대해서만 ORDER BY가 가능하다
'📘꼬부기의 성장서재 > 이기적SQLD 기출문제' 카테고리의 다른 글
| 윈도우 함수 (0) | 2026.04.10 |
|---|---|
| 그룹 함수 (0) | 2026.04.08 |
| SQL 표준 조인 정리 (0) | 2026.04.02 |
| JOIN (0) | 2026.04.01 |
| ORDER BY절 (0) | 2026.03.31 |