일단 해보는 코딩/Oracle SQL

[오라클/SQL] 집합연산자(UNION/UNIONALL/INTERSECT/MINUS)

eun_zoey2 2022. 6. 8. 16:31
728x90
집합 연산자

    두 테이블에 대해서 select문으로 각각 데이터를 조회해서 새로운 데이터로 가공하고 싶을 때 집합 연산자를 사용한다.
    집합 연산자를 사용하기 위해서 두 테이블에서 selet 문의 컬럼_명, 컬럼_위치, 컬럼_수가 동일해야한다.
    그렇지 않으면 'ORA-01789: 질의 블록을 부정확 한 수 의 결과 열을 가지고 있습니다' 와 같은 에러가 발생한다.
    집합 연산자의 종류는 UNION(합) UNION ALL, INTERSECT(차), MINUS(감) 있다.


SELECT 문에 집합 연산자의 문법 (UNION/UNION ALL/MINUS/INTERSECT)

SELECT 필드이름
FROM 테이블이름
UNION/UNION ALL/MINUS/INTERSECT
SELECT 필드이름
FROM 테이블이름

 

UNION

    UNION은 여러 개의 SELECT 문의 결과를 하나의 테이블이나 결과 집합으로 표현할 때 사용한다.
    이때 각각의 SELECT 문으로 선택된 필드의 개수와 타입은 모두 같아야 하며, 필드의 순서 또한 같아야 한다.


Q. 급여가 10,000 넘는 사람들을 보여주고, department_id 가 100인사람도 보이시오.

select salary, employee_id, department_id from employees
where salary > 10000
UNION 
select salary,  employee_id, department_id from employees
where department_id = 100;

 

UNION ALL

위의 예제처럼 UNION은 DISTINCT 키워드를 따로 명시하지 않아도 기본적으로 중복되는 레코드를 제거한다.
따라서 이렇게 중복되는 레코드까지 모두 출력하고 싶을때 사용한다.

Q. 급여가 10,000 넘는 사람들을 보여주고, department_id 가 100인사람도 보이시오.(중복포함)

select salary, employee_id, department_id from employees
where salary > 10000
UNION  ALL
select salary,  employee_id, department_id from employees
where department_id = 100
order by salary DESC;

6행과 8행이 중복값을 가지고 있지만 출력함

MINUS

Q. 100번 부서를 제외하고 급여가 10000이상만 보이시오.

select employee_id, salary, department_id from employees
where salary > 10000
MINUS
select employee_id, salary, department_id from employees
where department_id = 100;

INTERSECT

Q. 부서가 100번이고, 급여가 10000이상만 보이시오.(교집합)

select employee_id, salary, department_id from employees
where salary > 10000
INTERSECT
select employee_id, salary, department_id from employees
where department_id = 100;