본문 바로가기

카테고리 없음

MySQL join, left join

보통 게시판의 게시글 하나에는 여러개의 댓글이 달린다.
이런 것 처럼 마스터에 달린 디테일의 갯수를 쿼리로 알아보는 예제로, inner join(equi join)과 left join을 알아보자.

1. 먼저 마스터 테이블을 생성한다.


2. 디테일 테이블을 생성한다.

3. 마스터 테이블과 디테일 테이블은 masterId 컬럼으로 서로 엮어져있다. 즉, 디테일 테이블의 masterId 컬럼은
   마스터 테이블의
masterId컬럼을 참조하는 형태이기 때문에 외래키 제약조건을 추가해준다.


4. 그리고 마스터 테이블에 값을 다음과 같이 넣어줬다.


5. 디테일 테이블 또한 값을 넣어줬다. 이때, masterID가 5인 것에는 detailId가 없도록 예외를 뒀다.
( 즉, masterId가 5인 것에는 달린 디테일이 없는 상태이다.)


6. 이 상태에서 두 테이블을 masterId가 같은 것을 조건으로 일반적인 join을 걸면 쿼리는 아래와 같이 될테고,


결과는 아래와 같다.
두 테이블의 masterId가 같은 것들만 join의 대상이 된다. 따라서 현재 디테일 테이블에는 masterId가 5인 것은 없기 때문에 쿼리 결과 테이블에서 아예 5에 해당하는 것이 없는 것을 확인할 수 있다.
근데 내가 원했던 건 이게 아니라 masterId에 달린 디테일이 없으면 일단 5도 나오고 count(detailID)가 0으로 나오고 싶었던 것이다. 즉, 위 쿼리에서 join시 
왼쪽에 있는 마스터 테이블의 모든 행들이 join결과 테이블에 무조건 나오도록 보장이 되어야 하고 그에 달린 detailId가 없으면 null로 나와야했다.
이런 경우에 left join을 해주면 된다.
 


7. join을 left join으로 바꿨다.


8. 결과를 보면 masterID가 5인 것도 나오고 count(detailId) 가 0으로 출력되는 것을 확인할 수 있다.


즉 결론적으로 A join B 를 할 때,
A의 모든 행들이 결과 테이블에 나와야하는게 보장이 되어야한다면 left join,
B의 모든 행들이 결과 테이블에 나와야하는게 보장이 되어야한다면 right join을 하면된다.

참고로 여기 사이트 의 설명이 직관적이다.