티스토리 뷰
10. 집합 연산자
집합 연산자는 두 가지 이상 쿼리(query) 명령문의 결과를 한 번에 보여주는 기능을 한다.
ORACLE 집합 연산자는 union all, union, intersect, minus 등이 있다.
예제로 확인해보자.
예제) emp테이블의 직업(job)별 월급(sal) 총 합을 나타내시오!
select job, sum(sal)
from emp
group by job ;
만약 이 쿼리 맨 밑에 월급의 총 합을 나타내려면 어떻게할까?
우선 총 합을 출력해보자.
select '총 합:', sum(sal)
from emp ;
첫번째 쿼리와 두번째 쿼리가 합쳐서 결과가 출력되기를 원할 때,
대표적인 집합 연산자인 union all을 통해 이를 구현할 수 있다.
집합 연산자 사용방법은 두 가지 이상의 쿼리 사이에 집합 연산자를 넣어주기만 하면 된다.
(집합 연산자 사용 시 명령문이 끝났음을 알리는 세미콜론(;)은 마지막에만 붙인다.)
select job, sum(sal)
from emp
group by job
union all
select '총 합:', sum(sal)
from emp ;
참으로 편리한 기능이다.
이러한 집합 연산자를 사용할 때 주의할 점은 4가지가 있다.
- 위 아래 쿼리의 출력되는 컬럼(변수)의 개수가 서로 같아야 한다.
- 위 아래 쿼리의 출력되는 컬럼(변수)의 데이터타입이 서로 같아야 한다.
- order by 절은 맨 아래 쿼리에만 사용할 수 있다.
- 컬럼(변수) 별칭은 맨 위의 컬럼에만 사용할 수 있다.
방금 위에서 살펴본 쿼리를 확인해보면
위 쿼리: job(문자형), sum(sal)(숫자형) 2개
아래 쿼리: '총 합:'(문자형), sum(sal)(숫자형) 2개
집합 연산자를 쓰기에 적합한 조건을 갖추고 있었다.
추가적으로 위의 3/4번을 활용하면, 집합 연산자를 기준으로 위 쿼리에서 별칭을 만들고,
아래 쿼리의 order by에 적용할 수 있다.
만약 위 쿼리의 두번째 컬럼을 기준으로 order by 한다면 이는 곧
order by 2로 입력해도 동일한 결과를 나타낸다.
집합 연산자를 하나하나 살펴보기전 간단하게 요약하면 아래와 같다.
union all / union
위에서 출력해보았던 union all과 union은 두가지 이상의 쿼리를 합쳐주는
합집합 역할의 연산자인 것은 동일하다.
하지만 union all은 쿼리들의 결과를 합쳐줄 때 단순히 더해주는 +(플러스)의 기능이고,
union은 결과값에서 중복값을 제거하고, 정렬도 해서 출력해준다.
예제) 부서번호(deptno)가 30번인 사원들과 직업(job)이 SALESMAN인 사원들을 출력하시오!
미리 각각의 결과값을 확인해보자.
<부서번호(deptno)가 30번인 사원들>
<직업(job)이 SALESMAN인 사원들>
이제 union all과 union을 사용해보면
select ename
from emp
where deptno=30
union all
select ename
from emp
where job='SALESMAN';
select ename
from emp
where deptno=30
union
select ename
from emp
where job='SALESMAN';
결과를 보면 내가 원하는 출력값을 위해 어떤 집합 연산자를 사용해야하는지 직관적으로 알 수 있다.
intersect / minus
위의 예시로 intersect와 minus를 실행해보자.
select ename
from emp
where deptno=30
intersect
select ename
from emp
where job='SALESMAN';
위 두가지 쿼리 출력 결과의 공통된 것만 출력해준다.
select ename
from emp
where deptno=30
minus
select ename
from emp
where job='SALESMAN';
위의 쿼리의 출력값에서 아래 쿼리의 출력값을 빼고 남은 것만 출력해준다.
여기에서 위, 아래 쿼리의 순서를 바꾸고 minus를 쓰면 아무것도 출력되지 않는다.
(부서번호가 30인 사원들이 더 많으며, SALESMAN 모두 부서번호 30번에 속하기 때문)
=================이 글은 Markdown을 활용해 작성하였습니다=================
'SQL' 카테고리의 다른 글
[SQL] 11. 레포팅 함수 (0) | 2018.02.02 |
---|---|
[SQL] 포트폴리오 - Youtube의 Trending(인기 급상승) 동영상의 제목에서 최빈도 단어 확인 (1) | 2018.02.01 |
[SQL] 9. 서브쿼리 (0) | 2018.01.31 |
[SQL] 8. Join (0) | 2018.01.30 |
[SQL] 7. 데이터 분석함수 (0) | 2018.01.26 |
- Total
- Today
- Yesterday
- Big Data
- hadoop setup
- 하둡
- 하둡설치가이드
- hadoop 2.7 install
- 하둡 설치 가이드
- hadoop install
- hadoop2.7
- 하둡설치
- Data Analysis
- 빅데이터
- data
- 데이터 분석
- hadoop
- 하둡2.7
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |