Data Base_Oracle/SQL

SQL 집합 연산자

pathas 2020. 1. 8. 23:30

집합 연산자

서로 다른 두 개의 SQL문장의 실행결과를 하나로 합쳐서
보여줄 수 있게 하는 연산자

종류 설명
union 합집합, 중복을 제거한 결과의 합을 검색
union all 합집합, 중복을 포함한 결과의 합을 검색
intersect 교집합, 양쪽 모두에서 포함된 행을 검색
minus 차집합, 첫 번째 검색 결과에서 두 번째 검색 결과를 제외한 나머지를 검색

※ 두 SQL문장의 select ~ from 사이에 나오는 필드 개수와 자료형이 같아야 함
테이블과 필드명은 다를 수 있음

# 예제

{ 문제 1 }
▷ emp 테이블에서 업무가 MANAGER인 사원의 사번, 이름 출력

▶ [ SQL> select empno, ename from emp where job='MANAGER'; ]

EMPNO ENAME
7566 JONES
7698 BLAKE
7782 CLARK

{ 문제 2 }
▷ emp 테이블에서 사원명이 A자로 시작하는 사원의 사번, 이름 출력

▶ [ SQL> select empno, ename from emp where ename like 'A%'; ]

EMPNO ENAME
7499 A
7876 ADAMS

{ UNION }

▷ 위의 두 결과의 합집합을 출력, 중복 데이터는 제외

▶ [ SQL> select empno, ename from emp where job='MANAGER'
union
select empno, ename from emp where ename like 'A%'; ]

EMPNO ENAME
7499 ALLEN
7876 ADAMS
7566 JONES
7698 BLAKE
7782 CLARK

※ 두 개의 SQL결과를 계산한 뒤 정렬해서 보여줌
~ job='MANAGER' 가 SQL문장에서는 먼저 쓰였으나 아래에 출력

{ UNION ALL }

▷ 위의 두 문제를 동시에 출력, 중복 데이터를 포함

▶ [ SQL> select empno, ename from emp where job='MANAGER'
union all
select empno, ename from emp where ename like 'A%'; ]

EMPNO ENAME
7566 JONES
7698 BLAKE
7782 CLARK
7499 ALLEN
7876 ADAMS

※ 두 개의 SQL 실행 결과를 섞지 않고 있는 그대로 합쳐서 보여줌
~ job='MANAGER' 가 SQL문장에서 먼저 쓰였기 때문에 위에 출력

{ INTERSECT }

▷ 위의 두 문제에 공통으로 포함되는 레코드를 출력

▶ [ SQL> select empno, ename from emp where job='MANAGER'
intersect
select empno, ename from emp where ename like 'A%'; ]

→ '선택된 레코드가 없습니다.'

 

※ 두 SQL문장의 실행결과에 동시에 속하는 레코드가 없음

{ MINUS }

▷ 위의 두 문제에서 첫 번째 SQL문장의 결과에서
두 번째 SQL문장의 결과를 제외한 뒤 출력

▶ [ SQL> select empno, ename from emp where job='MANAGER'
minus
select empno, ename from emp where ename like 'A%'; ]

EMPNO ENAME
7566 JONES
7698 BLAKE
7782 CLARK

※ 두 SQL문장의 실행결과에 교집합이 없기 때문에 먼저 작성된 SQL문장의 결과만 출력

# 에러

{ 필드의 개수가 맞지 않을 때 발생하는 에러 }

▶ [ SQL> select empno, ename, sal from emp where job='MANAGER'
union all
select empno, ename from emp where ename like 'A%';
1행에 오류:
ORA-01789: 질의 블록은 부정확한 수의 결과 열을 가지고 있습니다. ]

 

{ 자료형이 맞지 않을 때 발생하는 에러 }

▶ [ SQL> select sal, comm from emp where job='MANAGER'
union all
select empno, ename from emp where ename like 'A%' ;
1행에 오류:
ORA-01790: 대응하는 식과 같은 데이터 유형이어야 합니다 ]

 

{ ※ 테이블과 필드명은 서로 달라도 결과가 출력됨 ※ }

▶ [ SQL> select empno, ename from emp where job='MANAGER'
union all
select deptno, dname from dept where dname like 'A%' ;

EMPNO ENAME
7566 JONES
7698 BLAKE
7782 CLARK
10 ACCOUNTING

서로 다른 SQL문장의 결과를 합쳐서 출력하는 집합 연산자에 대해 알아보았습니다.

집합 개념이기 때문에 벤다이어그램을 생각하면 어렵지 않게 이해할 수 있습니다