✅ 예제 테이블 생성
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
department_id INT
);
CREATE TABLE departments (
department_id INT PRIMARY KEY,
department_name VARCHAR(50)
);
INSERT INTO employees (employee_id, first_name, last_name, department_id) VALUES
(1, 'John', 'Doe', 1),
(2, 'Jane', 'Smith', 2),
(3, 'Bob', 'Johnson', 1),
(4, 'Alice', 'Brown', 3),
(5, 'Michael', 'Davis', 2);
INSERT INTO departments (department_id, department_name) VALUES
(1, 'IT'),
(2, 'Sales'),
(3, 'HR');
01. UNION, UNION ALL - 합집합
✅ UNION
- 두 개 이상의 SELECT 문의 결과를 결합하는 데 사용
- 중복 행은 하나로 간주(중복 행 제거)
✔️ UNION 연산을 사용해 employees 테이블과 departments 테이블에서
major과 department_id 열에서 중복 없는 모든 값 가져오기
SELECT department_id FROM employees
UNION
SELECT department_id FROM departments;
✅ UNION ALL
- UNION과 거의 동일하지만 중복 행을 제거 하지 않음
✔️ UNION 연산을 사용해 employees 테이블과 departments 테이블에서
department_id 열의 모든 값 가져오기
SELECT department_id FROM employees
UNION ALL
SELECT department_id FROM departments;
02. INTERSECT - 교집합
✅ INTERSECT
- INTERSECT 연산자는 두 개 이상의 SELECT 문의 공통된 결과를 반환
- 두 테이블이 공통으로 갖는 행만 결합하고 중복은 생략
- 원래 MySQL에서 INTERSECT가 지원 안돼서 INNER JOIN으로 대체 했는데,
MySQL 8.0.31 부터 INTERSECT 연산자가 추가됨.
SELECT department_id FROM employees
INTERSECT
SELECT department_id FROM departments;
03. EXCEPT - 차집합
✅ EXCEPT
- 두 개의 SELECT 문의 결과 집합을 비교하여 첫 번째 집합에서 두 번째 집합에 없는 행을 반환하는 집합 차이 연산자
- MySQL 8.0.31 부터 EXCEPT 연산자가 추가됨.
- Oracle의 경우는 MINUS 연산자 사용
✔️ departments 테이블에 행 추가
INSERT INTO departments (department_id, department_name) VALUES
(4, 'R&D');
✔️ departments 테이블에만 존재하는 department_id 찾기
SELECT department_id FROM departments
EXCEPT
SELECT department_id FROM employees;
👉또는 NOT IN 연산자 사용
SELECT department_id FROM departments
WHERE department_id NOT IN (SELECT department_id FROM employees);
출처 및 참고 문헌(reference)