집합 연산자(Set Operator)는 두 개 이상의 테이블에서 조인을 사용하지 않고 연관된 데이터를 조회하는 방법 중 하나로, 여러 개의 쿼리 결과를 결합하여 하나의 결과로 만드는 방식이다.
집합 연산자는 다음과 같은 종류가 있다.

집합 연산자를 사용할 때에는 다음과 같은 제약조건이 있다.
SELECT PLAYER_NAME, BACK_NO
FROM PLAYER
WHERE TEAM_ID = 'K02'
UNION
SELECT PLAYER_NAME, BACK_NO
FROM PLAYER
WHERE TEAM_ID = 'K07'
ORDER BY PLAYER_NAME;
이 쿼리는 ‘K02’ 팀과 ‘K07’ 팀에 속한 선수의 이름과 백넘버를 중복 없이 하나의 결과로 반환한다.
SELECT PLAYER_NAME, BACK_NO
FROM PLAYER
WHERE TEAM_ID = 'K02'
UNION ALL
SELECT PLAYER_NAME, BACK_NO
FROM PLAYER
WHERE TEAM_ID = 'K07'
ORDER BY PLAYER_NAME;
이 쿼리는 ‘K02’ 팀과 ‘K07’ 팀에 속한 선수의 이름과 백넘버를 중복을 포함하여 모두 반환한다.
SELECT PLAYER_NAME, BACK_NO
FROM PLAYER
WHERE TEAM_ID = 'K02'
INTERSECT
SELECT PLAYER_NAME, BACK_NO
FROM PLAYER
WHERE TEAM_ID = 'K07';
이 쿼리는 ‘K02’ 팀과 ‘K07’ 팀에 모두 속한 선수의 이름과 백넘버를 반환한다.
SELECT PLAYER_NAME, BACK_NO
FROM PLAYER
WHERE TEAM_ID = 'K02'
EXCEPT
SELECT PLAYER_NAME, BACK_NO
FROM PLAYER
WHERE TEAM_ID = 'K07';
이 쿼리는 ‘K02’ 팀에 속해 있으나 ‘K07’ 팀에는 속하지 않은 선수의 이름과 백넘버를 반환한다.
집합 연산자는 다음과 같은 상황에서 유용하게 사용할 수 있다.
소속이 삼성블루윙즈팀인 선수들과 전남드레곤즈팀인 선수들에 대한 내용을 모두 보고 싶다.
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE TEAM_ID = 'K02'
UNION
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE TEAM_ID = 'K07';
이 SQL문은 ‘K02’팀과 ‘K07’팀 선수들의 정보를 중복 없이 반환한다.
소속이 삼성블루윙즈팀인 선수들과 포지션이 골키퍼(GK)인 선수들을 모두 보고 싶다.
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE TEAM_ID = 'K02'
UNION
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE POSITION = 'GK';
이 SQL문은 ‘K02’팀 선수들과 골키퍼 포지션 선수들의 정보를 중복 없이 반환한다.
포지션별 평균키와 팀별 평균키를 알고 싶다.
SELECT 'P' 구분코드, POSITION 포지션, AVG(HEIGHT) 평균키
FROM PLAYER
GROUP BY POSITION
UNION
SELECT 'T' 구분코드, TEAM_ID 팀명, AVG(HEIGHT) 평균키
FROM PLAYER
GROUP BY TEAM_ID
ORDER BY 1;
아래는 위 쿼리문에 관한 결과값의 예시이다.
| 구분코드 | 포지션/팀명 | 평균키 |
|---|---|---|
| P | Forward | 185.0 |
| P | Guard | 172.5 |
| P | Center | 205.0 |
| T | A | 185.0 |
| T | B | 190.0 |
이 SQL문은 포지션별 평균 키와 팀별 평균 키를 각각 계산한 후, 그 결과를 합집합으로 반환한다.
소속이 삼성블루윙즈팀이면서 포지션이 미드필더(MF)가 아닌 선수들의 정보를 보고 싶다.
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE TEAM_ID = 'K02'
MINUS
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE POSITION = 'MF'
ORDER BY 1, 2, 3, 4, 5;
이 SQL문은 ‘K02’팀 선수들 중 포지션이 미드필더(MF)인 선수들을 제외한 나머지 선수들의 정보를 반환한다.
소속이 삼성블루윙즈팀이면서 포지션이 골키퍼(GK)인 선수들의 정보를 보고 싶다.
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE TEAM_ID = 'K02'
INTERSECT
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE POSITION = 'GK'
ORDER BY 1, 2, 3, 4, 5;
이 SQL문은 ‘K02’팀 선수들 중 포지션이 골키퍼(GK)인 선수들의 정보를 반환한다.