컴퓨터/MySQL

MySQL (15) - 쿼리문을 합하는 방법 (UNION, UNION ALL)

달서비 2023. 8. 13. 12:00

쿼리로 데이터를 뽑을 때 여러 개의 SQL 쿼리문을 사용하여 하나의 데이터로 출력해야 하는 경우가 있습니다. 이럴 때 사용할 수 있는 방법이 UNION입니다. 사용 방법에 대하여 알아보도록 하겠습니다.

클라우드 - Pixabay

예제 테이블

TABLE1
ID (PK) NAME
1 Jack
2 John
3 Yui
TABLE2
ID (PK) NAME
3 Yui
4 Minji
5 Minsu

 

UNION, UNION ALL

두 쿼리문을 UNION으로 묶는 방법은 다음과 같습니다.

SELECT * FROM TABLE1
UNION
SELECT * FROM TABLE2

UNION의 결과는 다음과 같습니다.

ID NAME
1 Jack
2 John
3 Yui
4 Minji
5 Minsu

UNION은 두 쿼리문의 결과 데이터들을 중복 처리가 되어 나옵니다. 그래서 3번의 데이터가 한 번만 나왔습니다. 그렇다면 UNION ALL은 어떨까요?

SELECT * FROM TABLE1
UNION ALL
SELECT * FROM TABLE2

UNION ALL의 결과는 다음과 같습니다.

ID NAME
1 Jack
2 John
3 Yui
3 Yui
4 Minji
5 Minsu

UNION ALL은 두 쿼리문의 결과를 그대로 붙입니다. 그래서 중복이 발생합니다.

 

차이점 및 UNION의 실행 순서

위에서 결과로 볼 때 UNION과 UNION ALL은 정렬하는 것에 대한 차이를 가지고 있습니다. 정렬의 유무는 쿼리문의 실행속도와 깊은 관계가 있습니다. UNION 구문의 실행순서는 다음과 같습니다.

  1. 최종 UNION [ALL | DISTINCT] 결과에 적합한 임시 테이블을 메모리 테이블로 생성한다.
  2. UNION 혹은 UNION DISTINCT인 경우에, 모든 테이블의 모든 컬럼으로 Unique Hash 인덱스를 생성한다.
  3. 서브 쿼리1 실행 후 결과를 임시테이블에 복사한다
  4. 서브 쿼리2 실행 후 결과를 임시테이블에 복사한다
  5. 3,4 번 과정에서 임시 테이블이 특정 사이즈 이상으로 커지면 디스크 임시 테이블로 변경한다
  6. 임시 테이블을 읽어서 결과를 클라이언트에게 전송한다
  7. 임시 테이블을 삭제한다

UNION을 사용하는 경우 2번의 과정이 추가되어 더 많은 시간을 소요합니다. 속도를 빠르게 하기 위해서 UNION 구문은 적합하지 않습니다. WHERE 구문을 적극적으로 이용하여 데이터를 최소 단위로 만들어 UNION ALL로 묶는 것이 더 빠른 속도를 가집니다. 

 

Reference

http://intomysql.blogspot.com/2011/01/union-union-all.html

 

UNION과 UNION ALL 의 차이 및 주의 사항

ANSI SQL에서 제안하는 집합 연산 "UNION", "INTERSECT", "MINUS" 중에서 MySQL에서는 UNION 집합 연산만 제공 하고 있다. (하지만 MySQL에서 INTERSECT나 MINUS를 다른 형태의 쿼리로 풀어서 사용할 수 ...

intomysql.blogspot.com