8.아우터 조인
아우터 조인, OUTER JOIN
아우터 조인은 이너와 아우터를 함께 반환함
아우터 조인은 아우터를 지정하는 기준에 따라 왼쪽부터 LEFT, RIGHT, FULL OUTER JOIN으로 구분됨

아우터 조인 연습용 스키마
아래의 스키마를 활용하여 실습 진행
sql
-- inner join에서 활용한 스키마, 데이터 제거
DROP DATABASE join_practice;
CREATE DATABASE join_practice;
use join_practice;
DROP TABLE IF EXISTS ta;
DROP TABLE IF EXISTS tb;
DROP TABLE IF EXISTS tc;
DROP TABLE IF EXISTS td;
CREATE TABLE ta (x INT, y INT);
CREATE TABLE tb (x INT);
CREATE TABLE tc (x INT);
CREATE TABLE td (x INT);
INSERT INTO ta VALUES (1, 1);
INSERT INTO ta VALUES (2, 2);
INSERT INTO ta VALUES (3, 3);
INSERT INTO tb VALUES (1);
INSERT INTO tb VALUES (2);
INSERT INTO tb VALUES (4);
INSERT INTO tc VALUES (1);
INSERT INTO tc VALUES (2);
INSERT INTO tc VALUES (3);
INSERT INTO td VALUES (1);
INSERT INTO td VALUES (3);
INSERT INTO td VALUES (4);
SELECT * FROM ta;
SELECT * FROM tb;
SELECT * FROM tc;
SELECT * FROM td;| x of TA | y of TA | x of TA | x of TC | x of TD |
|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 2 | |
| 3 | 3 | 3 | 3 | |
| 4 | 4 |
샘플 데이터 결과셋이 다음과 같다고 할 때,
| x of TA | y of TA | x of TB | x of TC | x of TD |
|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 2 | NULL |
| 3 | 3 | NULL | 3 | 3 |
| NULL | NULL | 4 | NULL | 4 |
ta가 아우터 기준일 때의 쿼리문
아우터 기준이라는 의미는 LEFT OUTER 쿼리 기준 좌측에 작성한 테이블을 말함
→ ta a LEFT OUTER tb b
sql
SELECT a.x AS 'x of ta', b.x AS 'x of tb'
FROM ta a
LEFT OUTER
JOIN tb b
ON b.x = a.x;수행 결과 ↓
| x of TA | x of TB |
|---|---|
| 1 | 1 |
| 2 | 2 |
| 3 | NULL |
| → 아우터 기준이 아닌 tb는 NULL이 출력됨 |
조인 수행 과정 ↓
| x of TA | x of TB | B == A | 결과 |
|---|---|---|---|
| 1 | 1 | 1 == 1 | TRUE |
| 2 | 2 | 2 == 2 | TRUE |
| 3 | NULL | OUTER | TRUE |
| NULL | 4 | Skip! | FALSE |
→ TA 기준(LEFT)으로 OUTER 조인되었기 때문에 3은 출력됨
tb가 아우터 기준일 때의 쿼리문
RIGHT OUTER 쿼리 기준 우측에 작성한 테이블
→ ta a RIGHT OUTER tb b
sql
SELECT a.x AS 'x of ta', b.x AS 'x of tb'
FROM ta a
RIGHT OUTER
JOIN tb b
ON b.x = a.x;수행 결과 ↓
| x of TA | x of TB |
|---|---|
| 1 | 1 |
| 2 | 2 |
| NULL | 4 |
| → 아우터 기준이 아닌 tb는 NULL이 출력됨 |
조인 수행 과정 ↓
| x of TA | x of TB | 조인 조건 | 결과 |
|---|---|---|---|
| B == A | |||
| 1 | 1 | 1 == 1 | TRUE |
| 2 | 2 | 2 == 2 | TRUE |
| 3 | NULL | Skip! | FALSE |
| NULL | 4 | OUTER | TRUE |
→ TB 기준(RIGHT)으로 OUTER 조인되었기 때문에 4가 출력됨
아우터 조인에 일반 조건 기술
아우터 기준에 해당하는 테이블(여기서는 ta a)의 일반 조건은 WHERE 절에 기술해야함
sql
SELECT a.x AS 'x of ta', b.x AS 'x of tb'
FROM ta a
LEFT OUTER
JOIN tb b
ON b.x = a.x
WHERE a.x > 1;수행 결과 ↓
| x of TA | x of TB |
|---|---|
| 2 | 2 |
| 3 | NULL |
조인 수행 과정 ↓
| 구분 | 아우터 기준 테이블 | |||||
|---|---|---|---|---|---|---|
| x of TA | x of TB | 일반 조건 | 일반 조건 결과 | 조인 조건 | 조인 조건 결과 | 최종 결과 |
| a.x > 1 | B == A | |||||
| 1 | 1 | 1 > 1 | FALSE | 1 == 1 | TRUE | FALSE |
| 2 | 2 | 2 > 1 | TRUE | 2 == 2 | TRUE | TRUE |
| 3 | NULL | 3 > 1 | TRUE | OUTER | TRUE | TRUE |
| NULL | 4 | NULL > 1 | FALSE | Skip! | FALSE | FALSE |
아우터 기준에 해당하는 일반 조건을 ON에 작성했을 때,
sql
SELECT a.x AS 'x of ta', b.x AS 'x of tb'
FROM ta a
LEFT OUTER
JOIN tb b
ON b.x = a.x AND a.x > 1;
-- WHERE 대신 AND를 통해 ON 절에 기술수행 결과 ↓
| x of TA | x of TB |
|---|---|
| 1 | NULL |
| 2 | 2 |
| 3 | NULL |
→ 일반 조건과 관계 없이, ta 기준 모든 OUTER를 출력함 OUTER 기준이 아닌 TB는 일반 조건(a.x >1)이 TRUE인 행만 값이 출력됨 즉, TB 테이블에도 1의 값은 존재하지만 일반 조건에 충족되지 않기 때문에 출력되지 않고, NULL로 출력됨 (TB의 3은 초기 값 자체가 NULL이었음)
조인 수행 과정 ↓
| 구분 | 아우터 기준 테이블 | |||||
|---|---|---|---|---|---|---|
| x of TA | x of TB | 일반 조건 | 일반 조건 결과 | 조인 조건 | 조인 조건 결과 | 최종 결과 |
| a.x > 1 | B == A | |||||
| 1 | 1 | 1 > 1 | FALSE | 1 == 1 | TRUE | TRUE |
| 2 | 2 | 2 > 1 | TRUE | 2 == 2 | TRUE | TRUE |
| 3 | NULL | 3 > 1 | TRUE | OUTER | TRUE | TRUE |
| NULL | 4 | NULL > 4 | FALSE | Skip! | FALSE | FALSE |
아우터 기준에 해당하지 않는 테이블(tb)의 일반 조건은 ON 절에 기술해야함
sql
SELECT a.x AS 'x of ta', b.x AS 'x of tb'
FROM ta a
LEFT OUTER
JOIN tb b
ON b.x = a.x
AND b.x > 1;수행 결과 ↓
| x of TA | x of TB |
|---|---|
| 1 | NULL |
| 2 | 2 |
| 3 | NULL |
조인 수행 과정 ↓
| 구분 | 아우터기준x table | |||||
|---|---|---|---|---|---|---|
| x of TA | x of TB | 일반 조건 | 일반 조건 결과 | 조인 조건 | 조인 조건 결과 | 최종 결과 |
| b.x > 1 | B == A | |||||
| 1 | 1 | 1 > 1 | FALSE | 1 == 1 | TRUE | TRUE |
| 2 | 2 | 2 > 1 | TRUE | 2 == 2 | TRUE | TRUE |
| 3 | NULL | 3 > 1 | TRUE | OUTER | TRUE | TRUE |
| NULL | 4 | 4 > NULL | FALSE | Skip! | FALSE | FALSE |
WHERE 절에 아우터 기준이 아닌 테이블(tb)의 일반 조건을 기술할 경우, 아우터 조인이 이너 조인으로 변경됨
sql
SELECT a.x AS 'x of ta', b.x AS 'x of tb'
FROM ta a
LEFT OUTER
JOIN tb b
ON b.x = a.x
WHERE b.x > 1;| 구분 | 아우터기준x table | |||||
|---|---|---|---|---|---|---|
| x of TA | x of TB | 일반 조건 | 일반 조건 결과 | 조인 조건 | 조인 조건 결과 | 최종 결과 |
| b.x > 1 | B == A | |||||
| 1 | 1 | 1 > 1 | FALSE | 1 == 1 | TRUE | FALSE |
| 2 | 2 | 2 > 1 | TRUE | 2 == 2 | TRUE | TRUE |
| 3 | NULL | NULL > 1 | FALSE | NULL == 3 | FALSE | FALSE |
| NULL | 4 | 4 > 1 | TRUE | 4 == NULL | FALSE | FALSE |
Last updated on