본문 바로가기
C.W.K.
Stream
Lesson 10 of 16 · published

INNER JOIN으로 테이블 잇기

~14 min · queries, joins

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

관계를 결과로 펼쳐

INNER JOIN은 양쪽 테이블에서 조건이 맞는 행만 남겨. 관계는 ON에 적고 보통 foreign_key = primary_key 모양이야. 주문에 사용자 이름을 붙이거나 주문 항목에 상품 정보를 붙일 때 사용해.

연결 조건과 결과 필터를 구분해

ON o.user_id = u.id AND o.status = 'paid'처럼 관계에 필요한 조건은 ON에 둘 수 있어. 결과 전체를 거르는 조건은 WHERE에 두면 의도가 더 분명해. 별칭 u, o, li, p를 일관되게 쓰고 열 이름을 한정해 모호함을 없애.

색인이 JOIN의 비용을 좌우해

기본 키 쪽은 이미 색인이 있지만 외래 키 쪽은 직접 만들어야 할 수 있어. 예를 들어 order_items.product_id로 자주 잇는다면 해당 열의 색인을 확인해. 테이블 4개를 잇더라도 관계와 색인이 분명하면 질의는 읽을 수 있는 문장으로 남아.

Code

두 테이블 INNER JOIN·sql
SELECT u.name, o.id AS order_id, o.total, o.placed_at
FROM   users u
INNER JOIN orders o ON o.user_id = u.id
WHERE  o.placed_at >= now() - INTERVAL '30 days'
ORDER  BY o.placed_at DESC;
여러 테이블을 잇는 JOIN·sql
SELECT u.name, o.id AS order_id, p.title, li.quantity, li.unit_price
FROM   users u
INNER JOIN orders     o  ON o.user_id   = u.id
INNER JOIN line_items li ON li.order_id = o.id
INNER JOIN products   p  ON p.id        = li.product_id
ORDER  BY o.placed_at DESC, li.id;
INNER JOIN을 USING으로·sql
-- USING (col) 이 양 테이블에 같은 이름 컬럼 요구
-- + SELECT 에 어느 테이블 컬럼 나오는지 모호함 회피.
SELECT u.name, o.id AS order_id
FROM   users u
INNER JOIN orders o USING (user_id);  -- 둘 다 user_id 있어야 동작

External links

Exercise

users, orders, order_items, products의 네 테이블을 JOIN해. 지난달 주문만 남기고 total 내림차순으로 정렬한 뒤 사용자 이름, 상품 이름, 주문 항목 합계를 반환해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.