Open-Closed Principle

[MS-SQL] UNION 연산자 본문

Programming/MS-SQL

[MS-SQL] UNION 연산자

대박플머 2016. 2. 16. 09:00

집합 이론에서 두 집합(A와 B라고 가정) 간의 UNION은 A와 B에 있는 모든 요소들을 포함하는 집합니다. 다시 말해, 입력 집합들 중 어디라도 속해있는 요소들은 결과 집합에 속한다는 것이다. 

T-SQL에서 UNION 연산자는 두 입력 쿼리의 결과를 하나로 결합한다. 행이 어떤 집합에 있는지는 상관없이 UNION 연산자의 결과에는 보여지게 된다. T-SQL은 두가지 형태의 UNION 연산자를 지원하는데, UNION ALL과 UNION(암시적으로 DISTINCT 처리)이 이에 해당한다.

UNION ALL 멀티셋 연산자

UNION ALL 멀티넷 연산자는 두 입력 쿼리로부터 만들어지는 입력 멀티넷에 잇는 어떠한 행이라도 모두 결과에 포함시켜서 반환한다. 이때 행을 비교하거나 중복을 제거하는 등의 작업을 수행하지 안는다. Query1이 m개 행을 반환하고 Query2가 n개 행을 반환한다면, Query1 UNION ALL Query2는 m+n개의 행을 반환하게 된다. 


1
2
3
Select '1' AS A
UNION ALL 
Select '1' AS A
cs

위와 같이 UNION ALL 로 쿼리를 하게 되면 아래와 같이 결과가 나온다. 


UNION ALL 연산자는 중복을 제거하지 않기 때문에 결과는 멀티셋이지 집합은 아니다. 즉 위의 쿼리 결과와 같이 동일 행이 이 결과에서 반복적으로 보여질 수 있다. 

UNION distinct 연산자

UNION(암시작으로 DISTINCT 처리) 집합 연산자는 두 쿼리의 결과를 결합한 다음 중복을 제거한다. 하나의 행이 양쪽 입력 잡합에 모두 포함되어 있다면, 연산을 수행한 결과에는 단 한번만 나타나게 된다. 

1
2
3
Select '1' AS A
UNION
Select '1' AS A
cs

위와 같이 UNION 으로 쿼리를 하게 되면 아래와 같이 결과가 나온다. 

UNION은 중복을 제거 하기 때문에 한개의 행만을 출력하는 것을 확인할 수 있다. 



그럼 언제 UNION ALL을 사용하고, 언제 UNION을 사용해야 할까? 연산자의 두 입력 값이 결과합된 후에 중복이 발생할 수 잇으며, 중복을 포함해서 출력해야 하는 경우에는 UNION ALL을 사용해야 한다. 중복이 발생할 수 있는 가능성은 있지만 고유한 행들을 출력하고자 한다면 UNION을 사용해야 한다. 두 입력 값을 결합해도 중복이 존재할 가능성이 없다면, UNION이나 UNION ALL 모두 논리적으로 동일하다. 하지만 이러한 경우에는 UNION ALL을 사용할 것을 권장한다. 왜냐하면 ALL을 제거하게 되면 SQL Server에서는 중복을 검사하는 작업을 수행하기 때문에 추가적인 비용이 발생한다. 




'Programming > MS-SQL' 카테고리의 다른 글

[MS-SQL] Comment 수정  (0) 2022.02.25
[MS-SQL]공통 테이블 식(CTE)  (0) 2016.02.12
[MS-SQL] DELETE JOIN  (0) 2016.02.04
[MS-SQL]데이터 삭제 DELETE vs TRUNCATE  (0) 2016.02.03
[MS-SQL]SELECT INTO 구문  (0) 2016.02.03