(해당 포스트는 Inflearn - [백문이불여일타] 데이터 분석을 위한 중급 SQL 강의록입니다.)
Join이 좌우로 데이터를 붙인다면 Union은 상하로 데이터를 붙이는 작업. 합집합.
Union의 가장 큰 특징은 distinct가 default라는 것. 따라서 중복값이 있을 경우 Union은 내가 별다른 지시(ex. distinct)를 내리지 않아도 알아서 중복값을 제거하여 result set으로 반환한다.
[참고] select문
Select Country From Customers
위 쿼리에는 Customers 테이블에서 Country 컬럼에 해당하는 정보를 중복과 관계 없이 모두 뽑아준다. 참고로 이 쿼리의 셀렉트절은
Select ALL Country
가 줄여진 표현으로, 만일 중복을 모두 제거하고 싶다면Select distinct Country
를 사용한다. 애초에 distinct가 default인 Union과는 반대되는 특징을 가지는 것이다.
만일 중복값도 함께 보고 싶을 경우에는 UNION ALL을 사용하면 된다.
이 부분 정말 불만인데 ...
두 result set의
차집합을 보고 싶을 경우 사용하는 MINUS (or EXCEPT),
교집합을 보고 싶을 때 사용하는 INTERSECT가 mysql 에서는 지원이 되지 않는다.
full outer join 같은 경우
아래처럼 left join과 right join을 union할 경우 조회 가능하다.
select *
from Customers
left join Orders on Customers.CustomerID=Orders.CustomerId
UNION
select *
from Customers
right join Orders on Customers.CustomerID=Orders.CustomerId