우선 MySQL의 JOIN
구문이라는 것을 주의하기 바란다
이번에 제대로 JOIN 사용 방법을 익혀서, 의도한 자료만 뽑아오기 위해 준비해봤다.
JOIN
, 테이블이 조금 늘어나기만 해도 JOIN
을 금세 찾게 된다.
간단히 JOIN
은 어떤 컬럼의 내용을 공유하는 테이블끼리, 해당 컬럼을 기준으로 테이블을 이어붙여주는 작업이다. 다음과 같이 수영장 고객 테이블과 방문 기록 테이블이 있다고 생각해 보자.
-> 수영장 고객 테이블
ID | 이름 | 성별 | 전화번호 | 등록일 |
---|---|---|---|---|
1 | Alice | 여 | XX-XXX-XXXX | 2022-09-19 |
2 | Bob | 남 | OO-OOO-OOOO | 2022-09-19 |
3 | Charlie | 남 | ㅁㅁ-ㅁㅁㅁ-ㅁㅁㅁㅁ | 2022-09-20 |
-> 방문 기록 테이블
ID | 고객ID | 방문날짜 |
---|---|---|
1 | 1 | 2022-10-19 |
2 | 3 | 2022-10-19 |
3 | 2 | 2022-10-20 |
4 | 3 | 2022-10-20 |
이 두 테이블을 어떤 필요에 의해서 일치되는 수영장 고객 테이블의 고객 ID와 방문 기록 테이블의 고객 ID를 기준으로 횡으로 이어붙여보자.
-> JOIN 한 테이블
방문 ID | 방문날짜 | 고객 ID | 이름 | 성별 | 전화번호 | 등록일 |
---|---|---|---|---|---|---|
1 | 2022-10-19 | 1 | ALICE | 여 | XX-XXX-XXXX | 2022-09-19 |
2 | 2022-10-19 | 3 | Charlie | 남 | ㅁㅁ-ㅁㅁㅁ-ㅁㅁㅁㅁ | 2022-09-20 |
3 | 2022-10-20 | 2 | Bob | 남 | OO-OOO-OOOO | 2022-09-19 |
4 | 2022-10-20 | 3 | Charlie | 남 | ㅁㅁ-ㅁㅁㅁ-ㅁㅁㅁㅁ | 2022-09-20 |
위와 같은 테이블을 만드는 행위를 JOIN
이라고 한다.
-- MySQL JOIN 구문 사용방법
[LEFT or RIGHT or INNER] JOIN [테이블 명] ON [조건식]
사용하는 것은 위처럼 간단하다. 보통 JOIN 구문을 사용하기 이전에 다른 테이블 명이 오는 것이 일반적이다. 이외에는 서브쿼리로 만들어져 있는 테이블에 JOIN을 하는 방법 등도 있겠다.
JOIN
을 이용하여 나타나는 결과는 결코 간단하지 않다.
위에서 설명했던 예제랑 거의 비슷한데 내용은 살짝 다르다.
CUSTOMER
테이블은 고객 ID
, 이름
, 성별
,전화번호
, 등록일
, 마지막 방문
컬럼으로 구성되었다.
VISIT
테이블은 방문 기록 순번(ID)
, 고객 ID
, 방문 날짜
, 기록 수정 날짜
컬럼으로 구성되어있다.
현재 CUSTOMER
테이블에는 "JIN"이라는 이름을 갖고 있는 고객이 있는데, VISIT
테이블에는 해당 고객 ID
가 없는 것으로 보아 등록 이후 방문한 적이 없는 고객이 존재한다는 것을 알 수 있다.
INNER JOIN
은 구문 앞에 불려온 테이블과 이제 참조할 테이블을ON
에 지정한 조건에 맞는 레코드만 찾아 컬럼을 이어 붙여 반환하는 테이블 연산이다.
사용할 때에 주의할 점은 모든 조건이 만족하는 레코드만 반환한다는 점이다.
만약 두 테이블 중 어느 한 쪽이라도 조건이 안 맞는 레코드가 있다면 해당 레코드는 버려진다.
다음의 예시를 살펴보겠다.
"JIN"은 CUSTOMER
테이블에 존재하지만 JOIN
이후 사라져버렸다. 이는 VISIT
테이블에 해당 고객의 정보가 아예 없기 때문이다.
LEFT JOIN
은 구문 앞에 불려온 원본 테이블은 그대로 두고, 참조할 테이블의 레코드를 ON
에 지정한 조건에 맞게 원본 테이블에 있는 레코드를 찾아 컬럼을 이어 붙이는 테이블 연산이다.
사용할 때에 주의할 점은 원본 테이블의 레코드는 그대로 존재한다는 것이다. 그래서 조건에 안 맞는 레코드에 억지로 컬럼을 이어 붙이면서 NULL
값이 들어가 있는 것을 확인할 수 있다.
참조할 테이블의 레코드는 조건이 맞지 않는 다면 다 버려진다.
다음의 예시를 살펴보겠다.
확인해보면, 원본 테이블의 JIN
이 살아있는 것을 확인할 수 있다. 대신 억지로 붙인 컬럼에는 NULL
값이 들어가 있는 것을 확인할 수 있다.
RIGHT JOIN
은 참조하는 테이블을 그대로 두고, 원본 테이블의 레코드를 ON
에 지정한 조건에 맞게 참조 테이블에 있는 레코드를 찾아 컬럼을 이어 붙이는 테이블 연산이다.
LEFT JOIN
과 완전히 반대다.
현재의 준비한 예시는 사실 RIGHT JOIN
을 제대로 보여줄 수 없는 예시다. 왜냐 하면 이어 붙일 테이블이 사실 원래 테이블의 CUTOMER_ID
를 참조하고 있기 때문이다. 애초에 참조하고 있는 ID값이 같은 것을 찾아 이어 붙이는 작업이기 때문에 INNER JOIN
과 결과가 다르지 않다.
JOIN
을 쓸 때 인지 해두면 좋을 팁들을 두 개 정리해 놓겠다.
사실 이렇게만 사용하면 JOIN
사용은 걱정할 문제가 없다. 1:1 관계나 1:N 관게까지도 JOIN
을 사용하면 결과가 예상되게 깔끔하게 사용 가능하다.
LEFT JOIN
을 기준으로 생각해보자.
- 원본 테이블의 첫 레코드부터 시작된다.
- 참조 테이블을 전체를 조회하면서 조건에 맞는 레코드를 찾는다.
2-1. 조건에 맞는 레코드를 찾았을 경우 원본 테이블의 레코드에 해당 레코드를 횡으로 이어 붙인다.
2-2. 또 조건에 맞는 게 생기면 마찬가지로 원본 테이블 레코드를 한 줄 더 추가하고 해당 레코드를 횡으로 이어 붙인다.
2-a. 조건이 맞는 경우가 아예 없다면, 원복 테이블 레코드에 참조 테이블 컬럼만NULL
을 넣어 이어 붙인다.- 참조테이블 전체를 조회했을 경우, 원본 테이블의 다음 레코드로 넘어간다.
INNER JOIN
을 기준으로 생각해보자
- 원본 테이블 첫 레코드부터 시작한다.
- 참조 테이블 전체를 조회하면서 조건에 맞는 레코드를 찾는다.
2-1. 현재 레코드와 조건이 일치하는 참조 테이블 레코드가 있다면 횡으로 이어 붙인다.
2-2. 또 위와 같은 상황이 있다면 레코드를 추가하여 해당 참조 테이블 레코드를 이어 붙인다.- 참조테이블 전체를 조회했을 경우, 원본 테이블의 다음 레코드로 넘어간다.
RIGHT JOIN
은 생략하겠다.
위의 원리만 기억하고 있다면, 본인이 작성한 SQL문의 어떤 결과를 만들지 예상을 할 수 있게 될 것이다.