본문 바로가기
dev/DB

[DB/Oracle] union, union all, minus, intersect

by dev_Step 2022. 2. 15.

집합 연산자 

 

SQL문의 집합간의 비교를 하기 위해서는 연산자로 연결된 SELECT문의 결과 SET이 같은 구조를 가져야 한다.

따라서 집합 연산자로 연결된 SELECT문들은 컬럼의 수와, 데이터 형이 순서대로 일치해야 된다.

 

UNION : 합집합(중복자료 배제)

UNION ALL : 합집합(중복자료 포함)

MINUS : 차집합

INTERSECT : 교집합

 

4개의 집합 연산자 중에 sort가 발생하지 않는것은 UNION ALL뿐이다.

UNION 연산자는 두 DATASET의 합집합을 보여주며, 중복된 ROW가 있으면 그 중 하나의 ROW만을 포함 시킨다.

이러한 작업을 하기 위해 내부적으로 정렬 작업을 한다.

UNION ALL 연산자는 DATASET의 합집합을 보여주며 중복된 ROW가 있더라도 결과를 모두 보여준다.

대신 정렬이 발생하지 않으므로 UNION보다 빠른 응답을 보여준다.

 

 

첫번째 데이터 타입과, 두번째 데이터 타입이 달라서 오류가 발생한다.

 

첫번째 컬럼수와 두번째 컬럼수가 달라 오류가 발생했다.

// UNION을 이용하여 TEMP와 TCOM의 자료중 EMP_ID, SALARY, COMM을 보여주는 SQL을 만들어라

이때 SALARY, COMM이 모두 존재하는 사번은 두줄로 나와야 한다,

출처 : https://m.blog.daum.net/why_i_am/13?category=2113847

 

SALARY와 COMM을 모두 나타내주기 위해서 TEMP에서는 0 COMM을

TCOM 에서는 0 SALARY를 하여 없는값은 0으로 나타나게 해주었다.

 

중복을 배제한 합집합을 보여주기 떄문에 결과 20개
중복된 값을 나타내주기 떄문에 총 결과28개 발생

UNION ALL 을 사용한 SQL문은 정렬이 발생하지 않았기 때문에 ORDER BY 를 통해서 정렬이 필요하다. 두 SELECT문의 실제 컬럼명이 같으면 컬러명을 통해서 정렬하면되지만 대개 다르므로 순서를 이용하는게 좋다.

정렬시 ORDER BY 1 의 경우는  테이블의 컬럼순서 번호이다.

여기서 1을 EMP_ID로 정렬을 한다는 의미이다.

1 = EMP_ID

INTERSECT : 교집합을 구해준다.

MINUS : 두 결과간의 차집합을 구해준다.(첫번째 쓰는 쿼리문에서 두번째 쓰는 쿼리문을 제외한다)

(A MINUS B)  = (A - B)

 

 

 

 

'dev > DB' 카테고리의 다른 글

[DB/Oracle] SQL 모음  (0) 2022.04.28
[DB/Oracle] ORACLE 개념  (0) 2022.02.22
[DB/Oracle] SUB QUERY  (0) 2022.02.22
[DB/Oracle] JOIN  (0) 2022.02.19
[DB/Oracle] sqlplus 한글깨짐 조치 및 system 계정 PWD분실시  (0) 2022.01.13