본문 바로가기
데이터베이스

[SQL] 3.집합 연산(SET OPERATIONS)

by 우공80 2025. 5. 19.
728x90

1. UNION / UNION ALL

  • UNION: 두 개 이상의 SELECT 결과를 합치되, 중복 행 제거
  • UNION ALL: 합칠 때 중복을 그대로 포함
 
-- 부서 10 직원과 부서 20 직원을 합쳐서 조회 (중복 제거)
SELECT EMPLOYEE_ID, FIRST_NAME, DEPARTMENT_ID
FROM   EMPLOYEES
WHERE  DEPARTMENT_ID = 10
UNION
SELECT EMPLOYEE_ID, FIRST_NAME, DEPARTMENT_ID
FROM   EMPLOYEES
WHERE  DEPARTMENT_ID = 20
ORDER BY DEPARTMENT_ID;

-- 중복 포함 버전
SELECT … WHERE DEPARTMENT_ID = 10
UNION ALL
SELECT … WHERE DEPARTMENT_ID = 20;

주의:

  • 모든 SELECT는 컬럼 수와 데이터 타입 순서가 같아야 합니다.
  • ORDER BY는 마지막 SELECT 뒤에만 붙입니다.

2. INTERSECT

  • 두 SELECT 결과의 교집합 (공통된 행만)
-- 급여 3000 초과 직원과 2019년 이후 채용된 직원의 교집합
SELECT EMPLOYEE_ID, FIRST_NAME
FROM   EMPLOYEES
WHERE  SALARY > 3000
INTERSECT
SELECT EMPLOYEE_ID, FIRST_NAME
FROM   EMPLOYEES
WHERE  HIREDATE >= DATE '2019-01-01';

3. MINUS

  • 첫 번째 SELECT 결과에서 두 번째 SELECT 결과를 뺀 차집합
-- 2018년 이전 채용된 직원 중, 급여 3000 초과 직원 제외
SELECT EMPLOYEE_ID, FIRST_NAME, HIREDATE
FROM   EMPLOYEES
WHERE  HIREDATE < DATE '2018-01-01'
MINUS
SELECT EMPLOYEE_ID, FIRST_NAME, HIREDATE
FROM   EMPLOYEES
WHERE  SALARY > 3000;

4. 연습 문제

  1. EMPLOYEES 테이블에서 부서별로 DEPT 30 직원과 DEPT 40 직원을 UNION ALL 하여 조회해 보세요.
  2. EMPLOYEES 테이블에서 커미션(COMMISSION_PCT) 있는 직원급여 4000 이상 직원교집합을 조회해 보세요.
  3. EMPLOYEES 테이블에서 2017년 이전 채용 직원커미션 없는 직원MINUS 로 조회해 보세요.
728x90

'데이터베이스' 카테고리의 다른 글

[SQL] 5. 윈도우 함수(Window Functions)  (0) 2025.05.19
[SQL] 4. 뷰(View), 인덱스(Index), 시퀀스(Sequence)  (0) 2025.05.19
[SQL] 1. JOIN  (0) 2025.05.19

댓글