[Database] MySQL에서 자주 사용하는 JOIN 정리

Mubby·2022년 3월 4일

데이타베이스(4xx)

목록 보기
2/3
post-thumbnail

어느 화창한 오후 개발실, 신입 개발자 한 분이 질문을 던졌다.

"쪼무래기 개발자님! INNER JOIN을 했는데 로우 개수가 늘어났어요..
INNER JOIN은 데이터의 교집합, 그러니까 조건에 공통으로 만족하는 애들만 뽑혀나오기 때문에 기준 테이블들보다 작거나 같게 나와야될 것 같은데 왜 이렇게 나오는지 모르겠어요." 대충 이런 질문이었다.

황당하다. INNER JOIN을 했는데 로우가 늘어났다니..

"에이 어떻게 그래요~ 뭘 잘못했겠죠!" 라고 말한 뒤 쿼리랑 실행 결과를 봤는데 정말 행의 개수가 늘어났다.
눈을 씻고 찾아봐도 당장 문제점을 찾지 못한 나는 "왜 이러지.. 이럴리가 없는데.. 한번 봐 볼게요." 라는 자신감 없는 말을 남기고 자리로 돌아와 쿼리를 뜯어보았다.

문제의 쿼리 예시:

SELECT *
FROM tb1
INNER JOIN tb2
ON tb1.ID = tb2.ID
WHERE tb1.ID = '01'
;

tb1 로우는 10개 그리고 tb2의 로우는 5개, 그런데 왜 INNER JOIN을 하면 50개가 나오지?

하.. 컬럼명에 속았다. tb2의 ID 컬럼이 PK가 아니었던 것! 조인 조건의 가장 기본적인 부분을 놓치고 있었다.
이런 것도 바로바로 못 찾다니.. 난 언제쯤 쪼무래기 개발자 타이틀을 벗어날 수 있을까..?

이번 일을 반성하며 JOIN에 대해 다시 한번 정리하고 넘어가려 한다.


JOIN 이란?

데이터 처리를 위하여 테이블들의 공통 칼럼(기본키, 외래키 등)을 통해 테이블을 결합해 하나의 열로 표한한 것입니다.

MySQL JOIN 종류

MySQL JOIN 문은 크게 INNER JOIN과 OUTER JOIN(LEFT JOIN, RIGHT JOIN) 두 가지의 형태로 나누어집니다.

자주 쓰이는 JOIN 정리

SELECT *
FROM A
'INNER or LEFT or RIGHT' JOIN B
ON A.KEY = B.KEY
  1. INNER JOIN
    • A KEY 값과 B KEY 값이 같은 로우의 데이터를 리턴
    • MySQL에서는 JOIN, INNER JOIN, CROSS JOIN이 모두 같은 의미로 사용됩니다.
  2. LEFT JOIN
    • A 데이터 전체와, A의 KEY 값과 B KEY 값이 같은 로우의 데이터를 리턴
    • ON 절의 조건을 만족하지 않는 경우에도 A 테이블의 데이터는 모두 가져오지만, 조건을 만족하지 않는 B 테이블의 데이터 값은 모두 NULL로 표시됩니다.
    • RIGHT JOIN은 LEFT JOIN 거꾸로 (미분은 적분 거꾸로)
  3. UNION (JOIN은 아니지만 종종 쓰이니 끼워 넣어 보자)
    • 여러 개의 SELECT 문의 결과를 하나의 테이블로 표현할 때 사용합니다. (각각의 SELECT 문으로 선택된 컬럼은 개수와 타입 그리고 순서 또한 모두 같아야한다.)
    • DISTINCT를 따로 명시하지 않아도 기본적으로 중복 데이터를 제거합니다
      <-> UNION ALL (중복 데이터 모두 출력)

알쓸신잡

  • JOIN 에서 ON 절을 쓰는 것과 조인 이후 WHERE 절을 썼을 때의 차이첨은 무엇일까?

    ON 절에서는 WHERE 절에서 사용할 수 있는 모든 조건을 사용할 수 있고, 같은 결과 값을 만들 수 있다. 그러나 조건을 ON 절에 작성하면 조인과 함께 조건에 맞는 데이터만 뽑혀 나오지만, WHERE 절의 경우 전체 데이터를 가져온 후 조건에 맞는 데이터를 뽑는다.
    따라서 후자의 경우 불필요한 데이터에 의해 성능 저하를 유발할 수 있다.

  • 일반적으로 INNER JOIN 이 OUTER JOIN 보다 많이 사용된다.

0개의 댓글