Programming/SQL

[SQL] 집합연산자 - union / intersect / except / union all

reeme 2020. 12. 17. 22:55

집합연산자

: 테이블을 구성하는 튜플 집합에 대한 테이블의 부분 집합을 결과로 반환하는 연산자

UNION  합집합
INTERSECT  교집합
EXCEPT  차집합(Oracle 에선 MINUS 사용 )

 

 

UNION

예) 부서 번호 10 인 사원들과 직급이 staff 인 사원들 검색

(select * from employee where dno=10) 
union(select * from employee where job='staff');

-- 결과정렬을 하고싶다면 쿼리끝에 해주면 됨.

(select * from employee where dno=10) 
union(select * from employee where job='staff')
order by salary;

예) null값을 넣을때

select eno, ename, dno, ""  from employee 
-- 속성의 갯수 ( eno, ename , job , manager, hiredate, salary, commission, dno) 
 union
 select "", "" , dno, dname from department; -- 속성의 갯수와 안맞으면 실행이 안됨 
 -- varchar 타입이라서 ""으로 맞춰줌 (속성을 맞춰줘야함) null로 해도됨 null은 모든타입의 속성을 포괄함 

 

 

INTERSECT 
예) 부서 번호 10 이고 직급이 staff 인 사원들 검색

(select * from employee where dno=10) 
intersect(select* from employee where job='staff');

-- intersect 는 mysql에서는 지원하지 않음 > 아래와 같이 대체해서 사용할 수 있음 

select * from employee where dno =10 and job = 'staff';
-- 이렇게 되면 교집합이 나옴 그게 아니고 합집합을 원하는것 
select * from employee where dno='10'
union
select * from employee where job='staff';

 

 

EXCEPT 
예) 부서번호 10인 사원들 중 직급이 STAFF인 사원들 검색

(select * from employee where dno=10) 
except(select * from employee where job='staff');


-- except 는 mysql에서는 지원하지 않음 > 아래와 같이 대체해서 사용할 수 있음 

select * from employee where dno =10 and job = 'staff';

 

 


UNION과 UNION ALL

UNION이 중복을 허용하지 않을때 UNION ALL을 사용
예) 부서번호 10인 사원들과 직급이 STAFF인 사원들을 검색 ( 중복허용 ) 

(select * from employee where dno = 10) union all ( select * from employee where job='staff');