오늘은 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을 공부하셨군요! 공부하시느라 힘드실텐데 조금만 더 해봅시다 아자💪