LabHub

SQL 실전 · 조인 · 실습

조인으로 흩어진 데이터 잇기

LabHub 에서 이어서 보기

목표

내부 조인, 왼쪽 외부 조인, 안티 조인, 자기 조인을 상황에 맞게 골라 쓰고, ON 절과 WHERE 절의 차이를 설명할 수 있게 됩니다.

왜 중요한가

조인에서 결정해야 할 것은 사실 하나뿐입니다. 짝이 없는 행을 남길 것인가 버릴 것인가. 이 결정을 명확히 하지 않으면 리포트 숫자가 조용히 틀립니다.

특히 위험한 지점은 왼쪽 외부 조인 뒤의 WHERE 절입니다. 오른쪽 테이블의 컬럼에 조건을 걸면, 짝이 없어 NULL 이 채워진 행들이 그 조건에서 미지가 되어 통째로 사라집니다. 즉 외부 조인을 썼는데 결과는 내부 조인이 되는 것입니다. 오류도 경고도 없이 조용히 일어나므로, 이 실습에서 두 경우를 나란히 만들어 행 수를 세어 보는 경험이 중요합니다.

또 하나는 팬아웃입니다. 주문 하나에 상세가 셋이면 조인 결과는 세 행이 되고, 그 위에서 주문 금액을 합하면 세 배가 됩니다. 조인이 행 수를 바꾼다는 사실을 늘 의식해야 합니다.

단계

1. 주문과 고객을 이어 order_id, customer_name, total_amount 를 담는 뷰 v_order_customer 를 만듭니다.
2. 모든 고객과 그 고객의 주문 건수를 담는 뷰 v_customer_orders 를 만듭니다. 컬럼은 id, name, order_count 이며 주문이 없는 고객은 0 이어야 하고 고객 수는 400명 그대로여야 합니다.
3. 한 번도 주문하지 않은 고객의 id, name 을 담는 뷰 v_never_ordered 를 만듭니다.
4. 주문 상세와 상품을 이어 order_id, product_name, quantity, unit_price 를 담는 뷰 v_item_detail 을 만듭니다.
5. countryKR 인 고객의 statuspaid 인 주문의 상세를 담는 뷰 v_kr_paid_items 를 만듭니다. 컬럼은 order_id, product_id 로 시작해야 합니다.
6. 모든 고객과 그 고객의 결제 완료 주문 건수를 담는 뷰 v_left_paid 를 만듭니다. 컬럼은 id, paid_count 이며 고객 수는 400명 그대로여야 합니다.
7. 같은 도시에 사는 tiervip 인 고객 쌍을 담는 뷰 v_vip_pairs 를 만듭니다. 컬럼은 a_id, b_id, city 이며 같은 쌍이 두 번 나오면 안 됩니다.
8. statuspaid, shipped, delivered 중 하나인데 완료된 결제가 없는 주문을 담는 뷰 v_unpaid_orders 를 만듭니다.

참고

단계 8개

  1. 주문에 고객 이름 붙이기
  2. 주문 없는 고객까지 남기기
  3. 한 번도 주문하지 않은 고객 찾기
  4. 세 테이블 잇기
  5. 조인 결과에 조건 걸기
  6. ON 절과 WHERE 절의 차이 확인하기
  7. 같은 테이블을 자기 자신과 잇기
  8. 결제가 확인되지 않은 주문 찾기