안녕하세요.
#yeoneeblog 여니입니다 :)
/*
<집합 연산자 SET OPERATOR>
여러개의 쿼리문을 가지고 하나의 쿼리문으로 만드는 연산자
-UNION(합집합) : 두 쿼리문을 수행한 결과값을 더한 후 중복되는 부분은 한번만 빼서 중복을 제거한것
-UNION ALL : 두 쿼리문을 수행한 결과값을 더한 후 중복값은 제거하지 않고 그대로둔것
-INTERSECT(교집합) : 두 쿼리문을 수행한 결과값의 중복된 부분만 가져온것
-MINUS(차집합) : 선행 쿼리문 결과값에서 후행 쿼리문 결과값을 뺀 나머지 부분
주의해야할점 : 두 쿼리문의 결과를 합쳐서 한개의 테이블로 보여줘야하기 때문에
두 쿼리문의 SELECT절 부분은 같아야한다.(조회할 컬럼명이 일치해야함)
*/
-- 1. UNION(합집합) : 두 쿼리문을 수행한 결과값을 더해주지만, 중복값은 제거
-- ★자주 쓰여요★
-- 부서코드가 D5이거나(OR), 또는 급여가 300만원 초과인 사원들 조회(사번, 사원명, 부서코드, 급여)
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5' --> 6명 조회
UNION --> 위의 ; 삭제 후 실행 ( 중복값은 제거됨 )
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000; --> 8명 조회
-- 직급코드가 J6이거나 부서코드가 D1인 사원들을 조회(사번, 사원명, 부서코드, 급여)
-- OR연산자 버전
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE JOB_CODE = 'J6' OR DEPT_CODE = 'D1';
-- UNION 연산자 버전
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D1'
UNION
SELECT EMP_ID, EMP_NAME, JOB_CODE, SALARY
FROM EMPLOYEE
WHERE JOB_CODE = 'J6';
-- 2. UNION ALL : 여러개의 쿼리결과를 더해서 보여주는 연산자(중복제거 안함)
-- 직급코드가 J6이거나 부서코드가 D1인 사원들을 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE JOB_CODE = 'J6' -- 6명
UNION ALL
SELECT EMP_ID, EMP_NAME, JOB_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D1'; -- 3명
-- 3. INTERSECT : 교차합, 쿼리결과중 중복된 결과만을 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE JOB_CODE = 'J6' -- 6명
INTERSECT
SELECT EMP_ID, EMP_NAME, JOB_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D1'; -- 3명
-- AND 연산자 버전
SELECT EMP_ID, EMP_NAME, JOB_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D1' AND JOB_CODE = 'J6'; -- 2명
-- 4. MINUS : 차집합, 선행쿼리문의 결과에 후행 쿼리결과를 뺀 나머지
-- 직급코드가 J6이거나 부서코드가 D1인 사원들을 제외한 나머지 사원들 조회해 보기
SELECT
EMP_ID, EMP_NAME, DEPT_CODE, JOB_CODE
FROM EMPLOYEE
WHERE JOB_CODE = 'J6' -- 6명
MINUS
SELECT
EMP_ID, EMP_NAME, DEPT_CODE, 'J999' JOB_CODE -- ★위의 JOB_CODE와 같은 역할-자주 쓰임
FROM EMPLOYEE
WHERE DEPT_CODE = 'D1'; -- 3명