Study

[Oracle/오라클] 집합 연산자 (UNION / INTERSECT / UNION ALL / MINUS)

_유니 2023. 1. 2. 17:03

 

 

집합 연산자 (SET OPERATION)

여러 개의 쿼리문을 가지고 하나의 쿼리문으로 만드는 연산자

 

 

집합 연산자 사용 시 주의사항

* 집합 연산에 사용되는 모든 SELECT문의 컬럼은 개수와 타입이 일치해야 한다

* ORDER BY 절을 사용하고자 한다면 마지막 SELECT문에 기술해야 한다

 

 

- UNION (합집합 / OR)

두 쿼리문의 결합을 나타내며, 중복되는 값은 제거되어 수행 결과 한 번만 나오게 된다

 

-- 부서코드가 D5인 사원 또는 급여가 300만원 초과인 사원들 조회 (사번, 이름, 부서코드, 급여)
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5' -- 6개행 (박나라, 하이유, 김해술, 심봉선, 윤은해, 대북혼)
UNION -- 중복되는 2개행 제거되고 12개행 나옴 
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000; -- 8개행 (선동일, 송종기, 노옹철, 유재식, 정중하, *심봉성, *대북혼, 전지연)

 

 

- INTERSECT (교집합 / AND)

두 쿼리문의 집합 중 중복된 결과값만 반환한다

 

-- 부서코드가 D5이면서 급여가 300만원 초과인 사원들 조회 (사번, 이름, 부서코드, 급여)
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5' -- 6개행 (박나라, 하이유, 김해술, 심봉선, 윤은해, 대북혼)
INTERSECT -- 중복되는 2개행 나옴 ( 심봉선, 대북혼)
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000; -- 8개행 (선동일, 송종기, 노옹철, 유재식, 정중하, *심봉성, *대북혼, 전지연)

 

 

- UNION ALL (합집합 + 교집합)

두 쿼리문의 결합을 나타내며, 결합되는 모든 값(중복 포함)을 반환한다

 

-- 부서코드가 D5인 사원 또는 급여가 300만원 초과인 사원들 조회 (사번, 이름, 부서코드, 급여)
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY -- 6개행
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5' 
UNION ALL -- 중복값 나와서 14행 나옴
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY -- 8개행
FROM EMPLOYEE
WHERE SALARY > 3000000;

 

 

- MINUS (차집합)

선행 결과값에서 후행 결과값을 제외한 나머지를 반환한다

 

-- 부서코드가 D5인 사원 중에 급여가 300만원 미만인 사원들 조회 (사번, 이름, 부서코드, 급여)
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5' 
MINUS -- 선행 결과값 6개행 중에 중복되는 후행 결과값 빠져서 4행 나옴 (박나라, 하이유, 김해술, 윤은해)
SELECT EMP_ID, EMP_NAME,DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;