본문 바로가기
DBMS/ORACLE

[ORACLE] 오라클_집합연산자( UNION, UNION ALL : 합집합 )

by 썸머워즈 2019. 2. 26.
반응형

UNION

  • 두 개 이상의 테이블의 결합을 나타낸다.
  • 합집합 이라고도 한다.
  • 특이사항은 테이블의 중복을 제거하고 정렬되어 출력된다는 점이다.
  • 중복을 제거하고 정렬하기 때문에 정렬되지 않은 많은 데이터가 있을 경우 성능이 느려진다.

UNION 기본 사용법

SELECT oracleNo, FROM oracleStudy
 UNION
SELECT oracleNo FROM grade;

* 결과값

 oracleNo
 1
 2
 3
 4

물론 두 개 이상의 테이블도 UNION이 가능하다.

SELECT oracleNo, name FROM oracleStudy
 UNION
SELECT oracleNo, firstName FROM grade
 UNION
SELECT oracleNo, lastName FROM oracleTest;

* 결과값

oracleNo  name 
 1  GANGMINHUK
 1 MINHUK
 1 GANG
 2 GANGMINHUK
 2 MINHUK
 2 GANG

뭔가 결과가 이상하지 않은가?

 

중복을 분명 제거한다고 했는데, 중복이 제거되지 않은 결과를 볼 수 있다.

그 이유는 컬럼이 두 개 이상이면 개수만큼의 컬럼을 "한 묶음"으로 보고 그 묶음과 동일한 것만 중복제거하기 때문이다.

 

또 다른 이상한 점은 컬럼명이 name으로 출력된다는 건데,

이는 그 뒤에 firstName과 lastName을 select같이 했지만 첫 번째로 명시된 컬럼명을 따라가기 때문이다.


UNION ALL

  • 두 개 이상의 데이블의 결합을 나타낸다.
  • 특이사항으로는 테이블의 중복을 허용하여 모두 출력한다.

UNION ALL 기본 사용법

SELECT oracleNo FROM oracleStudy
 UNION ALL
SELECT oracleNo FROM grade;

* 결과값

oracleNo 
 1
 2
 3
 1
 4

이처럼 UNION과 다르게 정렬도 안되어 있고, 중복조차 허용하여 전부 출력한다.

* 정렬을 할 시 주의할 점은 마지막으로 명시한 select문 다음에 order by를 실시해야 한다는 점이다.

UNION과 UNION ALL 사용 시 주의사항

  1. 컬럼의 타입과 순서 그리고 컬럼의 개수가 동일해야 한다. (첫 번째 컬럼끼리 합치고 두 번째 컬럼끼리 합치는 것이다.)
    - 여기서 컬럼명도 무조건 같아야 한다는 사람도 있지만 일단 같지 않아도 출력은 된다. 단지 첫 번째 명시한 컬럼명으로 통일된다.
    - 그래서 가독성을 위해 Alias 별칭을 사용하여 통일시켜주는 게 좋다.
    - 컬럼의 타입은 단순하게 문자, 숫자 이런게 아니라 NVARCHAR2랑 VARCHAR2 이것 역시 에러가 발생한다.
    - 정확히 컬럼의 타입이 같아야 한다. CHAR는 CHAR끼리 NVARCHAR2는 NVARCHAR2 끼리
  2. 합집합에 대해 정렬을 시킬 경우 맨 마지막에 명시된 SELECT문에서 ORDER BY 정렬을 실시해야 한다.
    - ORDER BY 시 주의할 점이 첫 번째로 명시된 SELECT 문의 컬러명 혹은 ALIAS로 작성해야 한다는 점이다.
반응형


댓글

TOP