LEFT JOIN = LEFT OUTER JOIN
RIGHT JOIN = RIGHT OUTER JOIN
궁금증 발동
JOIN 과 INNER JOIN이 완전히 같은 것이라는 사실을 알게 되고... (2년차 SM의 눈물.. 곧 3년차인데..)
2023.08.02 - [Database] - [Oracle] JOIN과 INNER JOIN은 뭐가 다를까?
LEFT JOIN과 LEFT OUTER JOIN은 또 무엇이란 말인가..
RIGHT JOIN / RIGHT OUTER JOIN 역시
LEFT JOIN - LEFT OUTER JOIN 과 같은 관계일 것으로 보이니
정리하는 김에 다 같이 알아보기로 했다.
LEFT JOIN 쿼리문 실행
LEFT JOIN 키워드 사용 예
SELECT *
FROM DMS_ADMIN D -- 기준 테이블 : 행(= 레코드 또는 튜플) : 39 개
LEFT JOIN PSM_ADMIN P -- 왼쪽으로 붙여지는 테이블
ON D.ADMIN_ID = P.ADMIN_ID;
실행 결과 : 왼쪽(LEFT) 테이블이 39개의 행을 가지고 있기 때문인지 39개의 행을 반환한다.
여기에서 중요한 것은 기준 행은 39개이지만,
테이블 D와 테이블 P 의 '공통된 ID를 가진 데이터' 는 17개 밖에 없다는 것이다.
아래 이미지에서 녹색 영역은 JOIN 이 가능한 공통된 데이터이다.
흰색 영역도 기준 테이블이기 때문에 39개 행이 전체가 조회가 되어야 하는데,
테이블 P에 공통된 데이터가 없는 경우 균형을 맞추기 위해
노란색 영역처럼 빈 행을 만들어주고 null 값을 넣어서 39개 행을 만들어 보여주게 된다.
위 예제를 실행하고 살펴보면 LEFT JOIN은 간단하게 정리할 수 있을 것 같다.
1. 기준 행(본문 예제에서는 39개 행) 은 그대로 보존하면서
2. 'LEFT JOIN ' 키워드 뒤에 나오는 테이블을 '왼쪽으로 붙여준다.'
3. 이 때 공통된 데이터 행 개수(17개)가 기준 행의 개수(39개)에 못미친다면 빈칸(null)으로 채워준다.
=> 똑같은게 없으면 왼쪽 기준 행에 맞춰서 눈치껏 빈칸 만들어서 맞춰준다.
LEFT OUTER JOIN 쿼리문 실행
SELECT *
FROM DMS_ADMIN D -- 기준 테이블 : 행(= 레코드 또는 튜플) : 39 개
LEFT OUTER JOIN PSM_ADMIN P -- 왼쪽으로 붙여지는 테이블
ON D.ADMIN_ID = P.ADMIN_ID;
실행 결과 >>> : LEFT JOIN 과 동일한 결과가 나온다.
RIGHT JOIN 쿼리문 실행
RIGHT JOIN 키워드 사용 예
SELECT *
FROM DMS_ADMIN D -- 기준 테이블 : 행(= 레코드 또는 튜플) : 39 개
RIGHT JOIN PSM_ADMIN P -- 왼쪽으로 붙여지는 테이블 : 행(= 레코드 또는 튜플) : 58 개
ON D.ADMIN_ID = P.ADMIN_ID;
실행 결과
위 결과를 보면 LEFT JOIN 과 대칭되는 형태로 데이터가 나오게 된다.
기본적으로 FROM 절 뒤에 나오는 테이블이 기준 테이블로 세팅되지만,
RIGHT JOIN 키워드는 해당 키워드 뒤에 나오는 테이블(=붙이는 테이블)을 기준 테이블로 만들어 버린다.
붙여지는 형태는 LEFT JOIN과 똑같이 오른쪽에 테이블이 붙여지는 형태이지만,
데이터가 만들어지는 형태는 오른쪽에 붙인 테이블을 기준으로 총 58개의 행이 만들어지고,
39개 뿐인 테이블 D에서는 균형을 맞추기 위해 한 쪽에만 존재한 19개의 데이터에 빈 행을 만들어 붙여 버린다.
그림으로 도식화하면 아래와 같은 모습이다.
LEFT JOIN 은 왼쪽 테이블을 기준 테이블로, RIGHT JOIN 은 오른쪽 테이블을 기준 테이블로 만든다.
기준 테이블이 가진 모든 행을 출력하고 한 쪽에만 존재하는 데이터가 있으면 눈치껏 빈칸을 넣어서 null 값을 넣는다.
RIGHT OUTER JOIN 쿼리문 실행
RIGHT OUTER JOIN 쿼리문 실행
SELECT *
FROM DMS_ADMIN D -- 기준 테이블 : 행(= 레코드 또는 튜플) : 39 개
RIGHT OUTER JOIN PSM_ADMIN P -- 왼쪽으로 붙여지는 테이블 : 행(= 레코드 또는 튜플) : 58 개
ON D.ADMIN_ID = P.ADMIN_ID;
실행 결과 >>> : RIGHT JOIN 과 동일한 결과가 나온다.
Chat GPT 선생님께 문의
정리
LEFT JOIN == LEFT OUTER JOIN
RIGHT JOIN == RIGHT OUTER JOIN
명확성, 가독성을 위해 OUTER 키워드를 명시적으로 넣어주는 것이 좋겠지만,
OUTER 키워드를 생략하는 것이 일반적이고, ANSI SQL 표준이라고 하니
지금까지 그래왔던 것 처럼 OUTER 키워드는 다시는 쓰지 말아야 겠다(?)
'Database' 카테고리의 다른 글
[DBeaver] 5초 만에 Auto-Commit 해제 방법 (0) | 2023.08.03 |
---|---|
[Oracle] JOIN과 INNER JOIN은 뭐가 다를까? (0) | 2023.08.02 |
[Oracle] 여러 개의 테이블에서 데이터 조회, JOIN 유무의 차이 (0) | 2023.08.02 |
[Oracle] Mybatis #{ } 와 ${ } 어떻게 쓸까? (0) | 2023.03.16 |
Mac에서 Oracle11g 사용하는 방법 (Docker + DBeaver) (0) | 2021.12.29 |
댓글