[ 집합 연산자 ]
합집합, 교집합, 차집합의 리턴을 도와주는 표현식
집합 : select문 결과
1. 합집합 : union / union all (모든 언어는 중복제거에 정렬을 동반한다)
1) union : 중복된 값을 한번만 출력(정렬 동반)
2) union all : 중복된 값 모두 출력
**union과 union all 결과가 같다면(교집합이 없을 경우) union all 을 쓰는 것이 성능상 유리 (불필요한 정렬을 피할 수 있으므로)
create table emp_test1 --줄여서 CTAS : 테이블 복제/백업
as
select * from emp where deptno in (10,20);
예제) emp와 emp_test1 테이블 데이터의 합집합 출력
insert into emp_test1(empno, ename, sal, deptno)
values(9999,'홍길동',5000,20);
commit;
select ename,sal,deptno
from emp
union
select ename,sal,deptno
from emp_test1;
select ename,sal,deptno
from emp
union all
select ename,sal,deptno
from emp_test1;
2. 교집합 : intersect
select ename, deptno
from emp
intersect
select ename, deptno
from emp_test1;
3. 차집합 : minus
select ename, deptno
from emp
minus
select ename, deptno
from emp_test1;
** 집합연산자 사용 시 주의사항
1) 각 집합의 출력 컬럼수 일치
2) 각 집합의 출력 컬럼순서 일치
3) 각 집합에서 같은 위치에 있는 컬럼의 데이터 타입 일치 **
4) 집합연산자를 사용한 쿼리문에서 각 집합에 order by 사용 불가
select ename, sal, deptno
from emp
where deptno = 10
order by sal desc --error
union all
select ename, sal, deptno
from emp
where deptno = 20
order by sal desc;
에러 발생한다.
select ename, sal, deptno
from emp
where deptno = 10
union all
select ename, sal, deptno
from emp
where deptno = 20
order by sal desc; -- 정상(union all 후 전체 집합에 대해 정렬 시도 --> 가능)
** group by 제한 없음
select deptno, null as job, sum(sal) as sum_sal
from emp
group by deptno
union all
select null, job, sum(sal)
from emp
group by job;
위의 컬럼명 따라감.
자리를 맞추기 위해 null 이용해서 맞춘다.
'SQL' 카테고리의 다른 글
16.조인(2)(natural,equi,outer,self) (2) | 2024.10.24 |
---|---|
15. 조인(1)( cross join, inner join) (0) | 2024.10.21 |
13. 외부 데이터 적재 (1) | 2024.10.21 |
12. 그룹함수(집계함수) (1) | 2024.10.18 |
11.변환함수(2) (1) | 2024.10.18 |