DBMS/개념

21_ 집합 연산자

seungwon-1 2025. 10. 20. 23:25

 

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. 사용 시 주의사항

  1. 열의 개수와 타입 일치
    두 SELECT 문은 반드시 동일한 열의 개수와 호환 가능한 데이터 타입을 가져야 한다.
    예를 들어 숫자형과 문자형을 바로 비교하면 오류가 난다.
  2. ORDER BY 위치
    ORDER BY는 전체 결과 마지막에만 쓸 수 있다.
    개별 SELECT 문 안에 넣으면 에러가 발생한다.
  3. 성능 주의
    집합 연산자는 내부적으로 정렬이나 비교 연산이 많이 일어나므로,
    데이터가 많을수록 속도가 느려질 수 있다.
    실행 계획을 확인하고 인덱스 최적화를 고려해야 한다.

 

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