쿼리로 데이터를 뽑을 때 여러 개의 SQL 쿼리문을 사용하여 하나의 데이터로 출력해야 하는 경우가 있습니다. 이럴 때 사용할 수 있는 방법이 UNION입니다. 사용 방법에 대하여 알아보도록 하겠습니다.
예제 테이블
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 구문의 실행순서는 다음과 같습니다.
- 최종 UNION [ALL | DISTINCT] 결과에 적합한 임시 테이블을 메모리 테이블로 생성한다.
- UNION 혹은 UNION DISTINCT인 경우에, 모든 테이블의 모든 컬럼으로 Unique Hash 인덱스를 생성한다.
- 서브 쿼리1 실행 후 결과를 임시테이블에 복사한다
- 서브 쿼리2 실행 후 결과를 임시테이블에 복사한다
- 3,4 번 과정에서 임시 테이블이 특정 사이즈 이상으로 커지면 디스크 임시 테이블로 변경한다
- 임시 테이블을 읽어서 결과를 클라이언트에게 전송한다
- 임시 테이블을 삭제한다
UNION을 사용하는 경우 2번의 과정이 추가되어 더 많은 시간을 소요합니다. 속도를 빠르게 하기 위해서 UNION 구문은 적합하지 않습니다. WHERE 구문을 적극적으로 이용하여 데이터를 최소 단위로 만들어 UNION ALL로 묶는 것이 더 빠른 속도를 가집니다.
Reference
http://intomysql.blogspot.com/2011/01/union-union-all.html
'컴퓨터 > MySQL' 카테고리의 다른 글
MySQL (17) - Join에서 중복을 제거하는 방법 (0) | 2023.10.19 |
---|---|
MySQL (16) - 뷰(View)에 대하여 알아보자 (0) | 2023.10.03 |
MySQL (14) - 내장함수를 이용하여 날짜 및 시간을 다뤄보자 (0) | 2023.06.20 |
MySQL (13) - 프로시저(Procedure)와 함수(Function) (0) | 2023.05.01 |
MySQL (12) - 집계함수에 대하여 알아보자 (COUNT, SUM, AVG, MIN, MAX) (0) | 2023.04.05 |