목차
1. UNION
2. UNION ALL
3. INTERSECT
4. MINUS
1. UNION (합집합 - 두 쿼리문 실행한 결과물을 합치고 중복제거)
-- 부서코드가 D5이거나 급여가 300만원 초과인 사원들 조회 (사원, 사원명, 부서코드, 급여)
-- 부서코드가 D5인 사원들만 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5';
--> 6명 조회(인, 종, 찬, 효, 영, 희)
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;
--> 가, 준, 민, 선, 원, 효, 희, 은
-- UNION 으로 위의 쿼리문 합치기: 두 쿼리의 SELECT 절이 같아야 한다.
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명 (인, 종, 찬, 효, 영, 희, 가, 준, 민, 선, 원, 은)
UNION은 OR의 연산의 의미를 갖고 있음
-- OR 연산자
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5' OR SALARY > 3000000;
--> OR 연산자로 두개의 조건을 묶어서 조회하면 하나의 SELECT 문으로도 표현 가능
2. UNION ALL (두 쿼리문 실행 결과를 합치고 중복 제거 x)
-- 중복값이 여러개 조회될 수 있음
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;
--> 14명 조회(가, 준, 민, 선, 원, 인, 종, 찬
-- 효, 영, 희, 은, 효, 희)
-- 6명 + 8명 = 14명
3. INTERSECT (교집합 - 여러 쿼리 결과의 중복된 부분)
-- 부서 코드가 D5면서 급여도 300만원 초과인 사원
-- 부서코드가 D5인 사원들만 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5';
-- 급여가 300만원 초과인 사원들만 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;
-- INTERSECT 연산자
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;
-- INTERSECT 연산자는 AND 연산 의미를 갖고 있음
-- AND 연산자
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5' AND SALARY > 3000000; --> 2명 조회
4. MINUS (차집합 - 선행 쿼리 결과에 후행 쿼리 결과를 뺀 나머지)
-- 부서 코드가 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; --> 6명 중 겹치는 2명을 제외하고 4명 조회
-- 순서를 바꿔보자
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000
MINUS
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'; --> 8명 중 겹치는 2명을 제외하고 6명 조회
--> 결과가 아예 다르게 나오기 때문에 순서에 주의하자
※ 다음과 같이도 가능하다 -- 부서코드가 D5인 사원들 중에서 급여가 300만원 초과인 사원들을 제외하고 조회 -- 부서코드가 D5 이고 그리고 급여가 300만원 이하인 사원들을 조회 SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY FROM EMPLOYEE WHERE (DEPT_CODE = 'D5') AND (SALARY <= 3000000); |