티스토리 뷰
SQL JOIN 완벽 정리, INNER JOIN·LEFT JOIN·RIGHT JOIN 차이 한 번에 이해하기
SQL을 공부할 때 많은 분들이 처음 크게 헷갈리는 지점이 바로 JOIN입니다. 특히 INNER JOIN, LEFT JOIN, RIGHT JOIN은 이름은 비슷한데 실제 결과는 다르게 나오기 때문에, 문법만 외우면 금방 섞이기 쉽습니다.
그런데 JOIN은 생각보다 어렵게 볼 필요가 없습니다. 핵심은 단 하나입니다.
이번 글에서는 JOIN이 왜 필요한지부터 시작해서, INNER JOIN, LEFT JOIN, RIGHT JOIN 차이와 실무에서 자주 헷갈리는 포인트까지 한 번에 정리해보겠습니다.
예를 들어 회원 정보는 users 테이블에, 주문 정보는 orders 테이블에 저장할 수 있습니다.
users
+----+--------+
| id | name |
+----+--------+
| 1 | Kim |
| 2 | Lee |
| 3 | Park |
+----+--------+
orders
+----+---------+-----------+
| id | user_id | product |
+----+---------+-----------+
| 1 | 1 | MacBook |
| 2 | 1 | iPhone |
| 3 | 2 | Monitor |
| 4 | 4 | Keyboard |
+----+---------+-----------+
이 상태에서 “누가 어떤 상품을 주문했는지” 보려면 두 테이블을 연결해야 합니다. 바로 이럴 때 JOIN을 사용합니다.
INNER JOIN은 두 테이블에서 조건이 일치하는 데이터만 가져옵니다.
SELECT u.name, o.product
FROM users u
INNER JOIN orders o
ON u.id = o.user_id;
결과는 이렇게 됩니다.
+------+---------+
| name | product |
+------+---------+
| Kim | MacBook |
| Kim | iPhone |
| Lee | Monitor |
+------+---------+
여기서 Park는 주문이 없기 때문에 빠지고, user_id = 4 주문도 users 테이블에 일치하는 회원이 없으므로 빠집니다.
LEFT JOIN은 왼쪽 테이블의 데이터는 전부 유지합니다. 그리고 오른쪽 테이블에서 매칭되는 데이터만 붙입니다.
SELECT u.name, o.product
FROM users u
LEFT JOIN orders o
ON u.id = o.user_id;
결과는 이렇게 됩니다.
+------+---------+
| name | product |
+------+---------+
| Kim | MacBook |
| Kim | iPhone |
| Lee | Monitor |
| Park | NULL |
+------+---------+
Park는 주문이 없어도 왼쪽 테이블인 users에 있기 때문에 결과에 남습니다. 대신 주문 정보가 없으니 product는 NULL이 됩니다.
RIGHT JOIN은 오른쪽 테이블의 데이터는 전부 유지합니다.
SELECT u.name, o.product
FROM users u
RIGHT JOIN orders o
ON u.id = o.user_id;
결과는 이렇게 됩니다.
+------+----------+
| name | product |
+------+----------+
| Kim | MacBook |
| Kim | iPhone |
| Lee | Monitor |
| NULL | Keyboard |
+------+----------+
이번에는 orders 테이블이 기준이므로, user_id = 4에 해당하는 Keyboard 주문도 결과에 포함됩니다. 다만 매칭되는 회원이 없기 때문에 name은 NULL입니다.
| JOIN 종류 | 기준 | 결과 특징 |
|---|---|---|
| INNER JOIN | 양쪽 모두 일치하는 데이터만 | 교집합만 남음 |
| LEFT JOIN | 왼쪽 테이블은 모두 유지 | 오른쪽이 없으면 NULL |
| RIGHT JOIN | 오른쪽 테이블은 모두 유지 | 왼쪽이 없으면 NULL |
실무에서는 보통 다음 흐름으로 많이 사용합니다.
- INNER JOIN: 연관 데이터가 반드시 있어야 할 때
- LEFT JOIN: 기준 테이블은 모두 보여주고 싶을 때
- RIGHT JOIN: 가능은 하지만 보통 LEFT JOIN으로 방향을 바꿔서 더 많이 작성
특히 실무에서는 RIGHT JOIN보다는 테이블 순서를 바꾼 LEFT JOIN을 더 선호하는 경우가 많습니다. 읽기 편하고 쿼리 의도가 더 직관적으로 보이기 때문입니다.
1) LEFT JOIN인데 WHERE 조건 때문에 INNER JOIN처럼 되는 경우
SELECT u.name, o.product
FROM users u
LEFT JOIN orders o
ON u.id = o.user_id
WHERE o.product = 'MacBook';
이 쿼리는 LEFT JOIN처럼 보여도, WHERE o.product = 'MacBook' 조건 때문에 o.product가 NULL인 행이 제거됩니다. 그래서 결과적으로 INNER JOIN처럼 보일 수 있습니다.
2) JOIN 조건은 ON에, 필터 조건은 WHERE에 넣는 기준이 중요함
JOIN 기준과 조회 필터는 분리해서 생각하는 습관이 필요합니다.
3) 1:N 관계에서는 결과 행이 늘어날 수 있음
회원 1명이 주문 2개를 하면 회원 정보가 2번 반복되어 보이는 것이 정상입니다.
이후 `WHERE` 조건을 어떻게 거느냐에 따라 결과가 달라질 수 있습니다.
초보 단계에서는 우선 이렇게 기억하면 충분합니다.
INNER JOIN은 겹치는 것만, LEFT JOIN은 왼쪽 전체, RIGHT JOIN은 오른쪽 전체입니다.
'IT > SQL·DB' 카테고리의 다른 글
| 실행계획(Execution Plan) 보는 방법, 느린 쿼리 잡는 핵심 (0) | 2026.03.25 |
|---|---|
| 데이터베이스 정규화 vs 반정규화, 언제 써야 할까? (0) | 2026.03.25 |
| 데이터베이스 Key 종류 총정리, 기본키·외래키·후보키·슈퍼키 쉽게 이해하기 (0) | 2026.03.25 |
| ORM이란 무엇인가? JPA 포함 개념 정리와 SQL과의 차이 (0) | 2026.03.24 |
| [MariaDB] CentOS7에 MariaDB 설치 (0) | 2022.08.04 |

