본문 바로가기
Database

오라클 UNION, UNION ALL, INTERSECT, MINUS 사용법

by 굿센스굿 2024. 12. 3.
반응형

 


1. UNION, UNION ALL, INTERSECT, MINUS란?

오라클 SQL에서 UNION, UNION ALL, INTERSECT, MINUS는 두 개 이상의 쿼리 결과를 조합하거나 비교하는 **집합 연산자(Set Operator)**입니다.
이 연산자들은 각 쿼리의 결과를 조합하거나 특정 조건에 따라 필터링하여 결과를 반환합니다.


2. 집합 연산자의 종류 및 차이점

  1. UNION
    • 두 쿼리의 결과를 합집합으로 반환하며, 중복 데이터는 제거합니다.
    • 결과는 정렬된 상태로 반환됩니다.
  2. UNION ALL
    • 두 쿼리의 결과를 합집합으로 반환하며, 중복 데이터를 제거하지 않습니다.
    • 결과는 정렬되지 않은 상태로 반환됩니다.
  3. INTERSECT
    • 두 쿼리의 결과에서 교집합에 해당하는 데이터를 반환합니다.
    • 중복된 데이터는 제거되며, 정렬된 상태로 반환됩니다.
  4. MINUS
    • 첫 번째 쿼리 결과에서 두 번째 쿼리 결과를 제외한 데이터를 반환합니다.
    • 중복된 데이터는 제거되며, 정렬된 상태로 반환됩니다.

3. 사용법 및 예제

(1) UNION 사용법

-- 예시: 직원과 고객의 이름을 모두 조회하되 중복 제거
SELECT name FROM employees
UNION
SELECT name FROM customers;

-- 결과: 직원과 고객 이름의 합집합 (중복 제거)

(2) UNION ALL 사용법

-- 예시: 직원과 고객의 이름을 모두 조회하며 중복 허용
SELECT name FROM employees
UNION ALL
SELECT name FROM customers;

-- 결과: 직원과 고객 이름의 합집합 (중복 포함)

(3) INTERSECT 사용법

-- 예시: 직원과 고객 중 이름이 동일한 사람만 조회
SELECT name FROM employees
INTERSECT
SELECT name FROM customers;

-- 결과: 직원과 고객 이름의 교집합

(4) MINUS 사용법

-- 예시: 직원 중 고객에 포함되지 않는 이름 조회
SELECT name FROM employees
MINUS
SELECT name FROM customers;

-- 결과: 직원 이름 중 고객에 없는 이름

4. 집합 연산자 사용 시 주의사항

  1. 컬럼 수와 데이터 타입
    • 모든 쿼리는 동일한 컬럼 수 데이터 타입을 가져야 합니다.
    • 예: 첫 번째 쿼리가 두 개의 컬럼(이름, 나이)을 반환하면, 두 번째 쿼리도 두 개의 컬럼(이름, 나이)을 반환해야 합니다.
  2. 정렬 순서
    • UNION, INTERSECT, MINUS는 결과를 자동으로 정렬하지만, UNION ALL은 정렬되지 않습니다.
    • 필요한 경우 ORDER BY를 명시적으로 추가하여 정렬 순서를 지정해야 합니다.
  3. NULL 값 처리
    • NULL 값도 비교에 포함되며, 동일한 NULL 값은 중복 제거 시 하나로 간주됩니다.
  4. 성능
    • UNION INTERSECT, MINUS는 중복 제거 과정에서 더 많은 리소스를 사용하므로, 대량 데이터 처리 시 UNION ALL이 더 빠를 수 있습니다.

5. 예제 시나리오

다음은 직원 테이블(employees)과 고객 테이블(customers)을 이용한 실제 예제입니다.

데이터

employees 테이블

name age

홍길동 30
이몽룡 25
성춘향 28

customers 테이블

name age

이몽룡 25
춘향이 22
홍길동 30

예제 쿼리

  1. 직원과 고객의 모든 이름 조회(중복 제거)
SELECT name FROM employees
UNION
SELECT name FROM customers;
-- 결과: 홍길동, 이몽룡, 성춘향, 춘향이
  1. 직원과 고객의 모든 이름 조회(중복 허용)
SELECT name FROM employees
UNION ALL
SELECT name FROM customers;
-- 결과: 홍길동, 이몽룡, 성춘향, 이몽룡, 춘향이, 홍길동
  1. 직원과 고객의 공통 이름 조회
SELECT name FROM employees
INTERSECT
SELECT name FROM customers;
-- 결과: 홍길동, 이몽룡
  1. 직원 중 고객에 포함되지 않는 이름 조회
SELECT name FROM employees
MINUS
SELECT name FROM customers;
-- 결과: 성춘향

6. 결론

UNION, UNION ALL, INTERSECT, MINUS는 여러 쿼리의 결과를 비교하거나 조합하는 데 필수적인 도구입니다.

  • 중복 제거가 필요하면 UNION 또는 INTERSECT를,
  • 중복을 허용하거나 빠른 결과가 필요하면 UNION ALL을,
  • 특정 집합에서 제외할 데이터를 찾으려면 MINUS를 사용하세요.

올바른 집합 연산자의 활용은 데이터 처리의 효율성을 높이고, 필요한 데이터를 명확하게 추출할 수 있도록 도와줍니다.

반응형