CS - 강의, 서적/[SQLD] 홍쌤의 데이터랩

[SQLD] 2-10. 집합 연산자 (UNION, UNION ALL, INTERSECT, MINUS)

SH3542 2024. 9. 18. 21:41

[홍쌤의 데이터랩, SQLD n과목 완벽 정리] 영상를 개인이 정리하여 [원작자의 허가 이후] 올린 글이며,

[개인이 추가로 정리한 내용]이 포함되어 있습니다.

 

 

 
 

홍쌤의 데이터랩

[개정판] SQLD n과목 완벽 정리

https://www.youtube.com/watch?v=rdfHFnqVoRw

 

 


 

 

목차

 

    집합 연산자

    - SELECT문 결과를 하나의 집합으로 간주, 그 집합에 대한 합집합, 교집합, 차집합 연산

    - SELECT문과 SELECT문 사이에 집합 연산자 정의

    - 개별 쿼리에 ORDER BY 불가, GROUP BY 가능

    - 전체 집합의 데이터 타입과 컬럼명은 첫번째 집합을 따름

    - 대상 테이블이 같아도 조건을 상이하게 해서 활용 가능

     

    - 테이블의 실질적 통합이 아닌, 가상 테이블을 구성

    => 사용되는 집합의 컬럼 타입, 순서가 동일해야 함

    => 컬럼명, 사이즈, 제약조건 동일할 필요 없음

    => 자동 형변환 수행, 형변환 함수를 통한 명시적 변환 권장

     

    JOIN과의 차이

    e.g. UNION vs JOIN

    UNION - 공통 컬럼기반 행 추가 (수직적 결합)

    JOIN - 매개체(공통 컬럼)기반 행/열/행렬 추가 (수평적 결합)

     

    1. 합집합 (UNION, UNION ALL)

    - 두 집합의 총 합(전체) 출력

    => UNION은 데이터 중복 제거 후 반환 (DISTINCT)

    => UNION ALL은 데이터 전체 반환

     

    - 중복제거를 위한 정렬을 내부적으로 수행

    => 중복된 데이터가 없음이 확실한 경우 반환은 같으나, UNION ALL이 성능상 유리

     

    2. 교집합 (INTERSECT)

    - 두 집합 사이의 공통 행(= 교집합) 반환

     

    3. 차집합 (MINUS)

    - 두 집합 사이에의 공통이 아닌 행(= 차집합) 반환

    - A-B와 B-A의 반환 순서 다름에 유의

     

    통합 예제

    1) UNION - 10번 부서가 아닌 직원과 20번 부서인 직원의 합집합

    SELECT ...

    FROM A

    WHERE DEPTNO != 10

    UNION

    SELECT ... -- 상위 집합과 컬럼 타입, 순서가 동일 / 컬럼명, 사이즈, 제약조건 동일할 필요 없음

    FROM A

    WHERE DEPTNO = 20; -- 같은 테이블을 대상으로 조건을 달리하여 활용

     

    2) 개별 쿼리에 ORDER BY 불가

    SELECT ...

    FROM A

    WEHERE ...

    ORDER BY ID -- 개별 쿼리에 ORDER BY 불가

    UNION ALL

    SELECT ...

    FROM A

    WHERE ...

    ORDER BY ID -- 최종 쿼리ORDER BY 가능

     

    3) 개별 쿼리에 GROUP BY 가능 (단, 컬럼 타입, 순서가 동일해야 함)

    SELECT ...

    FROM A

    WEHERE ...

    GROUP BY ID

    INTERSECT

    SELECT ...

    FROM A

    WHERE ...

    GROUP BY ID

     

    4) 상이한 테이블에 집합 연산자 적용 가능 (단, 컬럼 타입, 순서가 동일해야 함)

    SELECT a1, a2

    FROM A

    WEHERE ...

    GROUP BY ID

    MINUS

    SELECT b1, b2 -- a1, a2와 컬럼 타입, 순서가 동일해야 함

    FROM B

    WHERE ...

    GROUP BY ID