dev.syw

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_idusers.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 BB LEFT JOIN A 와 같으므로, 실무에서는 가독성을 위해 보통 LEFT JOIN 으로 통일합니다.

JOIN 종류남는 행
INNER JOIN양쪽 모두 일치하는 행
LEFT JOIN왼쪽 전부 + 일치하는 오른쪽
RIGHT JOIN오른쪽 전부 + 일치하는 왼쪽

여러 테이블 조인

ordersproduct_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 을 이어 붙여 연결합니다.
  • 같은 테이블을 다른 별칭으로 묶으면 셀프 조인이 됩니다.

연습문제

  1. 모든 사용자와 그들의 주문 금액을, 주문이 없으면 NULL로 함께 보여 주세요.
  2. 한 번도 주문하지 않은 사용자의 이름만 조회하세요.
  3. 고객 이름, 상품 이름, 주문 금액을 한 줄로 보여 주세요(세 테이블 조인).
  4. 각 사용자와 그 추천인의 이름을 함께 출력하세요(셀프 조인).

힌트 — 1번은 LEFT JOIN, 2번은 WHERE o.id IS NULL, 3번은 두 번의 INNER JOIN, 4번은 같은 테이블을 두 별칭으로 조인합니다.

💡 연습문제 풀이

불러오는 중…

함께 보면 좋은 자료

댓글 0

MySQL” 강좌에 대한 댓글입니다.

댓글을 작성하려면 로그인이 필요합니다.