지극히 개인적인 공부 노트/데이터베이스(Database)

[SQL] 일반 집합 연산(feat. UNION, INTERSECT, EXCEPT)

AS J 2021. 9. 25. 23:51

SQL에서 일반 집합 연산이란, 두 개 이상의 테이블에서 조인을 사용하지 않고, 연관된 데이터를 조회하는 연산이다. 이 글에서는 합집합(UNION), 교집합(INTERSECT), 차집합(EXCEPT)에 대해 정리했다.

단, 일반 집합 연산은 테이블에서 SELECT한 컬럼의 수와 각 컬럼의 데이터 타입이 테이블 간 상호 호환 가능해야 한다.

 

합집합, UNION

UNION은 두 개의 테이블을 하나로 만드는 연산이다. 사용할 컬럼의 수와 데이터 형식이 일치해야 하며, 합친 후에 테이블에서 '중복되는 데이터는 제거'한다. 중복 제거를 위해 UNION은 테이블을 합칠 때, 정렬 과정을 발생시키는데, 올바른 정렬을 위해서는 ORDER BY 구문을 추가로 사용해주는 것이 좋다. 사용 예시는 아래와 같다.

SELECT * FROM (테이블1)
UNION
SELECT * FROM (테이블2);

UNION과 비슷한 연산 명령어로 UNION ALL이 있는데, UNION과 거의 같은 기능을 수행하지만 UNION과 달리 중복 제거와 정렬은 수행하지 않는다. 사용 예시는 UNION과 같다.

SELECT * FROM (테이블1)
UNION ALL
SELECT * FROM (테이블2);

 

교집합, INTERSECT

두 개의 테이블에 대해 겹치는 부분을 추출하는 연산이다. 추출 후 중복된 결과를 제거하여 보여준다. 사용 예시는 아래와 같다.

단, INTERSECT 명령어는 Oracle DB, Maria DB에서는 지원되지만, MySQL에서는 지원되지 않는데, 이런 경우에는 JOIN을 통해 구현해야 한다.

-- 선택한 컬럼에 대해서만 교집합 연산 진행
SELECT COL1, COL2 FROM A
INTERSECT
SELECT COL1, COL2 FROM B

 

차집합, EXCEPT

두 개의 테이블에서 겹치는 부분을 앞의 테이블에서 제외하여 추출하는 연산이다. 추출 후 중복된 결과를 제거하여 보여준다.

단, 차집합은 Oracle DB에서는 MINUS라는 키워드로 지원되고, Maria DB에서는 10.3 version부터 EXCEPT라는 키워드로 지원된다. MySQL에서는 지원되지 않기 때문에 JOIN으로 구현해야 한다.

-- 선택한 컬럼에 대해서만 차집합 연산 진행
-- A와 B의 COL1, COL2 값이 모두 같은 경우에만 차집합 진행
SELECT COL1, COL2 FROM A
EXCEPT  -- Oracle에서는 MINUS
SELECT COL1, COL2 FROM B

 

위에서 교집합과 차집합은 사용하는 DB의 종류나 버전에 따라 지원되지 않기도 한다. 대신 대부분 JOIN을 통해 구현할 수 있는데, 이는 다시 말하면 굳이 별도의 연산이 아니라 JOIN을 통해서 대부분의 연산을 수행할 수 있다는 의미이기도 하다. 단, 상황에 따라 알맞은 조건과 JOIN으로 사용할 줄 알아야 한다.