< 집합 연산자 == SET OPERATION >
여러개의 쿼리문을 가지고 하나의 쿼리문으로 만드는 연산자
- UNION : OR | 합집합 (두 쿼리문 수행한 결과값을 더한 후 중복되는 값은 한번만 더해지도록)
- INTERSECT : AND | 교집합 (두 쿼리문 수행한 결과값에 중복된 결과값)
- UNION ALL : 합집합 + 교집합 (중복되는 부분이 두 번 표현될 수 있음)
- MINUS : 선행 결과값에서 후행 결과값을 뺀 나머지(차집합)
-- 부서코드가 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개행 (선동일, 송중기, 노옹철, 유재식, 정중하, 심봉선, 대북혼, 전지연)
-- 1. UNION (합집합)
-- 부서코드가 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;
-- 위의 쿼리문 대신 아래처럼 WHERE 절에 OR 써도 해결 가능
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5' OR SALARY > 3000000;
-- 2. INTERSECT(교집합)
-- 부서코드가 D5이면서 급여까지도 300만원 초과인 사원 조회
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;
-- 아래처럼도 해결 가능
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5' AND SALARY > 3000000;
주의사항
-- 각 쿼리문의 SELECT절에 작성되어있는 컬럼 개수 동일해야됨!! (아래코드는 안된다)
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5';
UNION
SELECT EMP_ID,EMP_NAME, DEPT_CODE
FROM EMPLOYEE
WHERE SALARY > 3000000;
-- 컬럼 개수 뿐만 아니라 각 컬럼 자리마다 동일한 타입으로 기술해야됨!(아래코드는 안된다)
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'
UNION
SELECT EMP_ID,EMP_NAME, DEPT_CODE, BONUS --HIRE_DATE
FROM EMPLOYEE
WHERE SALARY > 3000000;
-- ORDER BY 절을 붙이고자 한다면 마지막에 기술해야됨!!
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'
--ORDER BY EMP_NAME
UNION
SELECT EMP_ID,EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000
ORDER BY EMP_NAME;
-- 3. 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 EMP_NAME;
-- 4. MINUS
-- 선행 SELECT 결과에서 후행 SELECT 결과를 뺀 나머지 (차집합)
-- 부서코드가 D5인 사원들 중 급여가 300만원 초과한 사원들을 제외해서 조회
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;
-- 아래처럼도 가능하긴 함!
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5' AND SALARY <= 3000000;