출처: 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)가 헷갈리지 않게 하려는 듯하다. |
'SQL' 카테고리의 다른 글
[SQL, 데이터 캠프] CASE문과 데이터 캠프 예제쿼리 풀이 -1편 (0) | 2020.07.04 |
---|---|
[SQL, 데이터캠프] 서브쿼리 오답노트 2편 (0) | 2020.06.27 |
[SQL, 데이터캠프] 서브쿼리 오답노트 1편 (0) | 2020.06.27 |
[SQL] 오랫만에 SQL을 봤을 때 보면 좋을 것들 (0) | 2020.06.27 |
[SQL, 데이터 캠프]Left Join, Right Join, Full Join, Cross Join (0) | 2020.03.10 |
댓글