본문 바로가기

Kitri_NCS3기 보안과정/DB보안

170531 SET 연산자 활용

SET연산자는 SELECT의 결과 레코드를 처리하는 연산자입니다. 두 의 SELECT문 사이에서 각각의 결과 레코트를 조합해서 보여주는 역할을 합니다. UNION , UNION ALL, INTESECT, MINUS방식이 있는데 먼저 두개의 테이블을 정렬하면서 중복을 제거한 후 나열하는 UNION방식을 살펴보겠습니다.


 SET 연산자

처리 방법 

UNION 

두개의 레코드 집합을 합쳐 정렬한 후 중복된 레코드를 제거

UNION ALL 

두개의 레코드 집합을 합쳐 그대로 표시 ( 중복제거 x ) 

INTERSECT 

 두개의 레코드 집합중 겹치는 내용 표시 (교집합 개념)

MINUS 

하나의 레코드 집합에서 다른 하나의 레코드집합을 제거, 첫번째 레코드에만! 있는 내용을 출력함. (차집합 개념)


SET 연산자의 사용 위치 

SELECT 컬럼 

FROM 테이블1 


SET 연산자 ← SELECT 문 사이에 사용 


SELECT 컬럼 

FROM 테이블2 



연산자를 살펴보기 위해 두 테이블의 결과 레코드를 살펴 보겠습니다. 

 hr.employees table

 hr.job_history table 

 


 










두 테이블의 결과 레코드를 SET 연산자를 사용해서 조합을 해보겠습니다.

※ SET 연산자 사용 팁 


 - SET 연산자의 대상이 되는 SELECT 문장들에서 각 문장들에 명시된 컬럼의 개수와 위치에 따른 데이터유형이 모두 일치해야 한다.

 - 표시된 결과 상의 해딩(HEADING)은 항상 첫 번째 SELECT-문장에 기술된 헤딩이 사용됩니다.

   따라서, 컬럼-별칭을 정의하여 헤딩을 변경하려면, 첫 번째 SELECT-문장에 컬럼-별칭을 기술해야 합니다.

 - 3 개 이상의 SELECT-문들을 여러 개의 SET-연산자를 이용하여 처리할 때, 위에서부터 아래로 처리되면서 순서대로 처리됩니다. 

   이러한 기본 처리 순서는 괄호()를 이용하여 변경할 수 있습니다.



위에서부터 아래로 처리


A SELECT


SET 연산자 ① 


B SELECT 


SET 연산자


C SELECT

괄호()를 이용하여 변경


A SELECT


SET 연산자 ② 


(B SELECT 


SET 연산자


C SELECT)


 - ORDER BY 절은 언제나 전체 문장의 가장 마지막에 기술해 주어야 한다.


※ 두 SELECT 문의 컬럼개수와 데이터 유형이 일치하지않을경우.


TO_CHAR(NULL), TO_NUMBER(NULL), TO_DATE(NULL)을 이용하거나 NULL 을 이용하거나 데이터 유형에따른 적절한상수를 대신채워준다



UNION


두 개의 SELECT문장을 사용하는데 UNION은 첫 번째 SELECT문장을 처리하여 결과레코드 집합을 구하고 , 두번째 SELECT 문장을 처리해서 결과레코드 집합을 구한뒤 이 결과 레코드집합을 하나로 합치는 과정을 거쳐서 두개의 SELECT문의 결과를 하나의 집합으로 만들게 됩니다. UNION의 특징은 이렇게 하나로 만든 결과레코드 집합을 정렬한 후 중복되는 내용을 제거해주게 됩니니다. ORDER BY + DISTINCT처럼 되겠네요.


두개의 SELECT 문장을 하나 하나 살펴 본 후 UNION을 사용해서 결과를 확인해보겠습니다. 

먼저 처음 select문입니다. 사번과 직책이 select문으로 뽑혀 나왔습니다. 다음 select 문 역시 사번과 직책이 있겟죠 ?

두개의 select문을 확인해 보니 17개의 행이면서 중복되는 내용이 보입니다. UNION을 사용한 결과를 확인해 봅시다. 


결과 레코드를 살펴보면 중복된 내용이 한번씩만 처리되서 나온걸 확인 할 수 있습니다. UNION이 중복내용을 알아서 처리해준다는걸 확인했네요.

UNION은 이런 중복을 처리하는 특성때문에 정렬을 실행하고 중복값을 검사하는데요. 뒤에 나올 UNION ALL은 중복을 처리하지 않고 정렬도 수행하지 않는다는 차이점을 보여줍니다. UNION은 이런 중복처리과정에서 메모리를 소모하기 때문에 자원활용면에서는 좋지않다고 하네요.



UNION ALL


두 개의 SELECT문장을 사용하는데 UNION은 첫 번째 SELECT문장을 처리하여 결과레코드 집합을 구하고 , 두번째 SELECT 문장을 처리해서 결과레코드 집합을 구한뒤 이 결과 레코드집합을 하나로 합치는 과정을 거쳐서 두개의 SELECT문의 결과를 하나의 집합으로 만들게 됩니다. UNION과는 다르게 중복을 처리하지않습니다. 중복을 처리하지 않기때문에 정렬 과정도 거치치않게 됩니다. 



아까와 똑같은 SELECT문에서 SET 연산자를 바꿔봤습니다.



   정렬되지않고 중복이 그대로 나오는 결과를 확인 할 수 있엇습니다. 



INTERSECT 


SELECT 문장을 처리할때 첫번째 필드를 기준으로 정렬 시키면서 결과 레코드를 구하고 각 정렬된 결과레코드 집합으로부터 공통된 결과만 출력됩니다. 


MINUS 


SELECT 문장을 처리할때 첫번째 필드를 기준으로 정렬 시키면서 결과 레코드를 구하고 첫번째SELECT 결과레코드 집합으로부터 SELECT2의 결과레코드 집합을 뺍니다. SELECT1에만 있는 결과레코드들이 표시되겟죠