Database/개념정리

[DataBase] Oracle SQL 집합 연산자 UNION / UNION_ALL / MINUS / INTERSECT

Sehyeok20 2021. 2. 18. 19:46
반응형

집합연산자 

 - 열의 개수와 순서가 모든 쿼리에서 동일해야 한다.
 - 데이터 형식이 호환되어야 한다.
 - SELECT (열) FROM (테이블) WHERE (조건) [집합연산자] SELECT (열) FROM (테이블) WHERE (조건)

 

UNION : 연결된 SELECT문의 결과 값을 합집합으로 묶어 준다. 결과 값의 중복은 제거된다.
UNION ALL : 연결된 SELECT문의 결과 값을 합집합으로 묶어 준다. 중복된 결과 값도 제거 없이 모두 출력 된다.
MINUS : 먼저 작성한 SELECT문의 결과 값 중  다음 SELECT 문에 존재하지 않는 데이터만 출력된다. (차집합)
INTERSECT : 먼저 작성한 SELECT문과 다음 SELECT 문의 결과 값이 같은 데이터만 출력된다. (교집합)

 

위 4개의 집합 연산자들이 어떻게 연산되는지 알아보기 위해 먼저 emp테이블을 복사하여 2개의 새로운 테이블을 만들어보자.

create table emp_1 as select * from emp;
create table emp_2 as select * from emp;

테이블을 복사하는 방법은 위와 같다.

이 외에도 여러가지 방법이 있지만 테이블을 생성하면서 복사하는 가장 간단한방법은

CREATE TABEL [생성할 테이블] AS SELECT * FROM [복사할 테이블] ; 

이 되겠다.

 

이제 복사한 테이블에 몇 행을 추가하고 삭제해보자.

행을 추가하는 방법은

INSERT INTO [테이블] VALUES ([컬럼 1 값], [컬럼 2 값] .. );

이다

insert into emp_1 values(1234, 'Sean', 'IT', 8000, '21/02/18', 7000, 2000, 40);
insert into emp_1 values(2345, 'Mason', 'TEACHER', 6000, '21/02/15', 6000, 1500, 50);
insert into emp_1 values(3456, 'John', 'DESIGNER', 7000, '21/01/30', 5000, 3000, 60);

이를 이용해 emp_1에 행을 몇 개 추가했다.

 

행을 삭제하는 방법은

DELECT FROM [테이블] WHERE [조건];

이다. 조건에 맞는 행을 모두 삭제해준다.

delete from emp_2 where job = 'MANAGER';
delete from emp_2 where job = 'PRESIDENT';
delete from emp_1 where job = 'SALESMAN';
delete from emp_1 where job = 'PRESIDENT';

이를 이용하여 emp_2와 emp_1의 행 몇가지를 삭제해보았다.

 

emp_1

 

emp_2

결과는 위와 같다.

이제 두 테이블을 집합 연산자를 사용하여 합치거나 교집합, 차집합을 찾아보자.

 

UNION (합집합)

select * from emp_1 union select * from emp_2;

결과 1

결과 중 중복을 제외한 모든 행이 출력된다.

 

UNION ALL (중복 포함)

select * from emp_1 union all select * from emp_2;

결과 2

합집합이지만 직업이 CLERK와 ANALYST인 사람들은 중복되어 나오는 것을 알 수 있다.

 

MINUS (차집합)

select * from emp_1 minus select * from emp_2;

결과 3

emp_1에 새로 추가했던 IT, TEACHER, DESIGNER 와 emp_2에서 삭제했던 MANAGER 직업을 가진 사람들만 출력되었다.

즉 emp_1에만 있는 내용들이 출력되는 것을 알 수 있다. 

 

INTERSECT (교집합)

select * from emp_1 intersect select * from emp_2;

결과 4

이번에는 두 테이블에 모두 존재하는 CLERK, ANALYST 직업을 가진 사람들만 출력되었다.

두 테이블 모두 존재하는 값 (중복되는 값) 만 출력되는 것을 알 수 있다.

반응형