아우터-조인은 조건에 만족하지 않은 데이터도 결과에 나온다.
- 기준 데이터 집합: 아우터-조인의 기준이 되는 집합
- 참조 데이터 집합: 아우터-조인의 참조가 되는 집합
'기준 데이터 집합'은 조인 조건을 만족하지 않아도 모두 결과에 포함된다.
아우터-조인을 사용하려면, 조인 조건 컬럼 한쪽에 '(+)' 표시를 추가하면 된다.
'기준 데이터 집합'과 '참조 데이터 집합'은 '(+)' 표시로 구분한다.
조인조건에 '(+)' 표시가 붙은 쪽은 '참조 데이터 집합', 없는 쪽은 '기준 데이터 집합'이다.
1. 이너조인
select t1.*, t2.*
from m_cus t1, t_itm_evl t2
where t1.cus_id = 'CUS_0002'
and t1.cus_id = t2.cus_id;
2. 아우터조인
select t1.cus_id, t1.cus_nm, t2.cus_id, t2.itm_id, t2.evl_lst_no
from m_cus t1, t_itm_evl t2
where t1.cus_id = 'CUS_0002' and
t1.cus_id = t2.cus_id(+);
M_CUS에는 'CUS_0002'의 데이터가 있지만 T_ITM_EVL에는 'CUS_0002'의 데이터가 없다.
이 상황에서, 이너조인은 아무 결과도 조회되지 않는다.
아우터 조인을 해야만 'CUS_0002' 고객의 정보가 조회된다.
3. 아우터조인의 필터조건
select t1.cus_id, t1.cus_nm, t2.cus_id, t2.itm_id, t2.evl_lst_no, t2.evl_dt
from m_cus t1, t_itm_evl t2
where t1.cus_id = 'CUS_0073'
and t1.cus_id = t2.cus_id(+)
and t2.evl_dt >= to_date('20170201', 'YYYYMMDD')
and t2.evl_dt < to_date('20170301', 'YYYYMMDD');
select t1.cus_id, t1.cus_nm, t2.cus_id, t2.itm_id, t2.evl_lst_no, t2.evl_dt
from m_cus t1, t_itm_evl t2
where t1.cus_id = 'CUS_0073'
and t1.cus_id = t2.cus_id(+)
and t2.evl_dt(+) >= to_date('20170201', 'YYYYMMDD')
and t2.evl_dt(+) < to_date('20170301', 'YYYYMMDD');
두 SQL 모두 아우터조인을 하고 있다.
첫번째 SQL은 조회되는 결과가 없다. 두번째만 결과가 나온다.
아우터 조인을 사용할 때는 참조 데이터 집합의 필터조건에 '(+)' 표시를 해주는 것이 일반적이다.
4. 아우터조인 응용
고객별 1월의 주문건수를 구하는 SQL. 주문이 없는 고객은 주문건수가 0으로 조회되어야 한다.
아래와 같이 아우터조인을 활용할 수 있다.
select t1.cus_id, count(*) ord_cnt_1, count(t2.ord_seq) ord_cnt2
from m_cus t1, t_ord t2
where t1.cus_id = t2.cus_id(+)
and t2.ord_dt(+) >= to_date('20170101', 'YYYYMMDD')
and t2.ord_dt(+) < to_date('20170201', 'YYYYMMDD')
group by t1.cus_id
order by count(*), t1.cus_id;
고객테이블을 기준집합으로 아우터조인 했기 때문에, 주문이 없는 고객도 모두 조회가 가능하다.