
SQL 연산자 - 집합 연산자
두 개 이상의 SELECT문으로 조회한 결과를 하나의 결과로 연결하여 보여줄 때 사용 합니다. 이때 두 SELECT 문의 컬럼 갯수와 각 컬럼의 자료형, 순서가 일치해야 합니다. 서로 다른 타이블이나 컬럼에 대해서 수행이 가능 합니다. 이때 결과로 출력되는 컬럼명은 앞에 오는 SELECT문의 컬럼명이 사용 됩니다.
집합연산자들은 집합관계를 생각하시면 쉽게 이해하실 수 있습니다. 다음은 집합연산자 들에 대한 간략한 설명입니다.
| 종류 | 설명 | 집합관계 |
| UNION | 두개이상의 SELECT문을 하나의 결과 값으로 출력합니다. 이때 중복값은 제외 합니다. | A ∪ B(합집합) |
| UNION ALL | 두개이상의 SELECT문을 하나의 결과 값으로 출력합니다. 이때 중복값은 제외하지 않습니다. | A, B |
| MINUS | 먼저 작성된 SELECT 문의 결과 값 중 다음 SELECT 문에 없는 결과 값만 출력 합니다. | A - B(차집합) |
| INTERSECT | 먼저 작성된 SELECT 문과 다음 SELECT 문의 결과 값이 같은 것만 출력 합니다. | A ⋂ B(교집합) |
1. UNION 연산자
사원정보(EMP) 테이블에서 부서 번호(DEPTNO)가 10인 결과를 출력하는 SELECT문과 30인 결과를 출력하는 SELECT 문을 이용하여, 부서번호가 10 또는 30인 사원정보를 출력해 봅시다. EMP 테이블의 구조 예제로 사용된 TABLE의 정보는 'SCOTT 계정 예제 Table(emp, dept, salgrade)'을 참고하시면 됩니다.
SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
WHERE DEPTNO = 10
UNION
SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
WHERE DEPTNO = 30;
이때 출력할 컬럼의 숫자가 다르거나, 출력할 열의 자료형이 다른 경우에는 오류가 발생하여 실행되지 않습니다.

데이터 형만 같다면, 컬럼명에 영향을 받지 않음도 테스트 해 봅시다. 사원정보 테이블에서 급여(SAL)와 급여외 수당(COMM)은 NUMBER로 유형이 동일합니다. 이 컬럼의 위치를 두번째 SELECT 문에서 바꾸어 보면 어떻게 될까요?
SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
WHERE DEPTNO = 10
UNION
SELECT ENAME, COMM, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 30;
아래 보시는 결과과 같이 컬럼명은 첫번째 SELECT 문에 사용된 것이 그대로 사용 되었고, 결과 자료는 각 SELECT 문의 수행 결과가 그대로 연결되었습니다.

실 사용시에도 이런 경우에는 오류가 발생하지 않으니, 작성시 유의 하시기 바랍니다.
2. UNION ALL 연산자
사원정보(EMP) 테이블에서 부서 번호(DEPTNO)가 10인 SELECT 문 2개를 연결해 봅시다. 이때 UNION을 사용하면, 중복이 제거되어 SELECT 문 두개를 연결한 의미가 없습니다. 중복해서 2번 표현 되게 하려면 어떻게 해야 할까요?
SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
WHERE DEPTNO = 10
UNION ALL
SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
WHERE DEPTNO = 10;

3. MINUS 연산자
집합연산자를 이용하여 사원정보(EMP) 테이블에서 부서 번호(DEPTNO)가 10인 정보만 제외하고 출력하는 쿼리를 만들어봅시다.
SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
MINUS
SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
WHERE DEPTNO = 10;

결과와 같이 첫 번째 SELECT문의 결과값에서 두 SELECT문의 결과값이 같은 데이터를 제외한 값들이 출력됩니다.
4. INTERSECT 연산자
두개의 SELECT 문에서 공통적인 결과 값을 갖는 데이터만 출력하려면 어떻게 하면 될까요?
SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
INTERSECT
SELECT ENAME, SAL, COMM, DEPTNO
FROM EMP
WHERE DEPTNO = 10;

결과와 같이 첫 번째 SELECT문의 결과값과 두 SELECT문의 결과값이 같은 데이터들이 출력됩니다.
'DataBase' 카테고리의 다른 글
| 데이터 변경 시 유의 사항 (0) | 2025.07.28 |
|---|---|
| [ORACLE] ORACLE 함수 (1) | 2025.07.28 |
| SQL 연산자 - LIKE 연산자 (0) | 2025.07.25 |
| SQL 연산자 - BETWEEN ~ AND ~ 연산자 (1) | 2025.07.24 |
| SQL 연산자 - IN 연산자 (2) | 2025.07.23 |