본문 바로가기

Database

[SQL] 집합연산자 (SET OPERATOR)

집합연산자 SET OPERATOR

연산자 개념
UNION :  합집합(두 쿼리문을 수행한 결과값을 더한 후 중복되는 부분은 한 번 뺀 것)
INTERSECT:  교집합(두 쿼리문을 수행한 결과값의 중복된 결과값 부분)
UNION ALL: 합집합 결과+ 교집합 (중복된 부분 2번), 두 쿼리문을 수행한 결과값을 무조건 더한다
                   즉, 합집합에서 중복제거를 하지 않은 것, 중복된 결과가 두 번 조회됨
MINUS: 차집합(선행쿼리문 결과값 - 수행쿼리문 결과값)

 

https://www.c-sharpcorner.com/article/the-complete-reference-set-operations-in-ms-sql-union-all-intersect-excep/

 

 

1. UNION (두 쿼리문 수행 결과값을 더하지만 중복결과는 한 번만 조회) / OR로 대체가능, 두 쿼리의 SELECT절이 같아야 함
  */


-- 부서코드가 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;   
  
--->OR로 대체할 수 있음(결과 동일)
-- 각 부서별로 급여합 조회 (부서코드, 부서별 급여합)

SELECT SUM(SALARY) 부서별 급여합
FROM EMPLOYEE
WHERE DEPT_CODE ='D1';
UNION
SELECT SUM(SALARY) 부서별 급여합
FROM EMPLOYEE
WHERE DEPT_CODE ='2';

--각 부서별로 WHERE절을 이용해서 하나하나 UNION으로 합쳐줘야한다
-->GROUP BY 절로 대신할 수 있음
SELECT DEPT_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE;


----------------------
--2.UNIONALL 여러개의 쿼리 결과를 무조건 더한다(중복값이 여러개 들어갈 수 잇음) 다른 함수가 대신할 수 없음! (쓸모있음)



SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'
UNION ALL               --6명
  
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;   --8명

--이건 어떻게 정렬하지?
--중복을 제거하지 않는다
---------------------------
-- 3. INTERSECT(교집합) - 여러 쿼리 결과의 중복된 결과만을 조회 (AND로 대체 가능)

SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'             --6명
INTERSECT
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;   --8명


SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5' AND SALARY > 3000000;            


---------------------
--4.MINUS (차집합) : 선행쿼리 결과에 후행쿼리 결과를 뺀 나머지 (조건식을 수정하여 대체가능)

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;

-------------------------