소개
6개월차 신입 데이터 분석가입니다. SQL에 대해 조금 더 깊게 이해하고자 공부를 시작합니다.
www.yes24.com/Product/Goods/64391533
본 시리즈는 기본적으로 해당 도서를 참조하여 작성되었습니다.
아래와 관련된 키워드로 검색해보시면 환경세팅 관련 많은 도움을 받으실 수 있습니다.
- oracle sql developer scott hr
- oracle sql developer 설치
11g 설치는 https://data-make.tistory.com/2 해당 링크가 설명이 잘되어 있습니다.
환경은 Oracle SQL Developer에서 제공해주는 hr과 scott DB를 사용합니다. 해당 DB에서 기본적으로 제공해주는 테이블이 있고 제가 직접 테이블을 업로드하거나 생성할 수도 있습니다.
SQL 관련 포스팅 링크를 모아둔 아카이브 페이지가 있습니다.
본 시리즈의 기본적인 문법은 Oracle SQL입니다. 현업에서 몇개월 간 종사해본 입장에서 DB별 SQL 문법 차이는 그렇게 크지 않습니다. 문법보다는 원리에 집중하시면 좋을 것 같습니다.
글의 목표
1. OUTER JOIN의 의미에 대해서 한번 더 생각해봅니다.
2. OUTER JOIN에서 WHERE절과 ON절이 가지는 의미를 비교해봅니다.
1. OUTER JOIN의 의미
지난 포스팅에서 JOIN에 대해서 다루었었다. OUTER JOIN의 의미를 다시 한번 생각해보자.
-- LEFT OUTER JOIN(ANSI)
SELECT A.personID info_ID
, B.personID purchase_ID
FROM user_info A
LEFT OUTER JOIN purchase_order B
ON A.personID = B.personID
order by 1;
OUTER JOIN에는 두 가지 요소가 있다.
1. OUTER JOIN의 기준이 되는 테이블
2. OUTER JOIN의 기준이 아닌 테이블
본 쿼리에서 기준 테이블은 user_info이고 기준이 아닌 테이블은 purchase_order이다. 이게 무슨말이냐면, user_info를 기준으로 purchase_order를 확장해라는 뜻이다.
원래 PURCHASE_ORDER 테이블에 personID는 1, 3, 5밖에 없었다. 하지만, user_info를 기준으로 purchase_order테이블을 확장했기 때문에 purchase_order 테이블에는 없고 user_info에는 있는 2와 4에 null값이 생긴 것이다.
이렇게 OUTER의 의미를 다시 한번 짚어 봤다.
2. OUTER JOIN에서 WHERE절과 ON절이 가지는 의미
WHERE절은 SQL에서 조건절에 해당한다. 왜 조건절이 IF가 아니라 WHERE절이냐고 반문할 수도 있다. SQL은 기본적으로 FULL SCAN이다. 이게 무슨말이냐면, 기본적으로는 필요한 정보가 있으면 필요한 정보가 어디에 있는지 테이블 전체를 뒤지도록 설계가 되어 있다. 이렇게 놓고 보면 WHERE이 잘 어울리지 않는가?
어쨋든, WHERE절은 SQL에서 조건절을 의미한다.
그런데, JOIN시 ANSI 표준 문법을 사용하면 ON절이 등장한다.
-- LEFT OUTER JOIN(ANSI)
SELECT A.personID info_ID
, B.personID purchase_ID
FROM user_info A
LEFT OUTER JOIN purchase_order B
ON A.personID = B.personID
order by 1;
여기서는 A테이블과 B테이블에서 각각 어떤 열을 기준으로 병합할지만 결정하였다.
+ON절에도 일반 조건을 넣을 수 있다.
여기서 일반 조건이란 WHERE B.personID = 2 이런 것을 말한다.
A.personID = B.personID 이것은 조인 조건이다.
그렇다면 어떻게 다른지 알아 보자.
2-1. WHERE절 VS ON절
-- #1. Outer Join ON_Condition 조건 -> 실제 Outer Join
SELECT A.*
, B.*
FROM user_info A
LEFT JOIN purchase_order B
ON A.personid < 3
AND A.personid = B.personid;
-- #2. Outer Join WHERE 조건 -> INNER JOIN으로 들어감
SELECT A.*
, B.*
FROM user_info A
LEFT JOIN purchase_order B
ON A.personid = B.personid
WHERE A.personid < 3;
다음 결과를 보고 각 결과가 #1과 #2어떤 코드의 결과인지 맞춰보시오.
정답은 ##1이 #1이고 ##2가 #2이다.
왜 그럴까?
#1 먼저 살펴보자.
FROM user_info A
LEFT JOIN purchase_order B
ON A.personid < 3
AND A.personid = B.personid;
#1에서 AND 조건은 OUTER JOIN 조건에 해당한다. 상세히 해석해보면 다음과 같다.
1. 내가 A 테이블을 기준으로 B 테이블의 결과를 확장할 건데
- 기준은 A테이블의 조인 조건을 보존하겠다는 뜻이다. 즉, 여기서는 A.personid 열을 보존한다는 의미
2. 그때, A.personid < 3 이하인 애들만 매칭을 시켜서 조건에 맞는 애들만 합쳐
위와 같은 의미가 된다.
즉, ON 안에 일반 조건이 있으면 OUTER JOIN의 조건이 된다.
다음으로, #2를 살펴보자.
FROM user_info A
LEFT JOIN purchase_order B
ON A.personid = B.personid
WHERE A.personid < 3;
FROM user_info A
LEFT JOIN purchase_order B
ON A.personid = B.personid
#2 코드를 두 파트로 나누어 보면 위 파트와
WHERE A.personid < 3;
위 파트의 inner join과 같은 결과가 출력되는 것이다.
이에 따라 ##2의 결과가 출력된다.
번외 Oracle SQL 동치 구문
-- #1과 동치
SELECT A.*
, B.*
FROM user_info A, purchase_order B
WHERE A.personid <
CASE WHEN B.personid(+) IS NOT NULL THEN 3 ELSE 3 END
AND B.personid(+) = A.personid;
-- #2와 동치
SELECT A.*
, B.*
FROM user_info A, purchase_order B
WHERE B.personid(+) = A.personid
AND A.personid < 3;
'딥상어동의 딥한 SQL > LV1.쿼리초보탈출기' 카테고리의 다른 글
흔하디 흔한 쿼리 실수들 (4) | 2020.12.14 |
---|---|
[MSSQL] ROW_NUMBER에 대한 고찰 (0) | 2020.11.14 |
[Oracle SQL] 쉽게 배워보는 JOIN의 원리 (Cross Join, Inner Join, Left Join) (0) | 2020.11.08 |
[Oracle SQL] 직접 만들어보며 배우는 SQL 기본키(Primary Key) VS 외래키(Foreign Key) (0) | 2020.11.08 |
<LV1. 쿼리 초보 탈출기 - 아카이브 페이지> (0) | 2020.11.07 |
제 블로그에 와주셔서 감사합니다! 다들 오늘 하루도 좋은 일 있으시길~~
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!