1. 합집합 (union all)
union all
은 여러 테이블을 합치는 함수이다. 그냥 합치기 때문에 연산을 하지 않는다.
아래의 코드는 각 부서의 월급의 합과 모든 부서의 합을 합치려고 한다. 하지만 오류가 난다.-- 1. 한꺼번에 붙이기
select sum(sal),deptno
from emp
where deptno = 10
union all
select sum(sal),deptno
from emp
where deptno = 20
union all
select sum(sal),deptno
from emp
where deptno = 30
select sum(sal)
from emp;

해당 오류가 나오며 실행 되지 않는다. 디버깅을 해보면
select
에서 조회하는 column
의 갯수가 맞지 않기 때문에 오류가 난다. select sum(sal), null
from emp;
위 코드 처럼
null
이라는 column
을 따로 뽑아주면 실행된다.
튜닝하기
group by
를 사용하여 코드를 가독성이 좋게 바꿔보자.
-- 튜닝하기
select sum(sal), deptno
from emp
group by deptno
union all
select sum(sal), null
from emp;

2. 합집합 (union)
union
은 union all
과 다른 점은 중복이 있다면 결과를 합치기 때문에 연산이 필요하다. 이유는 같은 결과가 있는지 확인을 하려면 두 수의 값을 비교하고 같으면 합쳐야 하기 때문에 연산이 필요하다. 만약 두 테이블을 합치고 싶다면 union all
을 사용하는게 더 효율적이다.-- 2. union (중복을 제거하고 한번에 붙이기) 결과가 같으면 합침 - 중복을 비교하기 떄문에 느려짐
select *
from dept
where deptno > 10 -- 20, 30, 40
union
select *
from dept
where deptno < 30; -- 10, 20
3. 교집합 (intersect)
intersect
두 테이블의 같은 데이터만 조회한다.
하지만 MySQL workspace 툴에서 키워드 인식을 못한다.-- 3. intersect (교집합 - 툴이 함수도 인식을 못함)
select *
from dept
where deptno > 10 -- 20, 30, 40
intersect
select *
from dept
where deptno < 30; -- 10, 20

4. 차집합 (except)
except
는 두 테이블의 집합에 속하는 데이터를 제외하고 조회하는 함수이다.
MySQL workspace 툴에서 키워드 인식은 하지만 빨간 밑줄이 나옴.-- 4. EXCEPT (차집합 - 툴이 인식은 하지만 오류)
select *
from dept
where deptno > 10 -- 20, 30, 40
EXCEPT
select *
from dept
where deptno < 30; -- 10, 20

Share article