
집합연산자를 사용해 두 개 이상의 테이블에서 조인을 사용하지 않고 연관된 데이터를 조회할 수 있습니다. 집합 연산자는 여러 개의 결과 집합 간의 연산을 통해 결합하는 방식을 사용합니다. 결과적으로, 2개 이상의 질의 결과를 하나의 결과로 만들어 줍니다. 집합 연산자는 서로 다른 테이블에서 유사한 형태의 결과(동일한 컬럼구조) 를 반환하는 것을 하나의 결과로 합치고자 할 때와 동일한 테이블에서 서로 다른 질의를 수행해 결과를 합치고자 할 때 사용할 수 있습니다.
이외에도, 튜닝 관점에서 실행계획을 분리하고자 하는 목적으로도 사용할 수 있습니다. SELECT 절의 컬럼 수가 동일하고 SELECT 절의 동일 위치에 존재하는 칼럼의 데이터 타입이 동일해야 합니다. 그렇지 않으면 데이터베이스 오류를 반환합니다.
UNION
개별 SQL 문의 결과에 대해 합집합 연산을 수행합니다. 중복된 행은 하나의 행으로 만들고 자동으로 정렬합니다.
UNION ALL
개발 SQL 문의 결과에 대해 합집합 연산을 수행하며, 중복된 행도 그대로 표시됩니다. 일반적으로 여러 질의 경과가 상호 배타적일 때 많이 사용합니다. 개별 SQL 문의 결과가 서로 중복되지않으면 UNION과 결과가 동일합니다.
INTERSECT
개별 SQL 문의 결과에 대해 교집합 연산을 수행한다. 중복된 행은 하나의 행으로 만듭니다.
MINUS
개별 SQL 문의 결과에 대해 차집합 연산을 수행합니다.MINUS 연산자는 NOT EXISTS 또는 NOT IN 서브 쿼리를 이용한 SQL 문으로도 변경할 수 있습니다.
SELECT TEAM_ID, PLYAER_NAME, POSITION, BACK_NO, HEIGHT
FROM PLAYER
WHERE TEAM_ID = 'KO2'
MINUS
SELECT TEAM_ID, PLYAER_NAME, POSITION, BACK_NO, HEIGHT
FROM PLAYER
WHERE POSITION = 'MF'
ORDER BY 1,2,3,4,5
SELECT TEAM_ID, PLYAER_NAME, POSITION, BACK_NO, HEIGHT
FROM PLAYER
WHERE TEAM_ID = 'KO2'
AND NOT EXISTS(
SELECT TEAM_ID, PLYAER_NAME, POSITION, BACK_NO, HEIGHT
FROM PLAYER
WHERE POSITION = 'MF'
)
ORDER BY 1,2,3,4,5
SELECT DISTINCT
TEAM_ID, PLYAER_NAME, POSITION, BACK_NO, HEIGHT
FROM PLAYER
WHERE TEAM_ID = 'KO2'
AND POSITION <> 'MF'
ORDER BY 1,2,3,4,5;
SELECT TEAM_ID, PLYAER_NAME, POSITION, BACK_NO, HEIGHT
FROM PLAYER
WHERE TEAM_ID = 'KO2'
AND EXISTS (
SELECT TEAM_ID, PLYAER_NAME, POSITION, BACK_NO, HEIGHT
FROM PLAYER
WHERE POSITION = 'GK'
)
ORDER BY 1,2,3,4,5
UNION ALL을 제외한 다른 집합 연산자는 해당 집합 연산을 수행한 후, 결과에서 중복된 건을 배제하는 작업을 수행합니다. 집합 연산자를 사용해 만들어지는 SQL 문의 형태는 다음과 같습니다.
SELECT COLUMN1, COLUMN2...
FROM TABLE1
[WHERE CONDITION]
[GROUP BY COLUMN]
[HAVING GROUP CONDITION]
집합연산자
SELECT COLUMN1, COLUMN2...
FROM TABLE2
[WHERE CONDITION]
[GROUP BY COLUMN]
[HAVING GROUP CONDITION]
[ORDER BY COLUMN OR EXP [ ASC OR DESC ]]
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 1
SELECT 절의 칼럼 수가 동일하고 SELECT 절의 동일 위치에 존재하는 칼럼의 데이터 타입이 동일하다면, 어떤 형태의 SELECT 문이라도 이용할 수 있습니다. 즉, 서로 완전히 다른 형태의 SELECT 문 사이에도 집합 연산자를 사용할 수 있습니다. ORDER BY 절은 집합 연산을 적용한 최종 결과에 대해 정렬을 수행하므로 마지막에 한 번만 기술합니다. 두 집합간 중복된 건을 확인해보고자 할때는 아래와 같은 SQL을 사용할 수 있습니다.
SELECT TEAM_ID, PLYAER_NAME, POSITION, BACK_NO, HEIGHT, COUNT (*) AS 'DUPCOUNT'
FROM (
SELECT TEAM_ID, PLYAER_NAME, POSITION, BACK_NO, HEIGHT
FROM PLAYER
WHERE TEAM_ID = 'KO2'
UNION ALL
SELECT TEAM_ID, PLAYER_NAME, POSITION, BACK_NO, HEIGHT
FROM PLAYER
WHERE POSITION = 'GK';
)
GROUP BY TEAM_ID, PLYAER_NAME, POSITION, BACK_NO, HEIGHT
HAVING COUNT(*) > 1;
실제로 테이블에는 존재하지 않지만 결과행을 구분하기 위해 SELECT 절의 임의의 칼럼을 추가할 수 있습니다. 특정 목적을 위해 SELECT 절에 임의의 칼럼을 추가하는 것은 다른 모든 SQL 문에서 적용 가능합니다. 집합 연산자의 결과를 표시할때 HEADING 부분은 첫 번째 SQL 문에서 사용되는 ALIAS가 적용된다는 것을 볼 수 있습니다.
-- SQL 문에서 첫 번째 SELECT 절에서는 '표지션', 두 번째 SELECT 절에서는 '팀명' 을 적용했지만 최종 결과에는 '포지션'이 HEADING으로 표시했습니다.
SELECT 'P' AS 구분코드, POSITION, ROUNT(AVG(HEIGHT), 3)
FROM PLAYER
GROUP BY POSITION
UNION ALL
SELECT 'T' AS 구분코드, TEAM_ID, ROUNT(AVG(HEIGHT), 3)
FROM PLAYER
GROUP BY TEAM_ID