SQL Server에서 UNION ALL 연산자는 두 개 이상의 SELECT 문에서 반환된 결과 집합을 하나로 결합할 때 사용합니다.
UNION 연산자와 달리, UNION ALL은 쿼리의 모든 행을 그대로 반환하며 중복된 행을 제거하지 않습니다. 따라서 데이터의 양이 많더라도 중복 제거 작업이 없어 상대적으로 빠른 성능을 보입니다.
단, UNION ALL에 포함되는 각 SELECT 문은 결과 집합의 열 개수가 서로 같아야 하고, 대응되는 열의 데이터 타입도 일치해야 합니다.
UNION ALL 연산자 기본 문법
SELECT bieu_thuc1, bieu_thuc2, ... bieu_thucn
FROM bang
[WHERE dieu_kien]
UNION ALL
SELECT bieu_thuc1, bieu_thuc2, ... bieu_thucn
FROM bang
[WHERE dieu_kien];
매개변수 설명
bieu_thuc1, bieu_thuc2, ... bieu_thucn
조회하고자 하는 열 또는 계산식을 의미합니다.
bang
레코드를 가져올 테이블입니다. FROM 절에는 최소한 하나의 테이블이 반드시 지정되어야 합니다.
WHERE dieu_kien
선택 사항입니다. 조회하려는 레코드가 만족해야 하는 조건을 지정합니다.
사용 시 주의사항
- 두 SELECT 문은 표현식(열)의 개수가 동일해야 합니다.
- 각 SELECT 문에서 대응되는 열은 데이터 타입이 서로 같아야 합니다.
- UNION ALL은 중복된 행을 제거하지 않습니다. 중복 제거가 필요하다면 UNION 연산자를 사용하세요.
- 중복 제거 방식이 궁금하다면 UNION 연산자 관련 문서를 함께 참고하는 것이 좋습니다.
예제 1: 단일 열 반환하기
SELECT sanpham_id
FROM sanpham
UNION ALL
SELECT sanpham_id
FROM hangtonkho;
위 예제는 sanpham 테이블과 hangtonkho 테이블 양쪽에 존재하는 모든 sanpham_id 값을 결과 집합으로 반환합니다. 두 테이블에 동일한 ID가 있더라도 중복 없이 모두 출력됩니다. 만약 중복 행을 제거하고 싶다면 UNION ALL 대신 UNION 연산자를 사용하면 됩니다.
예제 2: ORDER BY 절과 함께 사용하기
UNION ALL 연산자는 ORDER BY 절과 함께 사용하여 쿼리 결과를 정렬할 수 있습니다.
SELECT danhba_id, danhba_ten
FROM danhba
WHERE ten_trang = 'QuanTriMang.com'
UNION ALL
SELECT congty_id, congty_ten
FROM congty
WHERE ten_trang = 'TrangCuaBan.com'
ORDER BY 2;
이 예제에서 주목할 점은 두 SELECT 문의 열 이름이 서로 다르다는 것입니다(danhba_ten과 congty_ten). 이런 경우 열 이름 대신 결과 집합에서의 열 위치를 기준으로 정렬하는 것이 더 간편합니다.
위 쿼리에서 ORDER BY 2는 결과 집합의 두 번째 열, 즉 danhba_ten / congty_ten 열을 기준으로 오름차순 정렬하라는 의미입니다. 이처럼 위치 번호를 활용하면 이름이 다른 여러 열을 한 번에 손쉽게 정렬할 수 있습니다.