RDBS/MYSQL

[MySQL]UNION, UNION ALL(데이터 병합) 구문 알아보기

MoonSta 2023. 8. 4. 09:27

 MySQL에서의 UNION 구문은 n개 이상의 조회 결과에 대한 데이터를 병합해 주는 구문입니다. 또한 UNION, UNION ALL 이 두 개의 사용에 따라 조회 결과가 조금 달라지기 때문에 아래 예제를 보며 비교해보도록 하겠습니다. 

 


 

UNION, UNION ALL의 기본 문법 및 차이 

 MySQL에서 UNION과 UNION ALL은 두 개 이상의 조회 결과를 병합하는 경우에 사용됩니다. 하지만 두 개의 구문에서 병합 방식에 차이가 존재합니다. 기본 문법과 같이 차이점에 대해 알아보도록 하겠습니다.

 

우선 UNION입니다.

SELECT column1, column2, ... FROM table_name1
UNION
SELECT column1, column2, ... FROM table_name2;

 

다음으론 UNION ALL 구문입니다.

SELECT column1, column2, ... FROM table_name1
UNION ALL
SELECT column1, column2, ... FROM table_name2;

 

이 두개의 쿼리를 비교해보면 ALL이라는 키워드 이외에 별 다른 차이는 없는 것으로 보이는데 중요한 차이점이 존재합니다. 바로 중복된 데이터를 포함하는지의 여부입니다. 이러한 차이점은 아래 예제를 통해 확인해보도록 하겠습니다.

 


 

UNION, UNION ALL 비교 예제

 

MEM_ID MEM_NAME MEM_EMAIL MEM_ADDRESS
100004 김OO aa@gmail.com 경기 안산시
100006 박OO bb@naver.com 경기 안양시 

 

STUDENT_ID STUDENT_NAME STUDENT_EMAIL STUDENT_ADDRESS
1 김OO aa@gmail.com 경기 안산시
2 차OO cc@hanmail.net 부산광역시

 

 위의 예시처럼 각기 다른 두 개의 테이블이 있다고 가정했을 때, UNION 구문을 사용하여 각 테이블의 EMAIL의 정보를 조회하여 병합해보도록 하겠습니다. 하지만 UNION 구문을 사용하기 위해선 일정한 규칙을 지켜야 합니다. 그 규칙은 다음과 같습니다.

 

  1. 각 쿼리의 SELECT 절 칼럼의 개수 및 데이터 타입이 일치해야 한다.
  2. 대응하는 컬럼 명이 같아야 한다. (단, 별칭 사용 가능)
  3. ORDER BY 절은 마지막에 한 번 사용 가능하다.

 

위의 조건을 만족하였다면, 이제 데이터를 병합해보도록 하겠습니다. 

SELECT STUDENT_EMAIL AS EMAIL FROM MEMBER
UNION
SELECT MEM_EMAIL AS EMAIL FROM STUDENT;

 

 

MEM_EMAIL
aa@gmail.com
bb@naver.com
cc@hanmail.net

 

위와 같은 결과를 확인할 수 있습니다. 하지만 각 테이블 별로 데이터가 두 개씩 존재하는데 왜 UNION 구문을 사용하면 세 개의 데이터가 출력되는 걸까요? 그 이유는 UNION 구문은 병합하는 과정에서 중복 데이터가 사라지게 됩니다. 하지만 실제 중복 데이터도 포함하여 병합해야 되는 경우가 존재합니다. 이러한 경우에는 UNION ALL을 사용하여 조건에 맞는 모든 데이터를 병합할 수 있습니다.

 

SELECT STUDENT_EMAIL AS EMAIL FROM MEMBER
UNION ALL
SELECT MEM_EMAIL AS EMAIL FROM STUDENT;
MEM_EMAIL
aa@gmail.com
bb@naver.com
aa@gmail.com
cc@hanmail.net