충분히 쌓여가는
03 외부 조인 본문
INNER JOIN은 두 테이블은 조인해 조인 조건으로 사용한 열에 있는 같은 값을 조합해 검색했다
하지만 다른 테이블에 있는 행에서 일치 항목이 아닌 행을 조합해 검색해야 할 때도 있다.
그런 경우 외부 조인(OUTER JOIN)을 사용한다.
외부 조인은 열의 일치 항목을 고려하지 않고, 한쪽 테이블을 다른 쪽 테이블에 조합할 때 사용한다.
외부 조인의 기본 형식
SELECT [열 이름]
FROM [테이블 1]
<LEFT, RIGHT, FULL> OUTER JOIN [테이블 2] ON [테이블 1.열] = [테이블 2.열]
WHERE [검색 조건]
LEFT OUTER JOIN
A, B 테이블이 좌우에 있다고 생각했을 때 A 테이블을 기준으로 B 테이블을 조인하고 싶다면 LEFT를 사용하고, B 테이블을 기준으로 A 테이블을 조인하고 싶다면 RIGHT를 사용한다.
실제 OUTER JOIN 실습 테이블
왼쪽: 고객 테이블
오른쪽: 주문 테이블
LEFT OUTER JOIN에서 고객 테이블은 우선 결과에 포함한다.
그런 다음 고객 테이블의 [고객 번호]와 주문 테이블의 [고객 번호]를 비교해 고객 테이블에 있는 [고객 번호]만 주문 테이블에서 골라 결과에 포함시키고, 없는 것은 NULL 처리한다.
결과를 보면 고객 테이블의 데이터는 모두 표시가 된 상태이다.
[고객 번호]가 1, 3인 행은 표시되었고 2인 행은 주문 테이블에 없으므로 NULL 표시했다.
이처럼 LEFT OUTER JOIN은 왼쪽 테이블 기준으로 모든 행을 표시하고, 오른쪽 테이블에 존재하지 않는 데이터는 NULL로 표시한다.
nasdaq_company 테이블과 industry_group_symbol 테이블을 LEFT OUTER JOIN한 것
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;
결과는 nasdaq_company 테이블이 기준이 된다
LEFT OUTER JOIN에서 기준 테이블의 데이터만 추출
만약 기준 테이블에 있는 데이터만 추출하려면 LEFT OUTER JOIN 결과에서 NULL 결과 데이터만 추출하면 된다
nasdaq_company 테이블과 industry_group_symbol 테이블을 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
WHERE b.symbol IS NULL;
RIGHT OUTER JOIN
LEFT OUTER JOIN과 원리는 같고 방향만 다르다
고객 테이블과 주문 테이블의 RIGHT OUTER JOIN
왼쪽: 고객 테이블
오른쪽: 주문 테이블
주문 테이블에서 고객 번호가 일치한 주문 테이블의 데이터만 표시되었다.
주문 테이블에는 있지만 고객 테이블에 없는 데이터는 NULL로 표시되었다.
nasdaq_company 테이블과 industry_group_symbol 테이블을 RIGHT OUTER JOIN한 것
SELECT
a.symbol AS a_symbol,
b.symbol AS b_symbol
FROM industry_group_symbol AS a
RIGHT OUTER JOIN nasdaq_company AS b ON a.symbol = b.symbol
RIGHT OUTER JOIN에서 기준 테이블의 데이터만 추출
nasdaq_company 테이블과 industry_group_symbol 테이블을 RIGHT OUTER JOIN한 다음 nasdaq_company 테이블에 있는 데이터만 검색
SELECT
a.symbol AS a_symbol,
b.symbol AS b_symbol
FROM industry_group_symbol AS a
RIGHT OUTER JOIN nasdaq_company AS b ON a.symbol = b.symbol
WHERE a.symbol IS NULL;
FULL OUTER JOIN
FULL OUTER JOIN은 LEFT OUTER JOIN과 RIGHT OUTER JOIN을 합친 것.
FULL OUTER JOIN의 경우 양쪽 테이블의 일치하지 않는 행도 모두 검색.
즉, 조인 조건에 일치하지 않는 항목과 일치하는 항목 모두가 표시된다.
FULL OUTER JOIN 사용시기
FULL OUTER JOIN을 실제로 사용하는 일은 드물다.
가끔 데이터베이스 디자인이나 데이터에 몇 가지 문제가 있을 때, 또는 데이터의 누락이나 오류를 찾아낼 때 사용한다.
예를 들어 고객 번호로 주문 내역이 기록된 것이 없는지 확인하고 싶다면 FULL OUTER JOIN이 적절하다.
고객 번호를 조인 조건으로 FULL OUTER JOIN하는 과정
고객 테이블과 주문 테이블을 표시하고 각 테이블에서 존재하지 않는 데이터는 NULL로 표시한다.
2개의 테이블을 FULL OUTER JOIN(기준: nasdaq_company)
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;
2개 테이블을 FULL OUTER JOIN하고 각 테이블의 데이터만 추출: NULL 필터링
FULL OUTER JOIN을 사용해 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;
'MSSQL > 테이블을 서로 통합하는 조인' 카테고리의 다른 글
06 서브 쿼리 (1) | 2024.10.09 |
---|---|
05 셀프 조인 (7) | 2024.10.09 |
04 교차 조인 (9) | 2024.10.09 |
02 내부 조인 (1) | 2024.10.07 |
01 조인 JOIN (0) | 2024.10.07 |