💡외부 조인
외부 조인(OUTER JOIN)은 이름만 보면 내부 조인의 반대말인 거 같지만, 그렇지 않다.
모든 외부 조인은 내부 조인의 결과를 포함하고 있다. 여기에 + Alpha를 한 게 외부 조인이다.
내부 조인을 하면 일부 컬럼이 제외되는데, 외부 조인은 그 제외된 컬럼 중에 부모 테이블의 나머지 레코드도 가지고 있다는 특징이 있다.
외부 조인의 사용
select
컬럼리스트
from 테이블A
(left|right) outer join 테이블B
on 테이블A.컬럼 = 테이블B.컬럼;
외부 조인은 위의 문법으로 작성한다.
💡내부 조인과 외부 조인의 차이
고객, 판매 테이블
SELECT * FROM tblCustomer; --3명 > 5명
SELECT * FROM tblSales; --9건
insert INTO tblCustomer VALUES (4, '호호호', '010-1234-1234', '서울시');
insert INTO tblCustomer VALUES (5, '이순신', '010-1234-1234', '서울시');
고객 테이블에 '호호호', '이순신' 회원을 추가하였다.
내부 조인
SELECT
*
FROM tblCustomer c
INNER JOIN tblsales s
ON c.seq = s.cseq;
내부 조인을 하자 결과가 9건의 결과가 출력된다.
이를 업무상으로 표현하면 물건을 한 번이라도 구매한 이력이 있는 고객의 정보의 그 고객이 사간 구매 내역을 가져오시오라는 의미이다.
여기서 핵심은 '물건을 한 번이라도 구매'했다는 점이다. 이게 내부 조인을 의미한다.
새로 생성한 '호호호', '이순신'데이터를 출력하지 않는데, 이 둘이 없는 이유는 지금 막 가입을 해서 판매 테이블에 고객 번호가 저장이 되지 않았기 때문이다.
내부 조인을 사용할 경우 부모 테이블과 자식 테이블에 동시에 존재해야 출력이 된다.
외부 조인
left 조인
SELECT
*
FROM tblCustomer c
left outer JOIN tblsales s
ON c.seq = s.cseq; --11
외부 조인은 기본적으로 내부 조인을 포함하며, 물건 구매 이력이 없는 2명도 출력한다.
외부 조인을 실행하면 방향을 확인한다. 이때 left이므로 tblCustomer에서 데이터를 찾아서 '호호호'와 '이순신'을 출력한다.
right 조인
SELECT
*
FROM tblCustomer c
RIGHT outer JOIN tblsales s
ON c.seq = s.cseq; --9 (내부 조인과 동일한 결과)
방향이 right일 때, '호호호'와 '이순신' 데이터가 없는 이유는 tblsales에서 포함 안 된 데이터를 찾기 때문이다.
이처럼 외부 조인은 부모 테이블을 가리킬 때와 자식 테이블을 가리킬 때의 결과에 차이가 있다.