집합 연산자는 두 개 이상의 SELECT
문의 결과 집합을 수직으로 연결하여 하나의 통합된 결과 집합으로 만드는 데 사용됨. JOIN
이 테이블을 수평으로 연결하는 것과는 대조적임.
집합 연산자를 사용하기 위해서는 합치려는 모든 SELECT
문이 다음의 규칙을 준수해야 함.
SELECT
문의 조회 컬럼 개수가 동일해야 함.SELECT
문의 대응되는 위치의 컬럼들은 서로 호환 가능한 데이터 타입을 가져야 함. (예: NUMBER
와 NUMBER
, VARCHAR2
와 CHAR
)SELECT
문의 컬럼명(또는 별칭)을 따라감.ORDER BY
절 위치: 정렬이 필요한 경우, ORDER BY
절은 가장 마지막 SELECT
문 뒤에 한 번만 사용해야 함.연산자 | 설명 | 중복 제거 | 자동 정렬 |
---|---|---|---|
UNION ALL | 두 결과 집합을 그대로 합침. | ❌ (중복 허용) | ❌ |
UNION | 두 결과 집합의 합집합을 구함. | ✅ | ✅ |
INTERSECT | 두 결과 집합의 교집합을 구함. | ✅ | ✅ |
MINUS | 두 결과 집합의 차집합을 구함. (첫 번째 결과 - 두 번째 결과) | ✅ | ✅ |
UNION ALL
(합집합, 중복 포함)SELECT
문의 결과를 단순히 이어 붙임./*
* -- UNION ALL 예시: 모든 활동 사용자 ID 목록 조회 --
* '좋아요'를 누른 사용자 목록과 '댓글'을 작성한 사용자 목록을
* 중복에 상관없이 모두 합쳐서 조회함.
*/
SELECT user_id FROM Likes
UNION ALL
SELECT user_id FROM Comments;
UNION
(합집합, 중복 제거)SELECT
문의 결과를 합치면서 중복된 행은 제거함.UNION ALL
보다 성능 부담이 있음./*
* -- UNION 예시: 순수 활동 사용자 ID 목록 조회 --
* '좋아요' 또는 '댓글'을 작성한 모든 사용자의 ID를 중복 없이 조회함.
* 결과는 기본적으로 오름차순 정렬됨.
*/
SELECT user_id FROM Likes
UNION
SELECT user_id FROM Comments;
INTERSECT
(교집합)SELECT
문의 결과에 모두 공통으로 존재하는 행만 반환함./*
* -- INTERSECT 예시: 열성 사용자 ID 목록 조회 --
* '좋아요'도 누르고 '댓글'도 작성한 사용자의 ID를 조회함.
*/
SELECT user_id FROM Likes
INTERSECT
SELECT user_id FROM Comments;
MINUS
(차집합)SELECT
문의 결과에서 두 번째 SELECT
문의 결과와 일치하는 행을 제외한 나머지를 반환함.A MINUS B
≠ B MINUS A
)./*
* -- MINUS 예시: '좋아요'만 누른 사용자 ID 목록 조회 --
* '좋아요'를 누른 사용자 중에서, '댓글'을 작성한 사용자는 제외하고 조회함.
*/
SELECT user_id FROM Likes
MINUS
SELECT user_id FROM Comments;
※ DBMS별 문법 차이:
MINUS
는 Oracle에서 사용하는 키워드임. SQL Server와 PostgreSQL에서는EXCEPT
키워드가 동일한 기능을 수행함. MySQL은MINUS
나EXCEPT
를 지원하지 않으므로,LEFT JOIN
이나NOT IN
등을 활용하여 차집합을 구현해야 함.
INTERSECT
와 MINUS
는 각각 IN
서브쿼리와 NOT IN
서브쿼리로 유사하게 구현할 수 있음. 그러나 집합 연산자는 다음과 같은 장점을 가짐.
A INTERSECT B
와 같이 개발자의 의도를 명확하고 직관적으로 표현함.UNION
vs UNION ALL
: 두 연산자의 가장 큰 차이인 중복 제거와 자동 정렬 여부를 묻는 문제가 가장 빈번하게 출제됨. 쿼리 결과의 행 수를 예측하는 유형으로 자주 나옴.MINUS
연산의 순서: A MINUS B
와 B MINUS A
의 결과가 다르다는 점을 이용한 함정 문제가 출제될 수 있음.SELECT
문의 컬럼 개수나 데이터 타입이 다른 경우, 문법 오류가 발생한다는 점을 알고 있어야 함.ORDER BY
위치: ORDER BY
절은 반드시 전체 문장의 맨 마지막에 와야 함. 중간 SELECT
문에 ORDER BY
를 사용하면 오류가 발생함.MINUS
(Oracle)와 EXCEPT
(SQL Server)의 차이를 묻는 문제가 출제될 수 있음. SQLD는 Oracle 기반이므로 MINUS
를 기준으로 학습하는 것이 유리함.