본문 바로가기
2.2 DB/ORACLE

[oracle] Union / Union ALL

by Dohi._. 2024. 9. 30.
728x90

UNION은 '합집합, 조합'이라는 뜻으로 정말 합집합 함수이다.
즉, 2개 이상의 데이터를 합쳐서 보여주고 싶을 때 주로 사용되는 함수입니다.

 

예를 들어 A, B라는 조회데이터 집합이 있고 UNION을 사용하면
A∪B와 같은 합집합이 일어난다

 

예시를 또 하나 들면

동일한의 데이터가 있는 2개의 조회데이터(A,B)와

다른 데이터가 있는 1개의 조회데이터(C)를 Union을 한다면

A∪B∪C와 동일한 결과가 나타난다.

아래는 실제 실행 결과물이다.

 

 

UNION 구문은 2가지로 나뉜다.

  1. UNION [DISTINCT] : 중복값 제외하여 출력 (A∪B) ※DISTINCT는 안적어도 된다.
  2. UNION ALL : 중복 상관없이 출력 (A+B = A∪B + A∩B)

결과값의 차이는 중복값처리이다.
실제로 합집합은 중복값이 처리가 되기 때문에 DISTINCT 를 붙이지 않아고 UNION으로 입력해도 된다.

 

위에서 예시로 들었던 결과를 UNION ALL로 한다면?

정말 중복값 처리가 되지 않고 나타나게 된다.

중복값 처리가 없기 때문에

UNION보다 UNION ALL는 더하기만 하면 되기에 성능 또한 더 좋다.

 

성능이 더좋은 이유를 간단하게 풀어 이야기하면

Union은 결과 집합에서 중복된 행을 제거하기 위해 추가적인 작업이 필요하게 됩니다.

이 과정에서 차이가 나게 되는데

1. 중복을 확인하고 삭제하기 위해서 인덱스를 사용하여 실제 데이터를 찾아야합니다.

  • 인덱스 스캔: 먼저, 인덱스를 사용하여 조건에 맞는 행의 ROWID를 찾습니다. 
  • 테이블 접근: 그런 다음, 찾은 ROWID를 사용하여 실제 테이블에서 데이터를 가져옵니다 
  • 결론적으로 불필요한 테이블 접근 필요

 

2. 중복 제거를 위해  정렬을 통해 삭제하기도 합니다.

  • 정렬 : 결과를 정렬한 후 같은 값은 연속적으로 배치하게 되므로 중복 제거 

3. 중복 제거를 위해 해시 함수를 이용해서 제거하기도 합니다.

  • 해시 함수 : 각 행의 값을 해시함수에 통과 후 비교하여 중복 식별 (큰 데이터셋에서 이용)

 

아무튼 추가적인 리소스를 사용하는 것은 맞기 때문에 성능 차이가 나게 됩니다.

UNION ALL은 그냥 단순히 결과만 연결(concatenate)만 하여 반환하면 되기 때문입니다.

 

 

마지막으로 추가적인 사용법만 간단하게 정리하고 끝내도록 합니다

 

1. 합치는 데이터들은 컬럼의 수와 컬럼의 데이터 타입이 동일해야한다.

 

SELECT  TRUNC(sysdate) AS 날짜
      , '1' AS 대박
 FROM DUAL
UNION ALL
SELECT  TRUNC(sysdate) AS ad
      , '123'
 FROM DUAL
 UNION ALL
SELECT  TRUNC(sysdate)+1 AS asd
      , '1'
  FROM DUAL

2개의 컬럼 이있고 날짜 타입 , 문자 타입이 있습니다 

돌려보면 정상적으로 합쳐집니다.

 

한번 진짜 안되나 확인 해봅시다!

-- 1. 컬럼이 안맞는 경우
SELECT  TRUNC(sysdate) AS 날짜
      , '1' AS 대박
 FROM DUAL
UNION ALL
SELECT  TRUNC(sysdate) AS ad
      , '123'
      ,  '123'
 FROM DUAL
 UNION ALL
SELECT  TRUNC(sysdate)+1 AS asd
      , '1'
  FROM DUAL


-- 2. 데이터 타입을 틀리게 적은경우
SELECT  TRUNC(sysdate) AS 날짜
      , '1' AS 대박
 FROM DUAL
UNION ALL
SELECT  TRUNC(sysdate) AS ad
      , 123   AS 타입이 틀려요
 FROM DUAL
 UNION ALL
SELECT  TRUNC(sysdate)+1 AS asd
      , '1'
  FROM DUAL

실행하면 각각 이렇게 두개의 에러메세지가 나타나게 된다.

 

 

마지막으로  2. 별칭은 맨위에서 지정하면 아래에서는 생략 해도 된다.

별칭은 맨위의 규칙으로 나타납니다.

실제로 방금 돌려본 결과물을 보면 날짜컬럼부분의 아래 에서는 이상한 ad, asd와 같은 별칭을 달았지만

실제로 나온 결과는 날짜였고

대박컬럼의 경우에는 아래에서 아무 별칭을 달지 않았지만 대박으로 나타나게 됩니다

 

따라서 UNION으로 생성된 데이터를 Order by, where로 할때는 순수하게 별칭과, 컬럼순서로만 해야한다 :) 

 


결론 .

UNION은  DISTINCT과 ALL로 나눠진다.

차이는 중복값 처리이다.

ALL이 성능이 더좋다.

 

사용할때 컬럼 수와 데이터타입을 맞춰야한다.

별칭은 맨위에 지정한 것만 되며 해당 컬럼을 찾을때는 컬럼순서와 별칭로 찾아야한다.

728x90

댓글