UNION 절은 여러 테이블의 데이터를 통합할 수 있는 쿼리입니다.
JOIN 절과는 다른데, JOIN 절은 ON 조건으로 각 테이블을 연결해서 보여준다면 UNION 절은 테이블 연결 없이 그냥 합쳐서 보여준다는 느낌에 더 가깝습니다.
기본 사용법
다음과 같이 사용할 수 있습니다.
# UNION 절
SELECT <컬럼1>, <컬럼2>
FROM <테이블1>
WHERE <조건>
UNION
SELECT <컬럼1>, <컬럼2>
FROM <테이블2>
WHERE <조건>
# UNION ALL 절
SELECT <컬럼1>, <컬럼2>
FROM <테이블1>
WHERE <조건>
UNION ALL
SELECT <컬럼1>, <컬럼2>
FROM <테이블2>
WHERE <조건>
UNION과 UNION ALL의 차이점은 중복을 제거하냐의 차이입니다.
UNION은 중복을 제거하고, UNION ALL은 중복을 제거하지 않습니다.
예제
# 중복 제거
select CountryCode
from city
union
select Code
from country;
# 중복 제거 없이 전체 조회
select CountryCode
from city
union all
select Code
from country;
city의 국가 코드와 country의 국가 코드를 합쳐서 조회하는 쿼리입니다.
만약 limit 절을 추가하면 union의 결과 데이터에 적용됩니다.
# country 조회 결과에 limit 10이 적용되는게 아니라 union의 결과에 limit 10이 적용됨
select Population
from city
union
select Code
from country
limit 10;
# 문법 오류 발생
select Population
from city
limit 10
union
select Code
from country
limit 10;
오류가 발생하는 경우
만약에 각 테이블의 결과 컬럼이 서로 맞지 않으면 오류가 발생합니다.
select CountryCode, Population
from city
union
select Code
from country;
city 테이블에서 CountryCode, Population을 조회한 데이터와 country 테이블에서 Code를 조회한 데이터를 합치는 쿼리입니다.
이 쿼리를 실행하게 되면 다음과 같은 오류메시지가 나옵니다.
Error Code: 1222. The used SELECT statements have a different number of columns
컬럼의 수가 달라서 오류가 발생했다는 의미입니다.
위 쿼리에서 조회되는 컬럼의 개수가 3개면 아래 쿼리도 3개여야 하고, 아래 쿼리가 2개 컬럼을 조회하면 위 쿼리도 2개 컬럼을 조회해야 합니다.
그래서 SELECT 절에 *을 사용하는 경우를 주의해야합니다.
컬럼 타입은 서로 맞지 않아도 상관 없습니다.
# INT 타입 컬럼과 Char 타입 컬럼을 함께 조회 가능
select Population
from city
union
select Code
from country;
이 쿼리를 실행해도 오류가 나지 않습니다.