지난 글에서는 Join에 대하여 배웠다. Join의 디폴트는 Inner Join이다.
즉 on에 붙어있는 조건에 해당해야만 새로운 데이터로 추출하는 형식이다.
만약 다음과 같은 코드가 있다 하자.
select a.category_name, b.product_id, b.product_name, c.company_name
from categories a
join products b on a.category_id = b.category_id
join suppliers c on b.supplier_id = c.supplier_id
where a.category_name = 'Beverages'
다음은 categories 테이블의 category_id와 products 테이블의 category_id, 그리고 products 테이블의 supplier_id와가 같아야만 데이터로 추출이 된다.
조건에 상관없이 어느 한 쪽의 테이블의 모든 값이 출력된다면, 조건에 해당하지 않는 다른 쪽 테이블의 값은 NULL로 대체된다.
--예시 코드
SELECT * FROM A
LEFT OUTER JOIN B
ON A.id = B.id
다음과 같은 EDR이 있다 하자.
주문이 단 한번도 없는 고객 정보를 구해보자. 다양한 여러 방법이 있겠지만 Outer Join을 사용하면 간단하다.
-- 주문이 단 한번도 없는 고객 정보 구하기.
select a.customer_id, a.contact_name, b.order_id, b.customer_id
from customers a
left outer join orders b on a.customer_id = b.customer_id
where b.order_id is null;
customers 테이블을 left로, orders 테이블을 right로 한 후, left join을 하면 주문을 하지 않은 고객에 대한 order_id는 null으로 설정될 것이다. 그래서 where에 is null을 사용하면 주문을 하지 않은 고객의 정보를 얻을 수 있을 것이다.
출력 결과
select a.contact_name, coalesce(b.order_id, 1), c.last_name || ' ' || c.first_name, d.company_name
from customers a
left join orders b on a.customer_id = b.customer_id
left join employees c on b.employee_id = c.employee_id
left join shippers d on b.ship_via = d.shipper_id
where a.city = 'Madrid'
outer join을 할 때 join 집합이 여러 개면 모든 join에 outer을 붙여줘야 한다.
두 개의 파라미터를 받는데, 첫 번째 컬럼이 NULL이 아니라면 해당 컬럼 값을 그대로 출력, 만약 NULL이라면 두 번째 value로 출력하는 것이다.