집합 연산자는 여러 개의 SELECT 결과물을 하나의 쿼리로 만드는 연산자로, INTERSECT, UNION, UNION ALL, MINUS … 가 있다.
SELECT EMP_NAME, EMP_ID FROM EMPLOYEE WHERE DEPT_CODE = 'D5' -- A
INTERSECT -- 교집합 A∩B
SELECT EMP_NAME, EMP_ID FROM EMPLOYEE WHERE SALARY >= 2400000; -- B
INTERSECT
는 여러 개의 SELECT 결과에서 공통된 부분
만 결과로 추출한다. 즉, 수행 결과에 대한 교집합
이라고 볼 수 있다.
SELECT EMP_NAME, EMP_ID FROM EMPLOYEE WHERE DEPT_CODE = 'D5' -- A
UNION -- 합집합 A∪B
SELECT EMP_NAME, EMP_ID FROM EMPLOYEE WHERE SALARY >= 2400000; -- B
UNION
은 여러 개의 쿼리 결과를 하나로 합치는
연산자로, 중복된 영역은 제외
하여 하나로 합치는 합집합
이다.
SELECT EMP_NAME, EMP_ID FROM EMPLOYEE WHERE DEPT_CODE = 'D5' -- A
UNION ALL -- 합집합 (중복허용)
SELECT EMP_NAME, EMP_ID FROM EMPLOYEE WHERE SALARY >= 2400000; -- B
그에 비해 UNION ALL
은 UNION과 같은 여러 쿼리 결과물에 대한 합집합
을 의미하지만, 중복된 영역을 모두 포함
시킨다는 차이점이 존재한다.
UNION ALL의 경우, 합칠 A와 B의 칼럼의 갯수가 같아야
하고, 칼럼의 자료형 또한 같아야
한다.
(다를 경우 : ORA-01790: expression must have same datatype as corresponding expression)
SELECT EMP_NAME, EMP_ID FROM EMPLOYEE WHERE DEPT_CODE = 'D5' -- A
MINUS -- 차집합 A-B
SELECT EMP_NAME, EMP_ID FROM EMPLOYEE WHERE SALARY >= 2400000; -- B
MINUS
는 선행 SELECT 결과에서 다음 SELECT 결과와 겹치는 부분을 제외한 나머지 부분
만 추출한다. 즉, 두 쿼리 결과물의 차집합
이라고 볼 수 있다.