[SQL] JOIN 사용법

sudog·2023년 8월 22일
1

SQL

목록 보기
7/7

오늘은 JOIN사용법을 실습을 통해 배워보자.

여러 종류의 JOIN중 중요하고 많이 사용하는 것은 INNER JOINLEFT 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';

위 두 쿼리는 동일한 테이블을 생성한다.

profile
안녕하세요

1개의 댓글

comment-user-thumbnail
2023년 8월 23일

SQL을 공부하셨군요! 공부하시느라 힘드실텐데 조금만 더 해봅시다 아자💪

답글 달기