SQL SET 연산자, UNION 과 UNION ALL 차이점, INTERSECT, MINUS

 

1. UNION

A와 B란 데이터 셋이 있을 경우 AUB로 표현되는 집합을 합집합이라고 합니다. 합집합은 A와 B에 포함된 모든 요소(데이터)들을 포함한 집합을 말합니다. 만약 A와 B에 속한 요소들이 아래와 같다고 한다면,

A={1,3,4,5,7,8}

B={2,4,5,8,9}

A와 B 합집합 즉 AUB = {1,2,3,4,5,7,8,9} 가 됩니다. 합집합의 경우 두 데이터 셋에 공통적으로 있는 요소들인 {4,5,8}은 한 번만 포함합니다. SQL에서 이러한 합집합 역할을 수행하는 것이 바로 UNION 연산자입니다.

 

그럼 위의 내용을 SQL 로 작성해 보겠습니다.

A=> SELECT 1,3,4,5,7,8

         FROM DUAL;

B=> SELECT 2,4,5,8,9

        FROM DUAL;

 

이제 SET 연산자인 UNION을 사용하여 이 두 문장을 연결해 볼 건데요, 

SELECT 1,3,4,5,7,8

 FROM DUAL

UNION

SELECT 2,4,5,8,9, NULL

 FROM DUAL;

 

NULL이 보이시나요? SET 연산자를 사용할 경우에는 SET 연산자로 묶이는 SELECT 문장의 열 갯수가 반드시 같아야 합니다.

 

출력결과는 2줄이 발생합니다. 

1 3 4 5 7 8

2 4 5 8 9

 

이러한 차이가 나는 원인은 수학의 집합론의 경우 그 대상이 개별 요소인 1,2,3 이지만 SQL 경우에는 단위가 개별로우가 됩니다. 

 

다른 예시를 들어보겠습니다.

SELECT 1,2,3,4

  FROM 테이블A

UNION

SELECT 1,2,3,4

  FROM 테이블B

 

결과는 어떨까요? 1 2 3 4 

1줄이 나옵니다.

오라클은 내부적으로 이 데이터를 다르게 인식해서 2번을 조회하겠지만 DISTINCT 역할을 수행하므로 1,2,3,4 의 데이터가 동일하므로 1줄이 발생한 것입니다. 

 

2. UION ALL

UNION ALL은 UNION과 거의 같은 개념이지만 한 가지 다른 점이 있습니다. 앞서 UNION은 DISTINCT 역할을 수행한다고 했는데 UNION ALL은 DISTINCT 역할을 수행하지 않고 모든 로우를 추출한다고 이해하시면 됩니다.

작성법은 아래와 같습니다.

SELECT 1,3,4,5

  FROM DUAL

UNION ALL

SELECT 2,3,5,6

  FROM DUAL;

 

3. INTERSECT

INTERSECT는 교차한다 는 뜻이 있는데요, 집합론에서는 교집합에 해당됩니다. INTERSECT 역시 SET연산자에 속하므로 컬럼의 데이터타입, 순서, 개수가 일치해야 합니다.

 

4. MINUS

MINUS 연산자는 집합론에서 차집합과 같습니다. A와 B집합에 있어서 A의 차집합은 A에만 속해 있는 원소들을 말하고, B 차집합은 B에 속한 원소들로만 구성된 집합을 말합니다. 차집합의 경우는 어느 집합이 먼저 오는지에 따라 그 결과에 차이가 있습니다. MINUS 연산자도 마찬가지로, MINUS 중심으로 A테이블에 대한 SELECT 문장이 먼저 왔다면 A의 차집합이고, B테이블이 SELECT문장으로 먼저 나왔다면 B의 차집합이 됩니다.

 

반응형