SQL Union
SQL UNION: 여러 SELECT 쿼리의 결과를 결합
SQL UNION 연산자는 두 개 이상의 SELECT 쿼리의 결과를 하나로 결합할 때 사용됩니다. UNION은 각 SELECT 쿼리의 결과에서 중복된 행을 제거하고, 모든 고유한 행을 반환합니다. 각 SELECT 쿼리는 같은 수의 열을 가져야 하며, 데이터 유형이 일치해야 합니다.
1. 기본 UNION 문법
SELECT 열이름1, 열이름2, ...
FROM 테이블1
UNION
SELECT 열이름1, 열이름2, ...
FROM 테이블2;
- 각 SELECT 쿼리는 동일한 열 수와 데이터 유형을 가져야 합니다.
- 기본적으로 UNION은 중복된 행을 제거합니다. 중복된 행을 포함하고 싶다면 UNION ALL을 사용해야 합니다.
2. SQL UNION 예제
2.1 기본 UNION
다음은 employees_2023
과 employees_2024
테이블에서 2023년과 2024년의 직원 정보를 결합하는 예제입니다.
SELECT name, department
FROM employees_2023
UNION
SELECT name, department
FROM employees_2024;
이 쿼리는 두 테이블에서 중복된 직원을 제거하고 고유한 직원 목록을 반환합니다.
결과 예시:
name | department |
---|---|
John | Sales |
Jane | HR |
Alice | Engineering |
3. UNION ALL: 중복된 행을 포함하여 결합
UNION ALL 연산자는 중복된 행을 제거하지 않고, 모든 행을 포함하여 결과를 결합합니다. 이를 통해 중복된 데이터도 결과에 포함됩니다.
예제: 중복된 행을 포함하여 결합
SELECT name, department
FROM employees_2023
UNION ALL
SELECT name, department
FROM employees_2024;
이 쿼리는 중복된 행을 포함한 전체 직원 목록을 반환합니다.
결과 예시:
name | department |
---|---|
John | Sales |
Jane | HR |
Alice | Engineering |
John | Sales |
4. UNION과 WHERE 절 사용
WHERE 절을 사용하여 각 SELECT 쿼리에서 조건을 설정할 수 있습니다. 이를 통해 특정 조건을 만족하는 데이터를 결합할 수 있습니다.
예제: 2023년 직원 중 Sales 부서와 2024년 직원 중 HR 부서만 결합
SELECT name, department
FROM employees_2023
WHERE department = 'Sales'
UNION
SELECT name, department
FROM employees_2024
WHERE department = 'HR';
이 쿼리는 2023년의 Sales 부서 직원과 2024년의 HR 부서 직원을 결합합니다.
결과 예시:
name | department |
---|---|
John | Sales |
Jane | HR |
5. UNION과 ORDER BY 사용
UNION으로 결합된 결과에 ORDER BY를 적용하여 데이터를 정렬할 수 있습니다. ORDER BY는 전체 UNION 결과에 적용되며, 개별 SELECT 쿼리에서 사용되지 않습니다.
예제: 직원 이름을 오름차순으로 정렬
SELECT name, department
FROM employees_2023
UNION
SELECT name, department
FROM employees_2024
ORDER BY name ASC;
이 쿼리는 결합된 결과를 이름 순으로 오름차순 정렬하여 반환합니다.
결과 예시:
name | department |
---|---|
Alice | Engineering |
Jane | HR |
John | Sales |
6. UNION과 서로 다른 데이터 집합 결합
UNION은 서로 다른 테이블에서 같은 의미를 가지는 데이터를 결합할 때 매우 유용합니다. 예를 들어, 여러 연도 또는 여러 지점의 데이터를 하나로 결합할 수 있습니다.
예제: 여러 지점의 판매 데이터를 결합
SELECT product_name, sales_amount
FROM sales_north
UNION
SELECT product_name, sales_amount
FROM sales_south;
이 쿼리는 북부와 남부 지점에서 판매된 제품과 판매 금액을 결합하여 반환합니다.
결과 예시:
product_name | sales_amount |
---|---|
Laptop | 1500 |
Phone | 800 |
Tablet | 600 |
7. UNION의 제약 사항
- 열 개수와 데이터 유형 일치: 각 SELECT 쿼리의 열 개수는 동일해야 하며, 대응되는 열의 데이터 유형도 일치해야 합니다.
- 정렬 기준 제한: ORDER BY는 전체 UNION 결과에만 적용되며, 개별 SELECT 쿼리에는 사용할 수 없습니다.
- UNION 성능: UNION은 중복 제거를 위해 추가적인 처리를 수행하기 때문에, UNION ALL보다 성능이 느릴 수 있습니다. 중복된 데이터를 포함해도 된다면 UNION ALL을 사용하는 것이 더 효율적입니다.
8. 실전 예제
예제 1: 2023년과 2024년의 부서별 직원 수 결합
SELECT department, COUNT(*) AS employee_count
FROM employees_2023
GROUP BY department
UNION
SELECT department, COUNT(*) AS employee_count
FROM employees_2024
GROUP BY department;
이 쿼리는 2023년과 2024년의 부서별 직원 수를 결합하여 반환합니다.
예제 2: 2023년과 2024년의 전체 직원 목록 정렬
SELECT name, department
FROM employees_2023
UNION
SELECT name, department
FROM employees_2024
ORDER BY name ASC;
이 쿼리는 2023년과 2024년의 전체 직원 목록을 이름 순으로 정렬하여 반환합니다.
예제 3: 중복을 포함한 여러 연도의 직원 결합
SELECT name, department
FROM employees_2023
UNION ALL
SELECT name, department
FROM employees_2024;
이 쿼리는 중복된 직원을 포함한 2023년과 2024년 직원 목록을 반환합니다.
9. UNION과 JOIN의 차이
- UNION: 여러 SELECT 쿼리의 결과를 수직으로 결합하여 하나의 결과 집합을 만듭니다. 각 쿼리의 결과는 행으로 결합됩니다.
- JOIN: 여러 테이블의 데이터를 특정 조건을 기준으로 수평으로 결합하여 하나의 결과 집합을 만듭니다. 각 테이블의 데이터는 열로 결합됩니다.
10. 요약
- SQL UNION은 여러 SELECT 쿼리의 결과를 결합하여 고유한 행만을 반환합니다.
- UNION ALL은 중복된 행을 포함하여 결합합니다.
- 모든 SELECT 쿼리는 동일한 열 수와 데이터 유형을 가져야 합니다.
- ORDER BY는 전체 UNION 결과에만 적용됩니다.
- WHERE 절과 함께 사용하여 각 SELECT 쿼리에 조건을 설정할 수 있습니다.
SQL UNION 연산자는 여러 데이터 집합을 결합하여 분석하거나 보고서를 작성할 때 유용한 도구로, 다양한 데이터베이스 시스템에서 자주 사용됩니다.