일기장
Published 2023. 8. 4. 10:27
230804 DB 집합 DB 학습일지

 

목차

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);

 

반응형
profile

일기장

@돌아온 개밥그릇

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!