SQL에서 집합연산
이란 두개 이상의 테이블에서 조인을 사용하지 않고 연관된 테이블을 조회하는 연산
을 의미합니다.
데이터베이스에서는 테이블의 행이 요소에 해당합니다. 행은 여러 개의 열로 구성되는 경우도 있으므로 수치 상으로 복수의 값이 존재합니다.
하지만 집합의 요소라는 측면에서 보면 하나의 행이 곧 하나의 요소
가 됩니다.
SELECT 명령을 실행하면 그 결과 몇 개의 행이 반환되는데 이때 반환된 결과 전체를 하나의 집합
이라고 볼 수 있습니다.
UNION은 합집합을 구할 때 사용됩니다.
sample71_a 테이블과 sample71_b 테이블의 합집합을 구하려면 두 개의 SELECT 명령을 UNION을 사용해서 구하면 됩니다.
SELECT * FROM sample71_a UNION SELECT * FROM sample71_b;
두 개의 SELECT 명령을 하나의 명령으로 합치는 만큼, 세미콜론(;)은 맨 나중에 붙여야 합니다.
UNION을 이용하면 여러 개의 SELECT 명령을 하나로 묶을 수 있습니다. 주의할 점은 UNION을 이용할 때 열의 이름은 달라도 열의 개수는 일치해야 합니다. 열 구성이 다른 테이블은 UNION으로 묶을 수 없습니다.
UNION으로 SELECT 명령을 결합해 합집합을 구하는 경우 ORDER BY는 마지막 SELECT 명령에만 지정해야 합니다.
그렇지 않을 에러가 발생합니다.
SELECT a FROM a sample71_a ORDER BY a UNION SELECT b FROM b sample71_b;
SELECT 명령에서 열 이름이 서로 다를 경우 에러가 발생할 수 있습니다. 예를 들어 SELECT a FROM sample71_a UNION SELECT b FROM sample71_b ORDER BY b;
쿼리에서도 에러가 발생합니다. 왜냐하면 해당 합집합은 열 이름이 b가 아닌 a가 되기 때문입니다.
이런 경우 서로 동일하게 별명을 붙인 후 정렬할 수 있습니다.
SELECT a AS c FROM sample71_a UNION SELECT b AS c FROM sample71_b ORDER BY c;
두 집합에서 겹치는 부분은 공통 요소가 됩니다. 두 집합을 합집합 하면 집합에서 공통 요소의 중복은 제거된 상태로 결괏값이 나오는 것을 확인할 수 있습니다.
앞에서 예시로 들었던 테이블 sample71_a와 sample71_b 둘다 2가 포함되어 있지만 UNION을 이용하여 합집합을 구할 경우 2가 하나만 나오는 것을 확인할 수 있습니다.
하지만 중복된 값을 제거하지 않고 모두 반환하고 싶을 경우에는 UNION ALL
을 적용하여 구할 수 있습니다.
SELECT * FROM sample71_a UNION ALL SELECT * FROM sample71_b;
2가 중복이 되었지만 제거되지 않고 모두 반환이 되는 것을 확인할 수 있습니다.
INTERSECT
, 차집합은 EXCEPT(Oralce의 경우 MINUS)
를 사용합니다.