mariaDB/3. SQL 사용법

JOIN vs LEFT JOIN 비교

bbomkim 2025. 5. 16. 13:45

JOIN과 LEFT JOIN은 둘 다 두 개 이상의 테이블을 연결해서 결과를 조회하는 SQL 구문이지만, 연결 조건에 맞지 않는 데이터가 있을 때 포함 여부에서 큰 차이가 있습니다.


1. JOIN (또는 INNER JOIN)

  • 양쪽 테이블에 모두 매칭되는 데이터만 결과에 포함됩니다.
  • 조건에 맞지 않으면 해당 행은 결과에 나오지 않음.

예시:

SELECT *
FROM books
JOIN category ON books.categoryId = category.id
  • books.categoryId가 category.id와 일치하는 경우만 결과로 나옵니다.
  • 만약 어떤 책의 categoryId가 null이거나 해당 ID가 category 테이블에 존재하지 않으면 해당 책은 결과에서 제외됩니다.

2. LEFT JOIN (또는 LEFT OUTER JOIN)

  • 왼쪽 테이블의 모든 데이터를 결과에 포함시킵니다.
  • 매칭되는 오른쪽 테이블 데이터가 없으면, 오른쪽 값은 NULL로 채워집니다.

예시:

SELECT *
FROM books
LEFT JOIN category ON books.categoryId = category.id
  • 모든 books 행이 결과에 포함됩니다.
  • 카테고리가 없는 책도 결과에 나오며, 이 경우 category.categoryName 등은 NULL입니다.

정리: JOIN vs LEFT JOIN 차이

구분  JOIN (INNER JOIN)  LEFT JOIN
결과 포함 조건 양쪽 테이블 모두 조건에 맞아야 포함 왼쪽(기준) 테이블은 무조건 포함
누락 가능성 연결이 안 되면 제외됨 연결이 안 되면 오른쪽 데이터만 NULL 처리
용도 예시 연결된 데이터만 필요할 때 일부 연결되지 않아도 기본 데이터가 필요할 때

너의 코드에서 어떤 걸 써야 하나?

현재 코드에서는:

SELECT *, category.categoryName
FROM books
JOIN category ON books.categoryId = category.id

즉, 모든 책에 대해 카테고리가 반드시 있어야만 결과에 포함됩니다.
만약 어떤 책이 아직 카테고리 없이 등록될 수도 있다면 LEFT JOIN으로 바꾸는 것이 좋습니다:

SELECT *, category.categoryName
FROM books
LEFT JOIN category ON books.categoryId = category.id

이렇게 하면 카테고리 없는 책도 함께 조회할 수 있습니다.
즉, 책이 중심이라면 LEFT JOIN,
연결된 책만 필요하면 JOIN입니다.

 


JOIN 해서 가져오는 다른 테이블의 컬럼명에 *별칭* 주기

SELECT books.* , category.name
FROM book_store.books
LEFT JOIN category ON book_store.books.categoryId = category.id
;

 

category의 테이블에서 가져온 name이 어떤 네임인지 햇갈린다

그럴 때 방법은

방법1) category 테이블의 컬럼명을 고치거나,

방법2) 별칭 을 줘서 가져올때만 다른 이름으로 조회할 수 있다. (다만, * 아스타 에는 별칭을 쓸 수 없다)

SELECT books.* , category.name AS category_name
FROM book_store.books
LEFT JOIN category ON book_store.books.categoryId = category.id
;

category테이블의 컬럼명은 원래 name이지만 (AS 별칭) 으로 하니까 => catgegory_name으로 조회할 수 있다.