ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL - SET
    SQL 2022. 12. 10. 16:01

    *집합(Set)

    union : 중복을 제외한 합집합 -> 중복 확인을 위해 전체 검색 후 정렬하여 수행하기 때문에 성능이 좋지 않다.

    union all : 중복을 허용한 합집합

    intersect : 교집합

    not in : 차집합 (in과 반대로 ~에 해당하지 않은 값들) -> mariaDB에서는 MINUS가 없기 때문에 NOT IN을 사용한다.

    서브쿼리를 사용하여 연속된 집합연산 또한 가능하다.

     

    *full outer join

    mariaDB에서는 union을 통해 구현할 수 있다.

    left join 연산 결과와 right join 연산 결과를 union 하면 같은 결과가 나온다.

     

    *UNION 대신 사용하는 법

    상하관계쿼리를 사용하여 UNION ALL을 연산한 다음 그것으로부터 DISTINCT를 이용해 중복을 제거한다. (중복을 제거한 합집합과 같은 결과)

     
    -- 다수의 테이블에 대해서 집합 연산을 할 수 있다.
    -- 합집합, 교집합, 차집합
    -- UNION은 중복을 제거해야 해서 정렬작업을 수행하므로 성능저하가 있다.
    
    -- [SQL1][UNION|UNION ALL|INTERSECT][SQL2]
    
    -- 1. UNION(중복을 제거한 합집합)
    -- 동일한 컬럼이 최소 하나는 있어야 한다.
    select deptno from emp 
    union 
    select deptno from dept order by deptno;
    
    -- LEFT OUTER JOIN 과 RIGHT OUTER JOIN을 UNION하여 FULL OUTER JOIN 효과를 내보자
    select e.deptno, e.ename, d.deptname from emp e left outer join dept d on e.deptno = d.deptno
    union 
    select d.deptno, e.ename, d.deptname from emp e right outer join dept d on e.deptno = d.deptno;
    
    -- 2. UNION ALL(중복을 제거하지 않은 합집합)
    select deptno from emp 
    union all
    select deptno from dept order by deptno;
    
    -- 3. INTERSECT(교집합)
    -- 두 행에 모두 있는 값만 가져온다.
    select deptno from emp 
    intersect 
    select deptno from dept order by deptno;
    
    -- 4. MINUS(차집합)
    -- MariaDB에서는 지원하지 않기 때문에 NOT IN을 사용한다.
    select distinct deptno from emp; -- 1,2,4,6
    select distinct deptno from dept; -- 1,2,3,4,5
    
    -- emp - dept = 6
    select deptno from emp where deptno not in(select deptno from dept);
    -- dept - emp = 3,5
    select deptno from dept where deptno not in(select deptno from emp);
    
    -- emp와 dept의 중복이 허용되는 합집합(deptno 중심으로)을 emp와 교집합으로
    (select deptno from emp
    union all
    select deptno from dept)
    intersect
    select deptno from emp;
    
    -- UNION 대신 무엇을 써야 하나?
    select deptno from emp 
    union all
    select deptno from dept order by deptno;
    
    -- UNION은 중복 제거를 위해서 정렬을 시키고 데이터를 합치고 중복을 제거한다.
    -- 두 테이블을 먼저 합치고 그 안에서 정렬을 시키면 속도가 향상된다.
    -- 상하관계쿼리 : 서브쿼리를 테이블의 일부처럼 사용한다.
    
    select distinct u.deptno from 
    (select deptno from emp 
    union all
    select deptno from dept order by deptno) u;

    'SQL' 카테고리의 다른 글

    SQL - INDEX  (0) 2022.12.10
    SQL - IN, EXITS, ANY, ALL  (0) 2022.12.10
    SQL - JOIN  (1) 2022.12.10
    SQL - 서브쿼리  (0) 2022.12.10
    SQL - 제약조건  (0) 2022.12.10
Designed by Tistory.