-
[데이터베이스] SQL 집합 연산자 (intersect, union, except)데이터베이스와 SQL 2023. 1. 23. 18:06
집합 연산자는 두 개 이상의 테이블에서 조인을 사용하지 않고, 연관된 데이터를 조회하는 방법 중 하나이다.
SELECT 절의 칼럼 수가 동일하고, 동일 위치에 존재하는 칼럼의 데이터 타입이 상호 호환이 가능해야 한다.
INTERSECT
여러 개의 테이블에 대한 교집합이다. (AND)
INNER JOIN은 중복된 값을 모두 추출하지만 기본적으로 intersect는 중복 값을 하나의 행으로 만든다.
UNION
여러 개의 테이블에 대한 합집합으로, 중복된 행은 역시 하나로 만든다.
n(A ∪ B) = n(A) + n(B) - n(A ∩ B)
UNION ALL
여러 개의 테이블에 대한 합집합이지만, 중복된 행은 전부 결과로 추출한다.
중복 값이 없다면 UNION과 동일한 결과를 보여주지만, 결과의 정렬 순서는 차이가 있을 수 있다.
일반적으로 쿼리 결과가 exclusive 할 때 사용한다.
Difference (EXCEPT)
차집합으로 중복된 행은 하나의 행으로 만든다.
(A - B) = A - (A ∩ B) = (A ∪ B) - B
집합 연산자 예제
-- 데이터 준비 IF OBJECT_ID('LeftInput', 'U') IS NOT NULL DROP TABLE dbo.LeftInput; IF OBJECT_ID('RightInput', 'U') IS NOT NULL DROP TABLE dbo.RightInput; SELECT * INTO dbo.LeftInput FROM (VALUES (1), (2), (2), (NULL)) AS dt(value); SELECT * INTO dbo.RightInput FROM (VALUES (2), (2), (3), (4), (NULL), (NULL)) AS dt(value);
-- 교집합 SELECT ID = Value FROM dbo.LeftInput INTERSECT SELECT Value FROM dbo.RightInput;
먼저 교집합의 결과를 확인하면, 중복 처리가 되어 NULL과 2 각각 하나 만을 결과로 보여준다.
-- UNION과 UNION ALL의 차이 SELECT Value FROM dbo.LeftInput UNION SELECT Value FROM dbo.RightInput ; SELECT Value FROM dbo.LeftInput UNION ALL SELECT Value FROM dbo.RightInput ;
UNION의 경우 중복 원소는 하나로 처리하지만, UNION ALL은 LeftInput, RightInput 테이블의 값 전부를 그대로 보여준다.
-- 차집합 -- A - B SELECT Value FROM dbo.LeftInput EXCEPT SELECT Value FROM dbo.RightInput -- B - A SELECT Value FROM dbo.RightInput EXCEPT SELECT Value FROM dbo.LeftInput
A - B 의 결과는 1, B - A 의 결과는 3, 4가 출력이 되며, NULL 도 차집합의 원소로 포함되는 것을 알 수 있다.
반응형'데이터베이스와 SQL' 카테고리의 다른 글
[데이터베이스] SQL 서브 쿼리의 유형 ( IN, NOT IN, EXISTS ) (0) 2023.01.29 [데이터베이스] MSSQL 조인 방법, inner join과 outer join 차이 (0) 2023.01.23 동적 SQL, EXEC() 와 sp_executesql (0) 2023.01.07 [데이터 베이스] MSSQL 임시테이블과 테이블 변수 (0) 2023.01.07 [데이터 베이스] MSSQL SEQUENCE (시퀀스) 개체 생성 및 사용 (1) 2022.12.17