개주 훈련일지/📚 코살대 교본 학습

SQL) JOIN

lshfood2 2026. 1. 20. 21:08

[ 조인 ]

2개 이상의 테이블을 연결 또는 결합하여

데이터를 출력하는 것을 조인(Join)이라고 하며

일반적으로 사용되는 SQL문의 상당수가

조인으로 이루어져 있다.

 

일반적인 경우 기본키와 외래키의

값 연관에 의해 조인이 이루어지며

 

기본키, 외래키 관계와는 별도로

일반 칼럼끼리 조인이 이루어지기도 한다.

 

  • INNER JOIN
    양쪽 테이블에 매칭되는 데이터만 나온다.
  • LEFT JOIN
    왼쪽 테이블은 전부 유지,
    오른쪽은 있으면 붙고 없으면 NULL로 나온다.

 

[ 2개 테이블 조인 ]

1) 회원 + 주문 (INNER JOIN)

'누가 언제 얼마를 주문했는지' 같이 

연관된 데이터만 가져오고 싶을 때.

/* 
[목표]
- member(회원)과 orders(주문)을 member_id로 연결
- 주문이 있는 회원의 주문 정보만 조회 (INNER JOIN)

[포인트]
- JOIN 조건은 ON에 작성한다.
- INNER JOIN은 매칭되는 행만 나온다.
*/

SELECT
  m.member_id,      -- 회원 PK
  m.name,           -- 회원 이름
  o.order_id,       -- 주문 PK
  o.order_dt,       -- 주문일
  o.total_amount    -- 주문 총액
FROM member m
JOIN orders o
  ON o.member_id = m.member_id     -- 주문의 member_id가 회원의 member_id와 같을 때 연결
WHERE o.order_dt >= '2026-01-01'   -- 기간 필터: 2026-01-01 이후 주문만
ORDER BY o.order_dt DESC;          -- 최신 주문부터

 

2) 회원은 다 보여주고, 주문은 있으면 붙이기 (LEFT JOIN)

'전체 회원 목록 + 주문 여부'처럼

주문 없는 회원도 포함해야 할 때.

/*
[목표]
- 회원은 전부 조회하고, 주문은 있는 경우에만 붙인다 (LEFT JOIN)

[포인트]
- LEFT JOIN은 왼쪽 테이블(member)을 기준으로 "무조건 유지"
- 주문이 없는 회원은 orders 컬럼들이 NULL로 나온다
*/

SELECT
  m.member_id,
  m.name,
  o.order_id,       -- 주문이 없으면 NULL
  o.order_dt        -- 주문이 없으면 NULL
FROM member m
LEFT JOIN orders o
  ON o.member_id = m.member_id
ORDER BY m.member_id;

[ 3개 테이블 조인 ]

회원 + 주문 + 주문상세 (라인 단위 조회)

주문 1건에는 상품이 여러 개 들어가므로,

order_detail까지 붙이면 “주문 라인” 단위로 행이 늘어난다.

/*
[목표]
- 회원(member) → 주문(orders) → 주문상세(order_detail)까지 연결
- 어떤 회원이 어떤 주문에서 어떤 상품을 몇 개/얼마에 샀는지 (라인 단위)

[관계]
member 1 : N orders
orders 1 : N order_detail

[포인트]
- order_detail을 붙이면 "주문 1건이 여러 행으로 늘어날 수 있음"
*/

SELECT
  m.member_id,
  m.name,
  o.order_id,
  o.order_dt,
  od.product_id,                         -- 주문 라인의 상품 ID
  od.qty,                                -- 주문 수량
  od.unit_price,                         -- 단가
  (od.qty * od.unit_price) AS line_amount -- 라인 금액(수량*단가)
FROM member m
JOIN orders o
  ON o.member_id = m.member_id
JOIN order_detail od
  ON od.order_id = o.order_id            -- 주문 PK로 주문상세 연결
WHERE o.order_dt >= '2026-01-01'
ORDER BY o.order_id DESC, od.product_id;

[ 4개 테이블 조인 ]

회원 + 주문 + 주문상세 + 상품 (상품명까지)

product_id만 있으면 사람이 보기 불편하니까, 

상품 테이블을 붙여서 상품명까지 완성한다.

/*
[목표]
- 회원 → 주문 → 주문상세 → 상품까지 연결
- 결과를 사람이 읽기 좋게 "상품명" 포함해서 출력

[관계]
order_detail.product_id → product.product_id

[포인트]
- 4개 조인은 "라인 데이터 + 부가 정보(상품명)"를 풍부하게 만들 때 많이 씀
*/

SELECT
  m.member_id,
  m.name,
  o.order_id,
  o.order_dt,
  p.product_id,
  p.product_name,                        -- 상품명
  od.qty,
  od.unit_price,
  (od.qty * od.unit_price) AS line_amount
FROM member m
JOIN orders o
  ON o.member_id = m.member_id
JOIN order_detail od
  ON od.order_id = o.order_id
JOIN product p
  ON p.product_id = od.product_id        -- 상품ID로 상품 테이블 연결
WHERE o.order_dt >= '2026-01-01'
ORDER BY o.order_id DESC, p.product_name;

'개주 훈련일지 > 📚 코살대 교본 학습' 카테고리의 다른 글

SQL) 표준 조인  (0) 2026.01.24
동적 모델링  (1) 2026.01.21
SQL) ORDER BY절  (0) 2026.01.17
정적 모델링  (0) 2026.01.17
UML (Unified Modeling Language)  (0) 2026.01.15