404 Brain Not Found
[database] UNION, UNION ALL 본문
UNION, UNION ALL 구문에 대해서 정리해 보겠습니다.
관계형 데이터베이스에서 여러 테이블을 JOIN 해서 보여줄 때는 참조할 수 있는 key가 존재해야 합니다.
하지만 그렇지 않은 상황에서도 여러 테이블을 합쳐서 출력하고 싶을 때가 있습니다.
그럴 때 UNION, UNION ALL을 사용합니다.
요약하자면 UNION과 UNION ALL은 SQL에서 두 개 이상의 SELECT 문의 결과를 결합하는 데 사용되는 중요한 연산자입니다. 각각의 특징과 차이점을 설명해 드리겠습니다.
1. UNION
-두 개 이상의 SELECT 문의 결과를 결합합니다.
-중복된 행을 제거합니다. 결과 집합에는 고유한 행만 포함됩니다.
-결과를 정렬합니다. (대부분의 데이터베이스 시스템에서).
-성능 면에서는 UNION ALL보다 조금 더 느릴 수 있습니다 (중복 제거 작업 때문에)
2. UNION ALL
-마찬가지로 두 개 이상의 SELECT 문의 결과를 결합합니다.
-중복된 행을 제거하지 않습니다. 모든 행이 결과에 포함됩니다.
-결과를 정렬하지 않습니다.
-일반적으로 UNION보다 성능이 더 좋습니다.
그러면 예제를 진행해 보면서 UNION과 UNION ALL에 대해서 좀 더 익혀보겠습니다.
아래의 스크립트를 실행하여 테이블을 생성하고 임시 데이터를 채워 넣습니다.
-- 테이블 생성
CREATE TABLE employees_hr (
id INT PRIMARY KEY,
name VARCHAR(50),
department VARCHAR(50)
);
CREATE TABLE employees_finance (
id INT PRIMARY KEY,
name VARCHAR(50),
department VARCHAR(50)
);
-- 데이터 삽입
INSERT INTO employees_hr (id, name, department) VALUES
(1, 'John Doe', 'HR'),
(2, 'Jane Smith', 'HR'),
(3, 'Mike Johnson', 'HR');
INSERT INTO employees_finance (id, name, department) VALUES
(3, 'Mike Johnson', 'HR'),
(4, 'Sarah Brown', 'Finance'),
(5, 'Tom Davis', 'Finance');
이제 UNION과 UNION ALL 쿼리를 사용하여 데이터를 조회해 보겠습니다.
UNION을 사용했을 경우 (3, Mike Jonhnson, HR) 컬럼이 employees_hr, employees_finance 두 개의 테이블에 존재하므로 제거돼서 출력된 것을 확인할 수 있습니다.
UNION ALL을 사용했을 경우 (3, Mike Jonhnson, HR) 컬럼이 employees_hr, employees_finance 두 개의 테이블에 존재하지만 모두 한 번에 출력된 것을 확인할 수 있습니다.
그러면 이전에 만들었던 orderdetails 테이블도 UNION 하여서 출력해 보겠습니다.
(orderdetails는 아래처럼 생겼습니다.)
하지만 이때 UNION, UNION ALL을 사용하기 위한 제약사항이 존재합니다.
열 구조의 호환성:
- 결합하려는 SELECT 문들은 같은 수의 열을 반환해야 하며, 대응되는 열의 데이터 타입이 호환되어야 합니다.
- 열 이름은 달라도 되지만, 최종 결과는 첫 번째 SELECT 문의 열 이름을 따릅니다.
즉, UNION, UNION ALL 을 사용하기 위해서는 출력해야 하는 컬럼수가 같아야 한다는 것입니다. A가 컬럼이 (10개) B가 컬림이 (20개)라고 가정하면, A와 B를 UNION 하기 위해서는 A도 억지로 컬럼 20개를 맞춰줘야 합니다. (자료형도 맞춰줘야 합니다.)
자 이제 그러면 본론으로 돌와와서 employees_hr, employees_finance, orderdetails 3개의 테이블을 UNION ALL을 이용하여 모두 출력해 보겠습니다.
-- UNION ALL 사용
SELECT id, name, department FROM employees_hr
UNION ALL
SELECT id, name, department FROM employees_finance
UNION ALL
SELECT orderdetails.OrderDetailID, orderdetails.ProductName, '부서없음' FROM orderdetails;
저는 employees_hr 기준으로 3개의 컬럼을 출력하였습니다. 중요한 점은 UNION 하려는 컬럼의 숫자와 타입을 맞춰줘야 한다는 것입니다. UNION, UNION ALL은 간단하고 별거 없어서 사용 안될 것 같으나, 서브 쿼리나, 고급 쿼리를 사용할 때 유용하게 사용되는 구문입니다.
'DB 정리' 카테고리의 다른 글
[database] SELECT JOIN (2) | 2024.09.16 |
---|---|
[database] SELECT 쿼리 실행순서 (3) | 2024.09.16 |