SQL JOIN INNER, LEFT, RIGHT JOIN 차이
JOIN은 SQL에서 두 개 이상의 테이블을 연결하여 관련 데이터를 한 번에 조회할 수 있는 강력한 기능입니다. 데이터베이스에서 관계형 구조를 활용하는 핵심 개념으로, 효율적인 질의(Query) 작성에 필수입니다.
1. JOIN의 종류와 차이점
| JOIN 종류 | 설명 |
|---|---|
| INNER JOIN | 두 테이블에서 조건에 일치하는 레코드만 반환 |
| LEFT JOIN | 왼쪽 테이블의 모든 레코드 + 조건에 일치하는 오른쪽 테이블 |
| RIGHT JOIN | 오른쪽 테이블의 모든 레코드 + 조건에 일치하는 왼쪽 테이블 |
2. INNER JOIN
✅ 조건에 일치하는 공통된 데이터만 반환
SELECT *
FROM Reservation
INNER JOIN Customer
ON Reservation.Name = Customer.Name;
Reservation.Name과Customer.Name이 같은 레코드만 조회
3. LEFT JOIN
✅ 왼쪽 테이블은 모두 반환, 오른쪽 테이블은 일치하는 경우만
SELECT *
FROM Reservation
LEFT JOIN Customer
ON Reservation.Name = Customer.Name
WHERE ReserveDate > '2016-02-01';
- 예약 정보는 모두 출력
- 일치하는 고객 정보가 없으면
NULL표시
4. RIGHT JOIN
✅ 오른쪽 테이블은 모두 반환, 왼쪽 테이블은 일치하는 경우만
SELECT *
FROM Reservation
RIGHT JOIN Customer
ON Reservation.Name = Customer.Name;
- 모든 고객 정보를 조회하고
- 예약과 연결되지 않은 고객도 표시됨
5. JOIN 고급 활용 팁
5.1. 여러 테이블 JOIN
SELECT *
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.ID
LEFT JOIN Products ON Orders.ProductID = Products.ID;
- 고객과 주문 정보는 반드시 일치해야 하고
- 제품 정보는 있는 경우에만 표시
5.2. 별칭(Alias) 사용
SELECT *
FROM Reservation AS r
INNER JOIN Customer AS c
ON r.Name = c.Name;
코드 간결성과 가독성 향상
5.3. WHERE vs JOIN
-- JOIN: 관계 정의
-- WHERE: 결과 필터링
SELECT *
FROM Reservation r
INNER JOIN Customer c
ON r.Name = c.Name
WHERE r.ReserveDate > '2016-02-01';
5.4. SELF JOIN
SELECT a.ID, b.ID
FROM Employees a
INNER JOIN Employees b
ON a.ManagerID = b.ID;
- 동일한 테이블끼리 비교
6. JOIN 벤 다이어그램으로 이해하기
- INNER JOIN: A ∩ B (공통된 부분만)
- LEFT JOIN: A 전체 + A∩B
- RIGHT JOIN: B 전체 + A∩B
7. JOIN 비교 요약
| JOIN 종류 | 조건 일치 필수 | NULL 포함 | 반환 결과 |
|---|---|---|---|
| INNER JOIN | O | X | 일치하는 데이터만 |
| LEFT JOIN | O | O | 왼쪽 테이블 전부 + 일치 데이터 |
| RIGHT JOIN | O | O | 오른쪽 테이블 전부 + 일치 데이터 |
8. 실전 예제
8.1. 고객별 주문 내역
SELECT o.OrderID, c.Name, o.OrderDate
FROM Orders o
INNER JOIN Customers c
ON o.CustomerID = c.ID;
고객이 주문한 내역 조회
8.2. 예약 정보 + 고객 이름
SELECT r.ID, r.ReserveDate, c.Name
FROM Reservation r
LEFT JOIN Customer c
ON r.CustomerID = c.ID;
예약은 모두 출력되며, 고객 정보가 없으면 NULL
8.3. 모든 상품 + 주문 여부
SELECT p.ProductName, o.Quantity
FROM Orders o
RIGHT JOIN Products p
ON o.ProductID = p.ID;
주문이 없는 상품도 포함해서 출력
질문 정리
1. JOIN은 몇 개의 테이블까지 연결할 수 있나요?
→ 이론적으로 제한 없음, 하지만 성능 고려 필요.
2. INNER JOIN과 WHERE 조건이 겹치는 경우?
→ ON은 테이블 간 조건, WHERE는 결과 필터링입니다.
3. LEFT JOIN에서 NULL은 어떤 의미인가요?
→ 연결된 테이블에 해당 레코드가 없다는 뜻입니다.
4. JOIN이 느려요. 어떻게 해야 하나요?
→ JOIN 조건 필드에 인덱스 추가, 필요한 필드만 SELECT로 속도 개선 가능.
요약
- JOIN은 관계형 데이터베이스의 핵심 도구
- INNER JOIN: 공통된 데이터만 조회
- LEFT JOIN: 왼쪽 테이블은 모두 출력
- RIGHT JOIN: 오른쪽 테이블은 모두 출력
- Alias, WHERE절, SELF JOIN 등과 함께 사용하면 유연한 데이터 조회 가능
JOIN을 잘 다루면 SQL 질의의 수준이 확 올라갑니다!
댓글남기기