[SQL] 집합 연산 - UNION, UNION ALL, INTERSECT, MINUS, GROUPING SET
집합 연산
o 여러 개의 SELECT 결과물을 하나의 쿼리로 만드는 연산자
o 여러 개의 SELECT문의 결과(RESULTSET)를 합치는 구문
o 조건
1. RESULTSET의 컬럼의 개수가 같아야 한다.
2. RESULTSET의 컬럼의 타입이 같아야 한다.
-> 데이터는 동일할 필요는 없다.
-> 컬럼 수, 컬럼타입의 기준은 맨 처음 RESULTSET을 기준으로 한다.
3. 없거나 빈 컬럼이면 리터럴로 표시가능
UNION
o 여러 개의 쿼리 결과를 합치는 연산자로 중복된 영역은 제외하여 합친다.
o 두 개 이상의 SELECT문(RESULTSET)을 합집합 하며 중복 값은 한 개만 표시한다.
o 다른 테이블의 비슷한 값을 하나의 RESULTSET으로 보내줄 때 사용한다.
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY FROM EMPLOYEE WHERE DEPT_CODE = ‘D5’ UNION SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY FROM EMPLOYEE WHERE SALARY > 3000000 ORDER BY 1; |
![]() |
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY -- 기준이 되는 RESULTSET FROM EMPLOYEE WHERE DEPT_CODE='D5' UNION -- 두 개의문의 결과 중 중복 값은 하나로 합친다. SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY FROM EMPLOYEE WHERE SALARY>3000000 UNION SELECT DEPT_ID, DEPT_TITLE, LOCATION_ID,0 -- 컬럼의 개수를 맞추기 위해 0을 사용 FROM DEPARTMENT; |
![]() |
- 각 SELECT문의 결과 값이 연결되어서 출력된다.
- DEPT_ID같이 기준 RESULTSET과 컬럼 명이 다른 것은 기준RESULTSET 컬럼명으로 출력은 되나 결과는 연결되어서 출력된다.
UNION ALL (합집합)
o 여러 쿼리 결과를 합치는 연산자로 중복된 영역 모두 포함하여 합친다.
o UNION은 중복 결과는 하나로 표시했다면 UNION ALL은 중복 값을 모두 표시한다.
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY FROM EMPLOYEE WHERE DEPT_CODE = ‘D5’ UNION ALL SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY FROM EMPLOYEE WHERE SALARY > 3000000 ORDER BY 1; |
![]() |
INTERSECT (교집합)
o 여러 개의 SELECT 결과에서 공통된 부분만 결과로 추출한다.
o 즉, 여러 SELECT문에서 중복 값만 출력한다.
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY FROM EMPLOYEE WHERE DEPT_CODE = ‘D5’ INTERSECT SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY FROM EMPLOYEE WHERE SALARY > 3000000; |
![]() |
MINUS (차집합)
o 선행 SELECT 결과에서 다음 SELECT 결과와 겹치는 부분을 제외한 나머지 부분 추출한다.
o 첫번째 SELECT문(RESULTSET)에서 두번째 SELECT문(RESULTSET)을 빼는 것을 출력한다.
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY |
![]() |
GROUPING SETS
o 그룹 별로 처리된 여러 개의 SELECT문을 하나로 합친 결과를 원할 때 사용한다. (집합 연산자 사용과 동일)
o GROUP BY가 포함된 구문을 묶을 때 사용하며 여러 개의 그룹 바이 절을 하나로 묶어 한 번에 출력한다.
SELECT DEPT_CODE, JOB_CODE, MANAGER_ID, COUNT(*) FROM EMPLOYEE WHERE DEPT_CODE IS NOT NULL AND MANAGER_ID IS NOT NULL GROUP BY GROUPING SETS( (DEPT_CODE, JOB_CODE, MANAGER_ID), (DEPT_CODE, MANAGER_ID), (JOB_CODE, MANAGER_ID) ) ORDER BY 1,2; |