ABOUT ME

Today
Yesterday
Total
  • [데이터베이스] 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 도 차집합의 원소로 포함되는 것을 알 수 있다.

    반응형

    댓글

Designed by Tistory.