티스토리 뷰

SQL

[SQL] 10. 집합 연산자

superkong1 2018. 2. 1. 11:11
반응형

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가지가 있다.

  1. 위 아래 쿼리의 출력되는 컬럼(변수)의 개수가 서로 같아야 한다.
  2. 위 아래 쿼리의 출력되는 컬럼(변수)의 데이터타입이 서로 같아야 한다.
  3. order by 절은 맨 아래 쿼리에만 사용할 수 있다.
  4. 컬럼(변수) 별칭은 맨 위의 컬럼에만 사용할 수 있다.

방금 위에서 살펴본 쿼리를 확인해보면
위 쿼리: 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을 활용해 작성하였습니다=================

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
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
글 보관함