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
)