Study/DB

[MySQL] SELECT UNION, UNION ALL 사용법 및 예제

 

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;

이 쿼리를 실행해도 오류가 나지 않습니다.