본문 바로가기
SQL

[SQL, 데이터 캠프] Intersect, Except, Semi Join, Anti Join

by 다랭킴 2020. 3. 8.

출처: Data Camp(https://www.datacamp.com/)

저작물의 모든 것을 공개하지 않았으며

저작권 문제 시 댓글을 달아주시면 조치를 취하겠습니다.

 

 

 

INTERSECT의 구조
Select col1, col2 From table1문
INTERSECT
Select col1', col2' From table2문


* 위, 아래 SELECT FROM문에 모두 있는 행만 반환한다.
*이때 col1과 col1'는 서로 내용이 대응하는 칼럼이다.
*아래 그림을 보면 ORDER BY에 들어가는 칼럼의 기준은 위쪽 Select, From문이다.

 

 

 

economies의 code, year 칼럼에 있는 행과

populations의 country_code, year 칼럼에 있는 행 중

겹치는 행만 반환한다.

 

 

 

 

 

 

 

 

 

EXCEPT의 구조
Select col1 From table1문
EXCEPT
Select col1 From table2문


위 SELECT FROM문에는 있지만 아래 SELECT FROM문에 없는 행만 반환한다.
*이때 col1과 col1'는 서로 내용이 대응하는 칼럼이다.
*아래 그림을 보면 ORDER BY에 들어가는 칼럼의 기준은 위쪽 Select, From문이다.

 

왼쪽 그림의 코드는  cities 테이블의  name에는 있지만 countries테이블의 capital에 없는 행을 반환할 수 있다.

즉, cities테이블에 있는 도시들 중에는 수도가 아닌 도시들이 있다는 뜻이다.

 

 

 

 

 

 

 

 

 

 

 

SEMI JOIN : 서브쿼리를 사용하여 JOIN을 하는 방법


→WHERE 문에 새로운 IN(SELECT FROM문)을 작성해서 조건문을 만들기
그 조건문의 결과가 WHERE문의 칼럼 내용과 일치
→아래 그림과 설명 참고하기

 

WHERE문의 서브쿼리는 countries 테이블에서 Middle East지역의 국가코드를 반환한다.

그 국가코드를 language 테이블 code칼럼이 받아서 해당 조건에 맞는 name값을 반환할 수 있다. 

 

 

 

 

 

 

 

 

 

 

 

 

위의 SEMI JOIN을 INNER JOIN으로 구현하기 (아래 이미지의 코드를 읽는 순서)
1) FROM countries c1 INNER JOIN currencies c2 → countries 테이블과 currencies 테이블을 Inner join한다.
2) ON c1.code = c2.code → Inner join할 때 두 테이블을 엮어주는 칼럼들을 골라 작성한다.
3) WHERE c1.continent = 'Oceania' → Inner Join한 상태의 테이블에 조건을 부여한다.(alias가 필요하다)

4) 가장 윗줄의 SELECT문 → 테이블 alias를 사용하여 칼럼들을 선택한다.

 

 

 

 

 

 

 

 

 

 

 

Anti Join
→WHERE 문에 새로운 NOT IN(SELECT FROM문)을 작성해서 조건문을 만들기
그 조건문의 결과가 WHERE문의 칼럼 내용과 일치

 

 

 

1) WHERE continent = 'Oceania'

AND code NOT IN(~) → 서브쿼리를 포함해서 두 가지 조건문이다.

 

2) NOT IN(SELECT code FROM currencies) currencies의 code를 포함하지 않는다는 뜻이다.

 

3) 결과적으로 WHERE의 두 가지 조건을 만족하는 countries의 code와 name을 반환한다.

 

 

 

 

 

 

 

 

 

 

여러가지 Theory Clauses를 이용해서 Semi Join하기(아래 코드 분석)
1) FROM cities c1 WHERE country_code IN (~) → cities 테이블은 IN에 있는 country_code를 조건으로 행을 반환한다.
2) ( economies의 SELECT문
UNION currencies의 SELECT문
EXCEPT populations의 SELECT문) economies와 currencies의 code는 포함하고 populations의 code는 포함하지 않는다.


3) 각 테이블에 alias를 취한 이유는 UNION, EXCEPT사이의 국가코드(code, country_code)가 헷갈리지 않게 하려는 듯하다. 

 

댓글