본문 바로가기
공부/Oracle

오라클 SQL 문법 공부15 - 집합연산자 (UNION, UNION ALL, INTERSECT, MINUS)

by 리빈아빠 2017. 10. 30.
반응형

서론

이번에는 복수의 테이블들을 묶어 하나의 테이블로 표시해 주는 집합연산자에 대해서 알아보고자 한다. 몇 가지만 이해하면 쓰는데 큰 무리가 없으니 4가지만 기억 하면 되겠다.

본론

UNION, UNION ALL

--집합 연산자
--두개 이상의 집합에 대한 처리를 가능하게 하는 연산자이다.
--집합 연산자는 두개 이상의 SQL 구문 사이에 쓸 수 있다

--UNION 과 UNION ALL
--두 집합의 합집합을 나타내는 연산자
--UNION의 경우 중복된 값을 제거하여 나타낸다.
--UNION ALL의 경우 중복된 값 까지 모두 나타낸다.
--UNION은 중복된 값을 제거하기 위해 오라클 내부에서 정렬을 수행
--중복된 값이 없는데 굳이 UNION 써서 내부 정렬 할 필요 없음 ALL로 쓰면 정렬 안함
--가장 위에 있는 SQL문의 데이터 타입과 명으로 결정된다.

--10인 부서는 연봉을 10% 올리고, 20인 부서는 20% 올린 값 표현
SELECT EMPNO, ENAME, DEPTNO, SAL*1.1
 FROM EMP
 WHERE DEPTNO = 10

UNION ALL

SELECT EMPNO, ENAME, DEPTNO, SAL*1.2
 FROM EMP
 WHERE DEPTNO = 20;

집합연산자는 두 SQL 문 사이에 사용하면 된다. 주의 할 것은 세미콜론은 집합연산자가 포함된 복수개의 SQL문들의 가장 마지막에 붙여주어야 한다. (아무 생각없이 이미 작성된 SQL문을 복사 붙여넣기 해서 SQL문 마다 세미콜론을 붙이면 오류가 난다.)


또한 주의할점은 첫번째 SQL문의 SELECT 절에 있는 컬럼들의 개수와 데이터 타입이 모든 SQL문들과 일치해야 한다. 예를 들어 첫번째 SQL문의 첫번째 컬럼이 NUMBER 형이지만 두번째 SQL문의 첫번째 컬럼이 VARCHAR2 형태라면 오류가 난다. VARCHAR2 형태의 컬럼을 TO_NUMBER로 형변환을 해주거나 NUMBER 형을 TO_CHAR로 형변환 해주어야 정상적으로 조회가 가능 할 것이다.


첫번째 SQL문에서는 아스타(*)를 붙여 5개의 컬럼들을 표시한다고 가정 했을때 두번째 SQL문 역시 동일한 순서와 데이터 타입으로 맞춰주어야 정상적으로 조회가 가능하다. 마지막으로 UNION은 중복값을 제외하고 (모든컬럼이 동일한 행들을) 표시를 하게 해주고 UNION ALL은 중복값을 무시하고 모두 표시하게 해준다는 차이만 알아두면 되겠다. 물론 UNION이 중복값을 제외하고 표시하기 때문에 속도가 느릴 수도 있다.

INTERSECT, MINUS

--INTERSECT 연산자
--두 집합에서 공통으로 존재하는 데이터(교집합)을 나타낸다.
--중복된 값만 나옴

--MINUS 연산자
--위의 집합에서 아래 집합의 결과 값을 제거하고 출력(차집합) 한다
--순서가 중요하다

INTERSECT 연산자는 동일한 값만 표시해준다고 생각하면 된다. UNION 연산자에서 제외된 목록들만 표시 된다고 생각하면 쉽다. (A∩B)


MINUS 연산자는 차집합이다. MINUS 연산자 앞에 있는 SQL문의 데이터 중에 MINUS 뒤에 있는 SQL문과 중복된 값이 있을 경우 제외한 값들을 표시해 준다. (A-B)

실습문제

--EMP테이블의 회사와 EMP2 테이블의 회사가 합병을 한다고 한다.
--각 회사의 직원테이블을 합쳐서 합병된 직원의 정보를 완성시키고자 한다.
--출력되는 정보는 사원번호, 사원명, 입사일자, 연봉을 출력하되,
--EMP 테이블에서의 연봉은 SAL*12 + COMM,
--EMP2 테이블에서의 연봉은 PAY로 한다
--단, 입사일자가 없는 직원에 대해서는 오늘날짜를 부여한다.

SELECT lpad(to_char(EMPNO), 8, '0'), ENAME, HIREDATE, SAL*12 + NVL(COMM, 0)
FROM EMP
UNION ALL
SELECT to_char(EMPNO), NAME, SYSDATE, PAY FROM EMP2;

결론

집합연산자에 대해서 알아보았다. 보통 집합연산자보단 JOIN이라는 걸 사용하여 처리를 많이 하는데 JOIN보다 집합연산자를 사용할 때 속도가 더 빠른 경우들도 있다. 따라서 단순히 속도 측면이 아니라 조회를 위해서는 JOIN을 사용하는게 편하지만 속도까지 고려할 때는 집합연산자도 고려해볼 필요가 있을 것이다. 다음 장에서 JOIN에 대해서 다뤄보겠다.