

Left Join을 자주 사용!

SELECT a.customer_id, a.contact_name, b.order_id, b.customer_id
FROM nw.customers a
LEFT JOIN nw.orders b ON a.customer_id = b.customer_id
WHERE b.customer_id IS NULL;

SELECT a.*, b.empno, b.ename
FROM hr.dept a
LEFT JOIN hr.emp b ON a.deptno = b.deptno
ORDER BY 1;

SELECT a.customer_id, a.contact_name, COALESCE(b.order_id,0) AS order_id, b.order_date, c.first_name||' '||c.last_name AS employee_name,
d.company_name
FROM nw.customers a
LEFT JOIN nw.orders b ON a.customer_id = b.customer_id
LEFT JOIN nw.employees c ON b.employee_id = c.employee_id
LEFT JOIN nw.shippers d ON b.ship_via = d.shipper_id
WHERE a.city = 'Madrid';
주의! 3~4개 Table join시 left join 계속 해줘야 함!! Join 하면서 Null 값이 포함된 데이터를 left join으로 계속 유지해줘야 한다.

orders_items에 주문번호(order_id)가 없는 order_id를 가진 orders 데이터 찾기.SELECT *
FROM nw.orders a
LEFT JOIN nw.order_items b ON a.order_id = b.order_id
WHERE b.order_id IS NULL;
orders 테이블에 없는 order_id가 있는 order_items 데이터 찾기.SELECT *
FROM nw.order_items a
LEFT JOIN nw.orders b ON a.order_id = b.ORDER_id
WHERE b.order_id IS NULL;
dept 테이블은 소속 직원이 없는 경우가 존재한다. 하지만 직원은 소속 부서가 없는 경우가 없다.SELECT a.*, b.empno, b.ename
FROM hr.dept a
LEFT JOIN hr.emp b ON a.deptno = b.deptno;

full outer join 테스트를 위해 소속 부서가 없는 테스트용 데이터 생성.
DROP TABLE IF EXISTS hr.emp_test;
CREATE TABLE hr.emp_test AS
SELECT * FROM hr.emp;
SELECT * FROM hr.emp_test;
empno 7934의 소속 부서를 Null로 update
UPDATE hr.emp_test SET deptno = NULL WHERE empno = 7934;
SELECT * FROM hr.emp_test;

full outer join 하여 양 쪽 모두의 집합이 누락되지 않도록 함.
SELECT a.*, b.empno, b.ename
FROM hr.dept a
FULL OUTER JOIN hr.emp_test b ON a.deptno = b.deptno
ORDER BY 1;
