본문 바로가기

SQL

14. 집합 연산자


[ 집합 연산자 ]
 합집합, 교집합, 차집합의 리턴을 도와주는 표현식
 집합 : 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