SQL - JOIN

치맨·2025년 4월 16일
0

SQL

목록 보기
2/2

목차


JOIN이란

  • JOIN은 두 개 이상의 테이블을 하나로 결합하는 SQL 연산입니다.
  • 관계형 데이터베이스에서는 데이터가 여러 테이블에 나뉘어 저장되므로, 이를 하나의 쿼리로 조회하려면 JOIN이 필요합니다.

왜 JOIN이 필요한가?

  • 예를 들어 users 테이블에는 사용자 정보가, orders 테이블에는 주문 정보가 있을 때:
    • 한 사용자가 어떤 상품을 주문했는지 알고 싶다면?
    • 주문 정보를 불러오되, 사용자 이름까지 같이 보이게 하고 싶다면?

👉 이런 경우 JOIN을 사용하면 테이블 간의 관계를 바탕으로 관련 데이터를 연결할 수 있습니다. (쉽게 말해서 여러 테이블을 합쳐서 나타내기 위해 필요합니다)


join에 알아보기 전 이해하기 쉽도록 사진을 하나 보고 가겠습니다. 혼공시리즈 라는 카페에 잘 정리된 사진이 있어서 가져왔습니다.

사진 출처 : 혼공시리즈


INNER JOIN

  • 사진출처

  • INNER JOIN의 경우 2개의 테이블에 공통으로 속한 데이터만 반환합니다.

  • 만약 일치하지 않는다면 결과에서 제외됩니다.

INNER JOIN 사용해보기

  • inner join은 줄여서 join으로 사용할 수 있습니다.
  • 아래는 Book tabel, AUTHOR table 2개가 존재합니다.
  • 아래의 2개의 테이블을 INNER JOIN을 하게 되면 아래와 같이 됩니다.
-- join 쿼리문 
  SELECT *
  from BOOK bk
  JOIN (AUTHOR) au   -- inner join이 아닌 join으로 축약해서 사용 가능
  on bk.AUTHOR_ID = au.AUTHOR_ID; -- 두개의 테이블을 연결시킬 공통 key
  • 아래와 같이 합쳐지게 됩니다. (위 테이블의 경우 author_id가 두 테이블 모두에 존재하므로,

LEFT JOIN

  • 왼쪽 테이블의 모든 데이터를 가져오고, 오른쪽 테이블에 일치하는 데이터가 없으면 NULL을 반환합니다.
  • 아래는 Book tabel, AUTHOR table 2개가 존재합니다.
  • 아래의 2개의 테이블을 LEFT JOIN을 하게 되면 아래와 같이 됩니다.
  • 위 inner join과 달리 이번에는 BOOK에는 존재하지만(id=3), AUTHOR에는 존재하지 않는 데이터가(id=3) 있을 경우를 살펴보겠습니다.

inner join할 경우

  • 아래와 같이 BOOK에만 존재하던 id값이 3인 경우가 사라지고, 2개의 테이블에 공통을 존재하는 데이터만 나타내게 됩니다.
-- 쿼리문
SELECT *
from BOOK bk
JOIN (select * from AUTHOR where author_id !=3) au
on bk.AUTHOR_ID = au.AUTHOR_ID;


LEFT JOIN할 경우

-- 쿼리문
SELECT *
from BOOK bk
LEFT JOIN (select * from AUTHOR where author_id !=3) au
on bk.AUTHOR_ID = au.AUTHOR_ID;
  • 아래의 사진처럼 왼쪽 테이블(BOOK)의 데이터를 먼저 나타내고, 오른쪽 테이블(AUTHOR)에 BOOK과 다른 데이터(id=3)인 부분은 null값으로 나타내게 됩니다.

  • 따라서 한쪽 테이블의 데이터를 무조건 남기고 싶다면 inner join이 아닌 left join을 사용할 수 있습니다.

RIGHT JOIN

  • LEFT JOIN은 기준이 왼쪽 테이블이라면, RIGHT JOIN은 기준이 오른쪽 테이블입니다.
  • 오른쪽 테이블의 모든 데이터를 가져오고, 왼쪽 테이블에 일치하는 데이터가 없으면 NULL을 반환합니다.
-- RIGHT JOIN 쿼리문
  SELECT *
  from (select * from AUTHOR where author_id !=3) au
  RIGHT JOIN BOOK bk
  on bk.AUTHOR_ID = au.AUTHOR_ID;

FULL OUTER JOIN

  • 양쪽 테이블의 모든 데이터를 가져오고, 일치하지 않는 부분은 NULL로 채웁니다.

  • MY SQL의 경우 FULL OUTER JOIN을 지원하지 않습니다. 하지만 UNION을 사용하여 같은 기능을 하도록 흉내는 낼 수 있습니다.

  • 아래의 2개의 테이블의 구성을 살펴보면

    • 공통 1개, 서로 다른 id값이 각각 1개씩 존재합니다.
    • BOOK : id가 1,3으로 구성
    • AUTHOR : id가 1,2로 구성

  SELECT *
  from (select * from AUTHOR where author_id !=3) au
  FULL OUTER JOIN (select * from BOOK where author_id !=2) bk
  on bk.AUTHOR_ID = au.AUTHOR_ID;
  • FULL OUTER JOIN을 하게 되면 아래와 같이 모두 나타내지만, 한쪽만 존재하는 데이터에는 null 값이 채워지게 됩니다.

참고

profile
기본기가 탄탄한 개발자가 되자!

0개의 댓글