오늘은 JOIN사용법을 실습을 통해 배워보자.
여러 종류의 JOIN중 중요하고 많이 사용하는 것은 INNER JOIN과 LEFT JOIN(LEFT OUTER JOIN)이다.
설명을 위해 2개의 테이블을 사용한다.
동물 테이블
| 이름 | 종 | 나이 | 주인 이름 |
|---|---|---|---|
| 보리 | 강아지 | 2 | 민혁 |
| 뽀삐 | 강아지 | 4 | 민혁 |
| 유미 | 고양이 | 9 | 민혁 |
| 나비 | 고양이 | 2 | 은서 |
| 별이 | 강아지 | 7 | 소림 |
| 초롱 | 강아지 | 1 | 소림 |
| 달래 | 강아지 | 5 | 혜은 |
| 백구 | 강아지 | 8 | - |
주인 테이블
| 이름 | 전화번호 | 주소 |
|---|---|---|
| 민혁 | 010-xxxx-xxxx | 서울특별시 송파구 |
| 은서 | 010-xxxx-xxxx | 경기도 성남시 |
| 소림 | 010-xxxx-xxxx | 서울특별시 서초구 |
| 혜은 | 010-xxxx-xxxx | 서울특별시 강남구 |
먼저 INNER JOIN부터 알아보자.
동명이인이 없다고 가정하면 동물 테이블에는 주인이 존재하므로 동물 테이블과 주인 테이블을 결합할 수 있는 단서는 주인의 이름이다.
어떤 방식으로 결합될까? 주인 테이블의 행 각각을 동물 테이블의 주인과 일치하는 행 뒤에 이어 붙이면 된다.
| 이름 | 종 | 나이 | 주인 이름 | 이름 | 전화번호 | 주소 |
|---|---|---|---|---|---|---|
| 보리 | 강아지 | 2 | 민혁 | 민혁 | 010-xxxx-xxxx | 서울특별시 송파구 |
| 뽀삐 | 강아지 | 4 | 민혁 | 민혁 | 010-xxxx-xxxx | 서울특별시 송파구 |
| 유미 | 고양이 | 9 | 민혁 | 민혁 | 010-xxxx-xxxx | 서울특별시 송파구 |
| 나비 | 고양이 | 2 | 은서 | 은서 | 010-xxxx-xxxx | 경기도 성남시 |
| 별이 | 강아지 | 7 | 소림 | 소림 | 010-xxxx-xxxx | 서울특별시 서초구 |
| 초롱 | 강아지 | 1 | 소림 | 소림 | 010-xxxx-xxxx | 서울특별시 서초구 |
| 달래 | 강아지 | 5 | 혜은 | 혜은 | 010-xxxx-xxxx | 서울특별시 강남구 |
그런데 결과를 보니 백구가 사라진 것이 보인다.
INNER JOIN은 외래 키를 갖지 않은 행은 결과에서 제외하기 때문에 백구의 정보는 표시되지 않는다.
이렇게 테이블을 합치고 고양이의 이름과 주인 전화번호를 출력하는 쿼리를 만들어 보자.
SELECT a.name, o.phone_number
FROM animal_info AS a
INNER JOIN owner_info AS o
ON a.owner_name = o.name
WHERE a.species = 'dog';
결합된 테이블에는 같은 이름의 속성이 존재할 수가 있다.
두 테이블 모두에 name이라는 속성이 존재하기 때문에 특정 테이블의 속성임을 명시하지 않으면 모호함 때문에 오류가 발생한다.
다음으로 LEFT JOIN은 여기서 크게 다르지 않다.
거두절미하고 테이블의 결과는 다음과 같다.
| 이름 | 종 | 나이 | 주인 이름 | 이름 | 전화번호 | 주소 |
|---|---|---|---|---|---|---|
| 보리 | 강아지 | 2 | 민혁 | 민혁 | 010-xxxx-xxxx | 서울특별시 송파구 |
| 뽀삐 | 강아지 | 4 | 민혁 | 민혁 | 010-xxxx-xxxx | 서울특별시 송파구 |
| 유미 | 고양이 | 9 | 민혁 | 민혁 | 010-xxxx-xxxx | 서울특별시 송파구 |
| 나비 | 고양이 | 2 | 은서 | 은서 | 010-xxxx-xxxx | 경기도 성남시 |
| 별이 | 강아지 | 7 | 소림 | 소림 | 010-xxxx-xxxx | 서울특별시 서초구 |
| 초롱 | 강아지 | 1 | 소림 | 소림 | 010-xxxx-xxxx | 서울특별시 서초구 |
| 달래 | 강아지 | 5 | 혜은 | 혜은 | 010-xxxx-xxxx | 서울특별시 강남구 |
| 백구 | 강아지 | 8 | - | - | - | - |
차이점이 바로 보일 것이다. LEFT JOIN은 외래 키가 없는 행이라도 결과에 포함시킨다. 빈 속성은 NULL로 채워지게 된다.
왼쪽에 있는 테이블을 기준으로 결합하기 때문에 LEFT JOIN이다. 테이블의 순서만 바꾸면 RIGHT JOIN과 동일하다.
SELECT a.name, o.phone_number
FROM animal_info AS a
LEFT JOIN owner_info AS o
ON a.owner_name = o.name
WHERE a.species = 'dog';
SELECT a.name, o.phone_number
FROM owner_info AS o
RIGHT JOIN animal_info AS a
ON a.owner_name = o.name
WHERE a.species = 'dog';
위 두 쿼리는 동일한 테이블을 생성한다.
SQL을 공부하셨군요! 공부하시느라 힘드실텐데 조금만 더 해봅시다 아자💪