일대다/다대일 관계에서 어느 쪽을 기준으로 조인하느냐에 따라 결과 행의 개수가 달라진다.

이 현상을 잘 이해해야 GROUP BYCOUNT 같은 집계 쿼리를 정확하게 작성할 수 있다.

5-1. 다대일(N:1) 조인 – 데이터 뻥튀기 없음

먼저 기준이 되는 member 테이블을 그대로 조회해 보자.

SELECT * FROM member;

예상 결과:

member_id team_id name
1 1 김개발
2 1 박개발
3 2 최디자인
4 NULL 이기획

이제 각 회원에 팀 이름을 붙여서 조회한다. 팀이 없는 회원도 보고 싶으므로 LEFT JOIN 을 사용한다.

SELECT
  m.name AS member_name,
  t.name AS team_name
FROM member m
LEFT JOIN team t ON m.team_id = t.team_id;

예상 결과:

member_name team_name
김개발 개발팀
박개발 개발팀
최디자인 디자인팀
이기획 NULL

N쪽 기준으로 1쪽을 조인하면 행 수가 늘어나지 않는다. 각 회원은 최대 하나의 팀만 가지기 때문이다.

5-2. 일대다(1:N) 조인 – 데이터 뻥튀기 발생

이번에는 기준을 바꿔 team 테이블에서 시작한다.

SELECT * FROM team;

예상 결과: