-
*집합(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