1. UNION (합집합)
UNION은 두 SELECT 결과를 하나로 합치되, 중복을 제거해서 반환한다.
서로 다른 테이블에서 같은 형태의 데이터를 합칠 때 많이 쓴다.
만약 중복까지 포함하고 싶다면 UNION ALL을 사용한다.
SELECT column1 FROM table1
UNION
SELECT column1 FROM table2;
SELECT column1 FROM table2;
예를 들어 EMPLOYEES 테이블에서 부서가 10번인 사람과
연봉이 10,000 이상인 사람을 합쳐 보려면 이렇게 쓴다.
SELECT first_name, last_name FROM employees WHERE department_id = 10
UNION
SELECT first_name, last_name FROM employees WHERE salary > 10000;
- 중복된 행은 자동으로 제거된다.
- 두 SELECT 문은 열의 개수와 데이터 타입이 동일해야 한다.
2. INTERSECT (교집합)
INTERSECT는 두 SELECT 결과 중 공통된 행만 반환한다.
즉, 두 조건을 모두 만족하는 데이터를 찾을 때 유용하다.
SELECT column1 FROM table1
INTERSECT
SELECT column1 FROM table2;
EMPLOYEES 테이블 예시:
SELECT employee_id FROM employees WHERE department_id = 50
INTERSECT
SELECT employee_id FROM employees WHERE salary > 5000;
- 두 조건을 모두 만족하는 employee_id만 결과에 포함된다.
- 실제로는 “AND” 조건으로도 비슷한 결과를 얻을 수 있지만,
INTERSECT는 두 개의 독립된 쿼리를 명확히 비교할 때 더 적합하다.
3. MINUS (또는 EXCEPT) (차집합)
MINUS는 첫 번째 SELECT 결과에서 두 번째 결과를 뺀 나머지를 반환한다.
즉, “A에는 있고 B에는 없는 데이터”를 찾을 때 사용한다.
(일부 데이터베이스에서는 EXCEPT라는 이름을 쓴다.)
SELECT column1 FROM table1
MINUS
SELECT column1 FROM table2;
EMPLOYEES 예시:
SELECT employee_id FROM employees WHERE department_id = 80
MINUS
SELECT employee_id FROM employees WHERE commission_pct IS NOT NULL;
- 80번 부서에 있지만, 커미션을 받지 않는 직원만 결과로 나온다.
- 두 SELECT 문은 동일한 열 수와 데이터 타입을 가져야 한다.
4. 사용 시 주의사항
- 열의 개수와 타입 일치
두 SELECT 문은 반드시 동일한 열의 개수와 호환 가능한 데이터 타입을 가져야 한다.
예를 들어 숫자형과 문자형을 바로 비교하면 오류가 난다. - ORDER BY 위치
ORDER BY는 전체 결과 마지막에만 쓸 수 있다.
개별 SELECT 문 안에 넣으면 에러가 발생한다. - 성능 주의
집합 연산자는 내부적으로 정렬이나 비교 연산이 많이 일어나므로,
데이터가 많을수록 속도가 느려질 수 있다.
실행 계획을 확인하고 인덱스 최적화를 고려해야 한다.
5. 정리
- UNION → 두 결과를 합치고 중복 제거
- INTERSECT → 공통된 데이터만 추출
- MINUS(EXCEPT) → 한쪽에만 있는 데이터 추출
집합 연산자는 단순히 데이터를 합치는 기능을 넘어서,
여러 조건의 결과를 비교·분석할 때 굉장히 강력하다.
특히 복잡한 쿼리를 쓸 때, 각각의 SELECT 결과를 명확히 나눠서
논리적으로 결합할 수 있다는 점이 큰 장점이다.
'DBMS > 개념' 카테고리의 다른 글
| 23_ CASE문 (0) | 2025.10.24 |
|---|---|
| 22_ CTE (Common Table Expressions) (0) | 2025.10.22 |
| 20_ 서브쿼리 (0) | 2025.10.18 |
| 19_ 조인(Join) (0) | 2025.10.16 |
| 18_ 조인(Join)과 서브쿼리(Subquery) (0) | 2025.10.14 |