2.2.2 집합 연산자
- 집합연산자 사용 시 여러 개의 질의 결과를 연결하여 하나로 결합함
- SELECT 절의 칼럼 수가 동일하고 SELECT 절의 동일 위치에 존재하는 칼럼의 데이터 타입이 상호 교환 가능하다
- UNION, INTERSECT, EXCEPT는 중복된 행을 하나의 행으로 만들지만, UNION ALL은 중복된 행을 하나의 행으로 만들어주지 않고, 중복된 결과가 항상 존재한다

합집합
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;
- WHERE 절에 IN 또는 OR 연산자로도 변환이 가능
- 결과 행을 구분하기 위해 SELECT 절에 칼럼('구분코드')를 추가할 수 있다는 것을 위 쿼리에서 알 수 있다.
- 구분코드, 포지션, 평균키라는 칼럼을 가진 결과가 생성되었고, 팀명 대신 포지션이라는 말이 먼저 나왔기에 첫번째 SQL 문에서 사용된 HEADING이 적용되었다.
차집합
- ORACLE에서는 MINUS가 사용되고 SQL Server에서는 EXCEPT가 사용된다
- 논리연산자로는 <>가 사용될 수 있다.
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE TEAM_ID = 'K02'
AND POSITION <> 'MF'
ORDER BY 1, 2, 3, 4, 5;
NOT EXISTS 또는 NOT IN 서브쿼리를 이용한 SQL 문으로도 변경 가능
NOT EXISTS
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER X
WHERE TEAM_ID = 'K02'
AND NOT EXISTS(SELECT 1 FROM PLAYER Y
WHERE Y.PLAYER_ID = X.PLAYER_ID AND POSITION = 'MF')
ORDER BY 1, 2, 3, 4, 5;
NOT IN
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE TEAM_ID = 'K02'
AND PLAYER NOT IN (SELECT PLAYER_ID FROM PLAYER
WHERE POSITION = 'MF')
ORDER BY 1, 2, 3, 4, 5;
교집합
INTERSECT로 표현 가능
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;
논리연산자 AND
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE TEAM_ID = 'K02'
AND POSITION = 'GK'
ORDER BY 1, 2, 3, 4, 5;
EXISTS 또는 IN 서브쿼리를 이용한 SQL 문으로 변경 가능
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER X
WHERE X.TEAM_ID = 'K02'
AND EXISTS(SELECT 1
FROM PLAYER Y
WHERE Y.PLAYER_ID = X.PLAYER_ID
AND Y.POSITION = 'GK')
ORDER BY 1, 2, 3, 4, 5;
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE TEAM_ID = 'K02'
AND PLAYER_ID IN(SELECT PLAYER_ID
FROM PLAYER
WHERE POSITION = 'GK')
ORDER BY 1, 2, 3, 4, 5;