Database/Oracle

[Oracle] 집합 연산자

21종 2023. 7. 6. 20:29

    < 집합 연산자 == 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;