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
;

'mariaDB > 3. SQL 사용법' 카테고리의 다른 글
| 좋아요 총 개수 보내주기 (개별 도서 조회) (1) | 2025.05.19 |
|---|---|
| 두 컬럼의 값을 한 쌍으로 제약조건 만들기 (0) | 2025.05.19 |
| 데이터베이스 페이징 (1) | 2025.05.16 |
| SQL 시간 범위 구하기 (DATE_ADD, SUB) (0) | 2025.05.16 |
| mariaDB 실행 / SQL 문법 (0) | 2025.04.02 |