SQL : Union - 집합

31강 집합 연산

복수의 테이블을 사용해 데이터를 검색하는 방법

관계형 모델의 관계형은 수학 집합론의 관계형 이론에서 유래하였다. 이는 실질적으로 데이터베이스의 데이터를 집합으로 간주해 다루기 쉽게 하자는 뜻이다.

SQL과 집합

SELECT 명령을 실행하면 데이터베이스에 질의하여 그 결과 몇 개의 행이 반환된다. 이때 반환된 결과 전체를 하나의 집합이라고 보면 된다.

UNION으로 합집합 구하기

SQL에서 A UNION B라고 표현한다. A나 B는 SELECT 명령이다.

SELECT * FROM sampleA
UNION
SELECT * FROM sampleB;

위처럼 두 개의 명령을 하나의 명령으로 합치게 된다. 이는 한 번의 쿼리 실행으로 두 개의 SELECT 명령의 실행결과를 합집합(UNION)으로 계산하여 최종적으로 결과를 반환한다.

UNION으로 두 개의 SELECT 명령을 하나로 연계해 질의 결과를 얻을 수 있다.

주의해야할 점은 UNION은 열 개수와 자료형이 같은 테이블끼리만 묶을 수 있다. 하지만 열 구성이 다른 테이블이라도 데이터를 반환하는 자리에서 UNION을 쓸 수 있도록 조건을 만족하는 데이터로 서로 맞춰주면 UNION으로 실행할 수 있는 쿼리가 된다.

UNION을 사용할 때의 ORDER BY

UNION으로 SELECT 명령을 결합해 합집합을 구하는 경우, 각 SELECT 명령에 ORDER BY를 지정해 정렬할 수 없다. ORDER BY를 지정할 때는 마지막 SELECT 명령에만 지정하도록 한다.

SELECT * AS c FROM sampleA
UNION
SELECT * AS c FROM sampleB ORDER BY c;

UNION으로 SELECT 명령을 연결하는 경우 가장 마지막 SELECT 명령에 대해서만 ORDER BY 구를 지정할 수 있다. ORDER BY 구에 지정하는 열은 별명을 붙여 이름을 일치시킨다.

UNION ALL

UNOIN은 합집합을 구하는 것이므로 두 개의 집합에서 겹치는 부분은 공통 요소가 된다. 즉 UNION으로 명령을 실행했을 땐, 실행 결과에서 DISTINCT를 걸어 중복을 제거한 것과 같다고 보면 된다.

경우에 따라서 중복을 제거하지 않고 2개의 SELECT 명령의 결과를 합쳐야할 때엔 UNION ALL을 사용한다.

반대로 UNOIN DISTINCT라는 문법을 존재하지 않는다.

SELECT * FROM sampleA
UNION ALL
SELECT * FROM sampleB;

교집합과 차집합

SQL을 이용해 교집합, 차집합도 구할 수 있다. 교집합은 INTERSECT를, 차집합은 EXCEPT를 사용한다. (Oracle의 경우 MINUS)