본문 바로가기

개발/SQL

[SQL] Oracle - 집합연산자(Set Operator)

 

< 집합연산자(Set Operator) >

 

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

- 편의성은 좋으나, 구문이 길어져 유지보수가 힘들어지는 단점이 존재

- 다른 구문으로도 충분히 대체 가능. 단, UNION ALL 대체 불가!!

 

 

> UNION (합집합)

  - 두 쿼리문을 수행한 결과값을 더할 때, 중복되는 결과는 한 번만 조회

  - OR 연산자로 대체 가능

-- 부서코드가 D5인 사원들만 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
  FROM EMPLOYEE
 WHERE DEPT_CODE = 'D5';  --> 6명 (박나라, 하이유, 김해술, 심봉선, 윤은해, 대북혼)

-- 급여가 300만원 초과인 사원들만 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
  FROM EMPLOYEE
 WHERE SALARY > 3000000; --> 8명 (선동일,송종기,노옹철,유재식,정중하,심봉선,대북혼,전지연)

-- 부서코드가 D5거나 또는 급여가 300만원 초과인 사원들 조회(사번,사원명, 부서코드, 급여)
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; --> 12명 조회(6명 + 8명 - 2명)
-- 두 쿼리의 SELECT절이 같아야한다.

--------- OR로 대체 가능 ------------------------
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
  FROM EMPLOYEE
 WHERE DEPT_CODE = 'D5' OR SALARY > 3000000;
-- OR연산자로 두 개의 조건을 엮어서 조회하면 결과는 동일

 

> INTERSECT (교집합)

  - 여러 쿼리 결과에서 중복된 결과만을 조회

  - AND 연산자로 대체 가능

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; --> 중복되는 2명 조회

---------- AND로 대체 가능 ---------------------
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
  FROM EMPLOYEE
 WHERE DEPT_CODE = 'D5' AND SALARY > 3000000;
-- AND로 대체 가능

 

> 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; --> 6 + 8 = 14명 조회 (중복된 값도 포함됨)

 

> MINUS (차집합)

  - 선행 쿼리 결과에 후행 쿼리 결과를 뺀 나머지

  - 조건식을 수정하여 대체 가능

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; --> 4명 조회 (6명 - 중복되는 2명 제외)
 
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
  FROM EMPLOYEE
 WHERE DEPT_CODE = 'D5' AND SALARY <= 3000000; -- 조건식을 조금 바꾸면 대체 가능