티스토리 뷰

반응형

안녕하세요, 끙정입니다.

 

기나긴 서브 쿼리에 대해서 여정 중입니다.

오늘은 테이블 조합을 통한 서브 쿼리에 대해서 알아보겠습니다.

 

하나의 엔터티를 저장하는 테이블이라도 성능상의 이유로 일정한 조건에 따라 테이블을 나누어 놓기도 합니다.

예를 들어 매출 정보를 몇 년치 모으면 너무 거대해지는 데다 작년, 재작년 데이터를 굳이 같이 둘 필요가 없습니다.

이럴 때는 연도별로 또는 월별로 테이블을 분할하여 관리합니다.

 

이렇게 흩어져 있는 테이블의 정보를 조합하여 보아야 할 때,

집합 연산자를 사용합니다.

 

1. UNION / UNION ALL

UNION 연산자는 복수 개의 결과셋에 대한 합집합을 생성합니다.

합집합은 이쪽에 있는 정보와 저쪽에 있는 정보를 합쳐 한 덩어리로 보여주는 것입니다.

 

/* 두 출력 결과를 합쳐서 보여준다. */
SELECT * FROM tStaff WHERE depart = '영업부'
UNION
SELECT * FROM tStaff WHERE depart = '총무부';

 

 

UNION은 두 집합에 공통적으로 존재하는 레코드가 있다면 하나로 합칩니다.

집합의 정의상 같은 원소를 두 개 이상 가질 필요가 없어 중복 원소는 제거하는 것이지요.

이에 비해 UNION ALL 연산자는 중복을 제거하지 않고 있는 그대로 모두 보여줍니다.

 

SELECT DISTINCT depart FROM tStaff WHERE salary > 400
UNION ALL
SELECT DISTINCT depart FROM tStaff WHERE score > 80;

 

아래 결과는 총무부가 두 번 나온다.

 

하나로 합칠 결과셋은 필드의 개수와 타입이 일치하거나 적어도 호환되어야 합니다.

구조가 비슷해야 합집합을 만들 수 있습니다.

 

필드의 개수와 타입이 일치해야 합니다. 맞다면 어거지로 연결은 됩니다.

 

또한 UNION을 여러 번 사용해서 세 개 이상의 합집합도 만들 수 있습니다.

 

2. INTERSECT

UNION 연산자가 합집합을 구하는데 비해 INTERSECT 연산자는 교집합을 구합니다.

교집합은 두 결과셋에 모두 포함된 레코드만으로 집합을 구성하며 중복 레코드는 한 번만 포함합니다.

 

SELECT name FROM tStaff WHERE depart = '영업부'
INTERSECT
SELECT name FROM tStaff WHERE gender = '여';

 

두 결과에서 중복된 결과만 출력!

 

3. MINUS  (오라클 Only) / EXCEPT (SQL Server, MariaDB Only)

MINUS / EXCEPT 연산자는 차집합을 구합니다.

차집합은 앞쪽 집합의 원소에서 뒤쪽 집합의 원소를 제외한 집합입니다.

중복행이 있으면 하나만 포함합니다.

 

DBMS별로 차이가 있지만 문법은 똑같습니다.

오라클은 MINUS를 사용하고,

SQL Server와 MariaDB는 EXCEPT를 사용하고 있습니다.

 

/* 오라클은 MINUS */
SELECT name FROM tStaff WHERE depart = '영업부'
EXCEPT
SELECT name FROM tStaff WHERE gender = '여';

 

중복되는 신사임당 값을 뺀 결과를 출력한다.

 

교집합이나 합집합과는 달리 차집합은 교환 법칙이 성립되지 않습니다.

따라서 결과셋의 순서에 따라 집합이 달라집니다.

기준은 앞의 집합이고, 뒤의 집합을 앞의 집합에서 뺀다고 생각해야 합니다.

 

전혀 다른 결과가 나온다.

 

그만 알아보겠습니다.

 

 

출처

http://www.yes24.com/Product/Goods/101637633

 

김상형의 SQL 정복 : 소문난 명강의 (무료특별판) - YES24

DBMS에 제약 없이 SQL을 활용한다!핵심 원리를 알려주는 SQL 바이블 DBMS 제품이나 개발툴이 아닌 SQL 언어 그 자체를 배우는 바이블 도서다. 특정 DBMS에 종속적인 사용법보다는 표준화된 데이터 관리

www.yes24.com

 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함