Itwill 학습내용 정리/1. SQL

8. 집합연산자

cannonvirus 2019. 4. 25. 22:21


※ EMP, DEPT, SALGRADE 테이블 구조


※ 집합연산자

union union all minus intersect



1. union VS union all

 # 비교 / 결과는 동일한 쿼리

 union은 데이터 중복을 제거하면서 데이터가 정렬

 

select deptno, sum(sal)

  from emp

  group by deptno

  union

select null as deptno, sum(sal)

  from emp;

union all은 중복이 있고 데이터가 무작위 정렬

정렬작업이 없어서 성능은 더 좋다. 따라서 정렬작업이 필요 없다면 union all을 쓰는 것이 바람직 하다.

 

select deptno, sum(sal)

  from emp

  group by deptno

  union

select null as deptno, sum(sal)

  from emp;

 # 문제 122. 다음 쿼리를 튜닝 전인 union all로 구현하시오.

 

 # 튜닝 후

select job, sum(sal)

  from emp

  group by rollup(job);

 

 # union all

select job, sum(sal)

  from emp

  group by job

union all

select to_char(null) as job, sum(sal) from emp;

 - 집합연산자 사용 시 주의

 1. 위아래의 컬럼의 갯수와 데이터 타입이 같아야 한다.

 2. order by 절은 맨 아래의 쿼리에만 사용 가능하다.

 

2. minus

 # 문제 123. dept에는 존재하지만, emp에는 존재하지 않는 부서번호를 출력하시오.

 

select deptno

  from dept

minus

select deptno

  from emp;

 

3. intersect

 # 문제 124. dept와 emp 테이블의 공통으로 있는 부서번호를 출력하시오.

 

select deptno

  from emp

intersect

select deptno

  from dept;

 

★ 보너스 ~ full outer join을 union으로 표현하는 방법

 # 다음의 쿼리를 union을 사용하여 표현하시오.

 

select e.ename, d.loc

  from emp e full outer join dept d

  on (e.deptno = d.deptno);

 

select ename, d.loc

  from emp e, dept d

  where e.deptno (+) = d.deptno

union

select ename, d.loc

  from emp e, dept d

  where e.deptno = d.deptno(+);

 

 

'Itwill 학습내용 정리 > 1. SQL' 카테고리의 다른 글

7.2 SubQuery를 이용한 튜닝  (0) 2019.04.25
7.1 SubQuery  (0) 2019.04.25
6.2 JOIN ~ 1999 ANSI  (0) 2019.04.25
6.1 JOIN ~ Oracle 버전  (0) 2019.04.25
5. 데이터 분석 함수  (0) 2019.04.25