DB

[SQL] 집합 연산 - UNION, UNION ALL, INTERSECT, MINUS, GROUPING SET

chan10 2021. 3. 8. 14:13

집합 연산

여러 개의 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
FROM EMPLOYEE
WHERE DEPT_CODE = D5
MINUS
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;

 

  

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;