SQL 집합 연산자
집합 연산자
서로 다른 두 개의 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문장의 결과를 합쳐서 출력하는 집합 연산자에 대해 알아보았습니다.
집합 개념이기 때문에 벤다이어그램을 생각하면 어렵지 않게 이해할 수 있습니다