내부 조인은 두 테이블을 조인해 조인 조건으로 사용한 열에 있는 같은 값을 조합해 검색한다.
하지만 다른 테이블에 있는 행에서 일치 항목이 아닌 행을 조합해 검색해야 할 때도 있다.
그런 경우에 외부 조인을 사용한다. 예를 들어, 상품을 주문한 고객과 주문하지 않은 고객을 포함해 주문 내역을 함께 검색하고 싶다면 외부 조인을 사용할 수 있다. 즉, 외부 조인은 열의 일치 항목을 고려하지 않고, 한쪽 테이블을 다른 쪽 테이블에 조합할 때 사용한다.
외부 조인의 기본 형식
SELECT [열 이름]
FROM [테이블 1]
<LEFT, RIGHT, FULL> OUTER JOIN [테이블2] ON [테이블1.열] = [테이블2.열]
WHERE [검색 조건]
LEFT, RIGHT는 기준 테이블을 정하는 것이다.
A 테이블을 기준으로 B 테이블을 조인하고 싶다면 LEFT를
B 테이블을 기준으로 A 테이블을 조인하고 싶다면 RIGHT를 사용한다.
예1) 고객 테이블이 왼쪽, 주문 테이블이 오른쪽에 있다고 하자.
고객번호 | 고객이름 |
1 | 부엉이 |
2 | 독수리 |
3 | 비둘기 |
주문번호 | 고객번호 | 주문날짜 |
100 | 1 | 2021-11-16 |
200 | 4 | 2021-11-16 |
300 | 3 | 2021-11-16 |
LEFT OUTER JOIN on 고객번호
고객번호 | 고객이름 | 주문번호 | 고객번호 | 주문날짜 |
1 | 부엉이 | 100 | 1 | 2021-11-16 |
2 | 독수리 | NULL | NULL | NULL |
3 | 비둘기 | 300 | 3 | 2021-11-16 |
고객 테이블을 우선 포함한 다음, 고객 테이블의 고객번호와 주문 테이블의 고객번호를 비교해 고객 테이블에 있는 고객번호만 주문테이블에서 골라 결과에 포함시키고 없으면 NULL처리한다.
LEFT OUTER JOIN 문을 적용한 쿼리
select [고객.고객번호],[고객.고객이름],[주문.주문번호],[주문.고객번호],[주문.주문날짜]
from [고객] outer join [주문] on [고객.고객번호] = [주문.고객번호]
LEFT OUTER JOIN 문 사용하기
2개 테이블을 LEFT OUTER JOIN 쿼리 실행: 기준 테이블(nasdaq_company)
Select
a.symbol as a_symbol,
b.symbol as b_symbol
From nasdaq_company as a
LEFT OUTER JOIN industry_group_symbol as b ON a.symbol = b.symbol
a_symbol | b_symbol |
^CMC200 | NULL |
^DJI | NULL |
^FTSE | NULL |
^GSPC | NULL |
^IXIC | NULL |
^N225 | NULL |
^RUT | NULL |
A A | A A |
AA AA | AA AA |
테이블 A에 있는 것만 검색하려면
→ b_symbol에서 NULL 부분만 선택하면 된다.
Select
a.symbol as a_symbol,
b.symbol as b_symbol
From nasdaq_company as a
LEFT OUTER JOIN industry_group_symbol as b ON a.symbol = b.symbol
Where b.symbol IS NULL
RIGHT OUTER JOIN 문 사용하기
고객번호 | 고객이름 |
1 | 부엉이 |
2 | 독수리 |
3 | 비둘기 |
주문번호 | 고객번호 | 주문날짜 |
100 | 1 | 2021-11-16 |
200 | 4 | 2021-11-16 |
300 | 3 | 2021-11-16 |
RIGHTT OUTER JOIN on 고객번호
고객번호 | 고객이름 | 주문번호 | 고객번호 | 주문날짜 |
1 | 부엉이 | 100 | 1 | 2021-11-16 |
NULL | NULL | 200 | 4 | 2021-11-16 |
3 | 비둘기 | 300 | 3 | 2021-11-16 |
주문 테이블을 우선 포함한 다음, 주문 테이블에서 고객번호와 일치하는 고객 테이블의 고객번호를만 데이터에 표시하고 없으면 NULL처리한다.
Select
a.symbol as a_symbol,
b.symbol as b_symbol
From industry_group_symbol as a
RIGHTT OUTER JOIN nasdaq_company as b ON a.symbol = b.symbol
a_symbol | b_symbol |
NULL | ^CMC200 |
NULL | ^DJI |
NULL | ^FTSE |
NULL | ^GSPC |
NULL | ^IXIC |
NULL | ^N225 |
NULL | ^RUT |
A A | A A |
AA AA | AA AA |
FULL OUTER JOIN 문 알아보기
LEFT OUTER JOIN 문과 RIGHTT OUTER JOIN 문을 합친 것이다.
가끔 데이터베이스 디자인이나 데이터에 문제가 있을 때, 데이터의 누락이나 오류를 찾아낼 때 사용한다.
고객번호 | 고객이름 |
1 | 부엉이 |
2 | 독수리 |
3 | 비둘기 |
주문번호 | 고객번호 | 주문날짜 |
100 | 1 | 2021-11-16 |
200 | 4 | 2021-11-16 |
300 | 3 | 2021-11-16 |
FULL OUTER JOIN on 고객번호
고객번호 | 고객이름 | 주문번호 | 고객번호 | 주문날짜 |
1 | 부엉이 | 100 | 1 | 2021-11-16 |
2 | 독수리 | NULL | NULL | NULL |
3 | 비둘기 | 300 | 3 | 2021-11-16 |
4 | NULL | 200 | 4 | 2021-11-16 |
Select
a.symbol as a_symbol,
b.symbol as b_symbol
From industry_group_symbol as a
FULL OUTER JOIN nasdaq_company as b ON a.symbol = b.symbol
LEFT 테이블과 RIGHT 테이블에 있는 데이터만 추출하려면 NULL 데이터를 필터링해서 원하는 결과를 검색할 수 있다.
Select
a.symbol as a_symbol,
b.symbol as b_symbol
From nasdaq_company as a
FULL OUTER JOIN industry_group_symbol as b ON a.symbol = b.symbol
Where a.symbol IS NULL
OR b.symbol IS NULL
'IT Story > SQL Story' 카테고리의 다른 글
공통 테이블 식(Common Table Expression, CTE) (0) | 2022.12.01 |
---|---|
서브 쿼리 (0) | 2022.11.30 |
조인(Join): 내부 조인 (0) | 2022.11.28 |
SQL 시작하기: CREATE 문 (0) | 2022.11.24 |
SQL 시작하기: GROUP BY 문과 HAVING 문 (0) | 2022.11.24 |