INNER·LEFT·RIGHT JOIN으로 여러 테이블의 데이터를 합치는 방법.
JOIN으로 테이블 연결하기
관계형 데이터베이스는 데이터를 여러 테이블에 나눠 저장합니다. 사용자 정보는 users, 주문 정보는 orders 에 두는 식입니다. 흩어진 데이터를 다시 하나로 합치는 도구가 바로 JOIN 입니다.
학습 목표
INNER JOIN으로 양쪽에 모두 있는 데이터를 합칩니다.LEFT JOIN/RIGHT JOIN의 차이를 이해합니다.ON으로 연결 조건을, 별칭으로 쿼리를 간결하게 만듭니다.- 여러 테이블 조인과 셀프 조인을 작성합니다.
예제 테이블
users(id, name, city) 와 orders(id, user_id, amount, ordered_at) 가 있고, orders.user_id 가 users.id 를 참조한다고 가정합니다.
INNER JOIN — 양쪽 모두 있는 행
SELECT u.name, o.amount, o.ordered_at
FROM users AS u
INNER JOIN orders AS o
ON o.user_id = u.id;
ON 조건이 일치하는 행끼리 묶습니다. 주문이 하나도 없는 사용자나, 주인 없는 주문은 결과에서 빠집니다. AS u, AS o 처럼 별칭을 붙이면 열 출처를 짧게 표현할 수 있습니다.
💡 TIP — 두 테이블에 같은 이름의 열이 있으면 반드시
u.id,o.id처럼 테이블(별칭)을 붙여 구분해야 합니다. 그렇지 않으면 "ambiguous column" 오류가 납니다.
LEFT JOIN — 왼쪽은 모두 남기기
SELECT u.name, o.amount
FROM users AS u
LEFT JOIN orders AS o
ON o.user_id = u.id;
왼쪽(users)의 모든 행을 남기고, 짝이 없으면 오른쪽 열은 NULL 로 채웁니다. "주문한 적 없는 사용자"를 찾을 때 유용합니다.
-- 주문 이력이 없는 사용자
SELECT u.name
FROM users AS u
LEFT JOIN orders AS o ON o.user_id = u.id
WHERE o.id IS NULL;
RIGHT JOIN
RIGHT JOIN 은 반대로 오른쪽 테이블을 모두 남깁니다. A RIGHT JOIN B 는 B LEFT JOIN A 와 같으므로, 실무에서는 가독성을 위해 보통 LEFT JOIN 으로 통일합니다.
| JOIN 종류 | 남는 행 |
|---|---|
INNER JOIN | 양쪽 모두 일치하는 행 |
LEFT JOIN | 왼쪽 전부 + 일치하는 오른쪽 |
RIGHT JOIN | 오른쪽 전부 + 일치하는 왼쪽 |
여러 테이블 조인
orders 에 product_id 가 있고 products(id, name) 테이블이 있다면 세 테이블을 연결할 수 있습니다.
SELECT u.name AS 고객, p.name AS 상품, o.amount
FROM orders AS o
INNER JOIN users AS u ON u.id = o.user_id
INNER JOIN products AS p ON p.id = o.product_id
WHERE o.amount >= 10000;
조인은 위에서 아래로 차례로 묶어 나가며, WHERE 로 최종 결과를 거릅니다.
셀프 조인 — 같은 테이블끼리
users 에 추천인 컬럼 referrer_id 가 있어 같은 테이블의 다른 행을 가리킬 때, 테이블을 자기 자신과 조인합니다.
SELECT child.name AS 가입자, parent.name AS 추천인
FROM users AS child
LEFT JOIN users AS parent
ON parent.id = child.referrer_id;
같은 테이블을 두 개의 다른 별칭(child, parent)으로 다뤄 마치 별개 테이블처럼 연결합니다.
⚠️ 주의 —
LEFT JOIN후 오른쪽 테이블 조건을WHERE에 넣으면, NULL 행이 걸러져 사실상INNER JOIN이 됩니다. 오른쪽 필터는ON절에 두어야 LEFT JOIN의 의미가 유지됩니다.
요약
INNER JOIN은 양쪽에 짝이 있는 행만,LEFT JOIN은 왼쪽을 모두 남깁니다.ON으로 연결 조건을 지정하고, 별칭으로 쿼리를 간결하게 만듭니다.- 짝이 없는 행 찾기는
LEFT JOIN ... WHERE 오른쪽.키 IS NULL패턴을 씁니다. - 세 개 이상 테이블도
JOIN을 이어 붙여 연결합니다. - 같은 테이블을 다른 별칭으로 묶으면 셀프 조인이 됩니다.
연습문제
- 모든 사용자와 그들의 주문 금액을, 주문이 없으면 NULL로 함께 보여 주세요.
- 한 번도 주문하지 않은 사용자의 이름만 조회하세요.
- 고객 이름, 상품 이름, 주문 금액을 한 줄로 보여 주세요(세 테이블 조인).
- 각 사용자와 그 추천인의 이름을 함께 출력하세요(셀프 조인).
힌트 — 1번은
LEFT JOIN, 2번은WHERE o.id IS NULL, 3번은 두 번의INNER JOIN, 4번은 같은 테이블을 두 별칭으로 조인합니다.
💡 연습문제 풀이
불러오는 중…
댓글 0
“MySQL” 강좌에 대한 댓글입니다.