SQL
UNION / UNION ALL
수색…
소개
통사론
- SELECT column_1 [, column_2] FROM table_1 [, table_2] [WHERE 조건]
UNION | UNION ALL
SELECT column_1 [, column_2] FROM table_1 [, table_2] [WHERE 조건]
비고
UNION
및 UNION ALL
절은 두 개 이상의 동일하게 구성된 SELECT 문의 결과 세트를 단일 결과 / 테이블로 결합합니다.
UNION
/ UNION ALL
이 작동하려면 각 쿼리의 열 개수와 열 형식이 일치해야합니다.
UNION
과 UNION ALL
쿼리의 차이점은 UNION
절이 UNION ALL
이없는 결과에서 중복 행을 제거한다는 것입니다.
이와 같이 명확한 레코드 제거는 심지어 최적화 된 쿼리를 위해 항상 UNION ALL
을 기본값으로 두거나 상관하지 않을 것을 알게되면 제거 할 고유 한 행이 없더라도 쿼리를 상당히 느려질 수 있습니다.
기본 UNION ALL 쿼리
CREATE TABLE HR_EMPLOYEES
(
PersonID int,
LastName VARCHAR(30),
FirstName VARCHAR(30),
Position VARCHAR(30)
);
CREATE TABLE FINANCE_EMPLOYEES
(
PersonID INT,
LastName VARCHAR(30),
FirstName VARCHAR(30),
Position VARCHAR(30)
);
우리 부서에서 모든 managers
의 이름을 추출하려고한다고 가정 해 봅시다.
사용 UNION
우리가 보유 두 인사 및 재무 부서의 모든 직원 얻을 수있는 position
(A)의 manager
SELECT
FirstName, LastName
FROM
HR_EMPLOYEES
WHERE
Position = 'manager'
UNION ALL
SELECT
FirstName, LastName
FROM
FINANCE_EMPLOYEES
WHERE
Position = 'manager'
UNION
문은 쿼리 결과에서 중복 행을 제거합니다. 두 부서 모두에서 동일한 이름과 지위를 가진 사람들을 가질 수 있으므로 중복을 제거하지 않기 위해 UNION ALL
사용하고 있습니다.
각 출력 열에 별칭을 사용하려면 다음과 같이 첫 번째 select 문에 별칭을 추가하면됩니다.
SELECT
FirstName as 'First Name', LastName as 'Last Name'
FROM
HR_EMPLOYEES
WHERE
Position = 'manager'
UNION ALL
SELECT
FirstName, LastName
FROM
FINANCE_EMPLOYEES
WHERE
Position = 'manager'
간단한 설명과 예제
간단한 용어로 :
- 결과 집합에서 중복을 제거하는 동안
UNION
2 개의 결과 집합을 조인합니다. -
UNION ALL
중복을 제거하지 않고 2 개의 결과 세트를 결합합니다.
많은 사람들이 실수를 저지르는 한 가지 실수는 중복을 제거 할 필요가 없을 때
UNION
을 사용하는 것입니다. 대규모 결과 집합에 대한 추가 성능 비용은 매우 중요 할 수 있습니다.
UNION
이 필요한 경우
두 가지 다른 특성에 대해 테이블을 필터링해야하고 각 열에 대해 개별 클러스터되지 않은 인덱스를 작성했다고 가정합니다. UNION
사용하면 중복을 방지하면서 두 인덱스를 모두 활용할 수 있습니다.
SELECT C1, C2, C3 FROM Table1 WHERE C1 = @Param1
UNION
SELECT C1, C2, C3 FROM Table1 WHERE C2 = @Param2
이렇게하면 쿼리를 최적으로 수행하는 데 간단한 인덱스 만 있으면되기 때문에 성능 튜닝이 간단 해집니다. 클러스터되지 않은 인덱스가 상당히 적어서 원본 테이블에 대한 전체 쓰기 성능이 향상 될 수도 있습니다.
UNION ALL
이 필요한 경우
두 속성에 대해 테이블을 필터링해야하지만 중복 레코드를 필터링 할 필요가 없다고 가정하십시오 (데이터 모델 설계로 인해 데이터가 중복되지 않거나 데이터가 중복을 생성하지 않기 때문에).
SELECT C1 FROM Table1
UNION ALL
SELECT C1 FROM Table2
이것은 여러 테이블에 물리적으로 분할되도록 설계된 데이터를 결합하는 뷰를 생성 할 때 (성능상의 이유로, 레코드를 롤업하려는 경우) 특히 유용합니다. 데이터가 이미 분할되었으므로 데이터베이스 엔진에서 중복 제거를 수행하면 값이 추가되지 않고 쿼리에 추가 처리 시간이 추가됩니다.