SQL Fundamental3 (Join의 종류)

한지훈·2023년 7월 1일
0

SQL

목록 보기
4/9

지난 글에서는 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와가 같아야만 데이터로 추출이 된다.

Outer Join

  • LEFT OUTER JOIN: 왼쪽 테이블의 모든 값이 출력되는 조인
  • RIGHT OUTER JOIN: 오른쪽 테이블의 모든 값이 출력되는 조인
  • FULL OUTER JOIN: 왼쪽 또는 오른쪽 테이블의 모든 값이 출력되는 조인

조건에 상관없이 어느 한 쪽의 테이블의 모든 값이 출력된다면, 조건에 해당하지 않는 다른 쪽 테이블의 값은 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을 사용하면 주문을 하지 않은 고객의 정보를 얻을 수 있을 것이다.

출력 결과

-- Madrid에 살고 있는 고객이 주문한 주문 정보를 구할것.고객명, 주문id, 주문일자, 주문접수 직원명, 배송업체명을 구하되, 만일 고객이 주문을 한번도 하지 않은 경우라도 고객정보는 빠지면 안됨. 이경우 주문 정보가 없으면 주문id를 0으로 나머지는 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을 붙여줘야 한다.

Coalesce란?

두 개의 파라미터를 받는데, 첫 번째 컬럼이 NULL이 아니라면 해당 컬럼 값을 그대로 출력, 만약 NULL이라면 두 번째 value로 출력하는 것이다.

인프런 강의

profile
노력하는 개발자

0개의 댓글