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의 차집합이 됩니다.