SQL 집합 연산자: UNION, INTERSECT, MINUS 활용
SQL에서 집합 연산자(Set Operators)는 여러 개의 SELECT 결과를 하나로 결합할 때 사용됩니다.
대표적으로 UNION, UNION ALL, INTERSECT, MINUS(EXCEPT)가 있으며, 이들은 중복 제거 여부 및 데이터 비교 방식에서 차이를 가집니다.
이번 글에서는 각 집합 연산자의 개념과 사용 방법을 샘플 테이블과 함께 알아보겠습니다.
1. UNION: 두 쿼리의 결과를 결합하고 중복 제거
UNION 연산자는 두 개의 SELECT 결과를 하나로 합치되, 중복된 행을 자동으로 제거합니다.
두 쿼리의 열 개수와 데이터 타입이 동일해야 합니다.
SELECT EmployeeName FROM EmployeesA
UNION
SELECT EmployeeName FROM EmployeesB;
위 쿼리는 EmployeesA와 EmployeesB 테이블에서 중복되지 않은 직원명 목록을 출력합니다.
UNION은 기본적으로 중복 제거 과정이 포함되어 있어 결과적으로 정렬된 상태로 반환됩니다.
중복 제거로 인해 실행 속도가 느려질 수 있으므로, 필요에 따라 UNION ALL을 사용할 수도 있습니다.
출력 결과 예시
EmployeeName |
Alice |
Bob |
Jane |
John |
Tom |
2. UNION ALL: 중복 포함하여 두 결과 결합
UNION ALL은 UNION과 동일한 방식으로 결과를 결합하지만, 중복된 데이터를 제거하지 않고 그대로 출력합니다.
SELECT EmployeeName FROM EmployeesA
UNION ALL
SELECT EmployeeName FROM EmployeesB;
이 쿼리는 EmployeesA와 EmployeesB 테이블에서 중복된 직원명도 포함하여 출력합니다.
UNION ALL은 중복 제거 과정이 없으므로 실행 속도가 더 빠르며, 데이터 분석 시 중복 값을 유지해야 할 경우 유용합니다.
출력 결과 예시
EmployeeName |
Alice |
Bob |
Jane |
Jane |
John |
Tom |
3. INTERSECT: 두 쿼리의 공통된 데이터 조회
INTERSECT는 두 개의 SELECT 결과에서 공통으로 존재하는 행만 반환합니다.
SELECT EmployeeName FROM EmployeesA
INTERSECT
SELECT EmployeeName FROM EmployeesB;
이 쿼리는 EmployeesA와 EmployeesB 테이블에서 두 테이블에 공통으로 존재하는 직원명만 출력합니다.
중복 값은 자동으로 제거되며, 정렬된 형태로 반환됩니다.
출력 결과 예시
EmployeeName |
Jane |
4. MINUS: 첫 번째 쿼리 결과에서 두 번째 쿼리 결과를 제외
MINUS 연산자는 첫 번째 SELECT 결과에서 두 번째 SELECT 결과에 존재하는 데이터를 제외하고 반환합니다.
(MySQL에서는 EXCEPT 연산자로 동일한 기능을 수행함.)
SELECT EmployeeName FROM EmployeesA
MINUS
SELECT EmployeeName FROM EmployeesB;
이 쿼리는 EmployeesA 테이블에 존재하지만 EmployeesB 테이블에는 없는 직원명을 출력합니다. MINUS는 중복을 제거한 후 정렬된 상태로 반환됩니다.
출력 결과 예시
EmployeeName |
Alice |
John |
5. EXCEPT: MINUS와 동일한 기능 (MySQL 및 SQL Server에서 사용)
SQL Server와 MySQL에서는 MINUS 대신 EXCEPT 연산자를 사용하여 첫 번째 SELECT 결과에서 두 번째 SELECT 결과를 제외할 수 있습니다.
SELECT EmployeeName FROM EmployeesA
EXCEPT
SELECT EmployeeName FROM EmployeesB;
이 쿼리는 MINUS와 동일하게 EmployeesA 테이블에 있지만 EmployeesB 테이블에는 없는 직원명을 출력합니다.
출력 결과 예시
EmployeeName |
Alice |
John |
6. SQL 집합 연산자 비교 정리
연산자 | 설명 | 중복 제거 여부 | 정렬 여부 |
UNION | 두 개의 SELECT 결과를 결합 | O (중복 제거) | O (자동 정렬) |
UNION ALL | 두 개의 SELECT 결과를 결합 | X (중복 포함) | X (정렬 없음) |
INTERSECT | 두 개의 SELECT 결과에서 공통된 데이터 출력 | O (중복 제거) | O (자동 정렬) |
MINUS | 첫 번째 SELECT 결과에서 두 번째 결과를 제외 | O (중복 제거) | O (자동 정렬) |
EXCEPT | MINUS와 동일 (MySQL, SQL Server에서 사용) | O (중복 제거) | O (자동 정렬) |
7. 결론
✅ UNION / UNION ALL → 여러 SELECT 결과를 하나로 결합.
✅ INTERSECT → 두 테이블의 공통된 데이터를 조회.
✅ MINUS / EXCEPT → 첫 번째 테이블의 데이터에서 두 번째 테이블의 데이터를 제외.
✅ 중복 제거 여부와 실행 속도를 고려하여 적절한 집합 연산자를 선택해야 함.
SQLD 자격증 대비를 위해 각 집합 연산자의 특징과 차이점, 실행 순서를 정확히 이해하고 실습해 보세요!