
어느 화창한 오후 개발실, 신입 개발자 한 분이 질문을 던졌다.
"쪼무래기 개발자님! 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에 대해 다시 한번 정리하고 넘어가려 한다.
데이터 처리를 위하여 테이블들의 공통 칼럼(기본키, 외래키 등)을 통해 테이블을 결합해 하나의 열로 표한한 것입니다.
MySQL JOIN 문은 크게 INNER JOIN과 OUTER JOIN(LEFT JOIN, RIGHT JOIN) 두 가지의 형태로 나누어집니다.
SELECT *
FROM A
'INNER or LEFT or RIGHT' JOIN B
ON A.KEY = B.KEY
JOIN 에서 ON 절을 쓰는 것과 조인 이후 WHERE 절을 썼을 때의 차이첨은 무엇일까?
ON 절에서는 WHERE 절에서 사용할 수 있는 모든 조건을 사용할 수 있고, 같은 결과 값을 만들 수 있다. 그러나 조건을 ON 절에 작성하면 조인과 함께 조건에 맞는 데이터만 뽑혀 나오지만, WHERE 절의 경우 전체 데이터를 가져온 후 조건에 맞는 데이터를 뽑는다.
따라서 후자의 경우 불필요한 데이터에 의해 성능 저하를 유발할 수 있다.
일반적으로 INNER JOIN 이 OUTER JOIN 보다 많이 사용된다.