🟨 목 차 🟨
1. UNION
2. UNION ALL
3. UNION과 UNION ALL의 차이
3-1. UNION과 UNION ALL을 내부적으로 처리하는 과정
저번 시간에 여러 테이블에서 가져온 레코드를 조합하는 방법인 JOIN에 대해서 알아보았습니다.
이번 시간에는 여러 개의 SELECT 문의 결과를 하나의 테이블 또는 결과 집합으로 표현하는 UNION에 대해서 알아보겠습니다 :)
◼️ 1. UNION ◼️
UNION은 여러 개의 SELECT 문의 결과를 하나의 테이블로 표현할 때 사용한다.
[ UNION은 DISTINCT 키워드를 따로 명시하지 않아도 기본적으로 중복되는 레코드를 제거한다. ]
이 때 UNION을 사용할 때 주의 할 점은
- 대응하는 필드의 이름이 같아야 한다. 같지 않으면 AS(alias) 별칭을 사용하여 같게 만든다.
- 대응되는 각 필드의 타입이 같아야 한다.
[문법]
SELECT 필드이름
FROM 테이블이름
UNION
SELECT 필드이름
FROM 테이블이름
[예제]
SELECT Name
FROM Reservation
UNION
SELECT Name
FROM Customer;
==> 두 SELECT문의 결과는 하나로 합쳐져서 출력된다. 이때 두 SELECT문의 결과에서 중복된 레코드인 '홍길동'은 한번만 출력된다.
[ UNION은 DISTINCT 키워드를 따로 명시하지 않아도 기본적으로 중복되는 레코드를 제거한다. ]
◼️ 2. UNION ALL ◼️
UNION은 DISTINCT 키워드를 따로 명시하지 않아도 기본적으로 중복되는 레코드를 제거한다. 중복되는 레코드 까지 모두 출력하고 싶다면, UNION ALL 키워드를 사용해야 한다.
[문법]
SELECT 필드이름
FROM 테이블이름
UNION ALL
SELECT 필드이름
FROM 테이블이름
[예제]
SELECT Name
FROM Reservation
UNION ALL
SELECT Name
FROM Customer;
==> 두 SELECT 문의 결과는 하나로 합쳐져서 출력된다. 이때 두 SELECT문의 결과는 중복된 레코드 까지 모두 표시된다.
◼️ 3. UNION과 UNION ALL의 차이 ◼️
UNION : 중복 제거 됨
UNION ALL : 중복 제거 하지 않음
==> UNION ALL 이 중복제거하지 않으므로 UNION 보다 속도가 빠르다.
◼️ 3-1. UNION과 UNION ALL을 내부적으로 처리하는 과정
- 최종 UNION [ALL | DISTINCT] 결과에 적합한 임시 테이블을 메모리 테이블로 생성
- UNION 또는 UNION DISTINCT 의 경우, 임시 테이블의 모든 컬럼으로 Unique Hash 인덱스 생성
- 서브쿼리 1실행 후 결과를 임시테이블에 복사
- 서브쿼리 2 실행 후 결과를 임시테이블에 복사
- 3,4 번 과정에서 임시 테이블이 특정 사이즈 이상으로 커지면 임시 테이블을 디스크 임시 테이블로 변경
- 임시 테이블을 읽어서 클라이언트에 결과 전송
- 임시 테이블 삭제
==> UNION 하는 컬럼들의 수가 많아지고 레코드의 사이즈가 커질수록(데이터가 많을수록) 두 작업 모두에게 불리하겠지만, 그래도 UNINO ALL보다 UNION이 더 악영향이 클 것이다.
따라서 최종적으로,
1. UNION , UNION ALL 그리 좋은 SQL 작성은 아니다. 따라서 모델링 차원에서 테이블을 통합하는게 좋다.
2. UNION 보다는 UNION ALL 을 사용하는게 좋다. UNION 을 사용해야 한다면, 최소 필요 컬럼만 SELECT 하는게 좋다.
참고
'DB > MySQL' 카테고리의 다른 글
MySQL 테이블에서 원하는 데이터 쉽고 빠르게 찾기(INDEX) feat.Workbench (0) | 2022.08.20 |
---|---|
MySQL 다른 쿼리 내부에 포함되어 있는 SELECT문(서브쿼리) feat.Workbench (0) | 2022.08.20 |
MySQL 테이블 레코드 조합(JOIN) feat.Workbench (0) | 2022.08.19 |
MySQL 기본문법 feat.Workbench (0) | 2022.08.19 |
Workbench(MySQL)로 스키마와 테이블 만들기 (0) | 2022.08.17 |