su-tudy 님의 블로그
JOIN (INNER, LEFT, RIGHT, OUTER) 본문
𖤐 JOIN으로 데이터 연결하기
실무에서 데이터는 하나의 테이블에만 있지 않다. 여러 테이블에 나뉘어 저장된 데이터를 연결해서 조회할 때 JOIN을 쓴다. 어떤 JOIN을 쓰느냐에 따라 결과가 완전히 달라지기 때문에 각각의 동작 원리를 이해하는 게 중요하다.
𖤐 정리 노트
✧ JOIN 동작 원리
JOIN은 두 테이블에서 공통된 컬럼(키)을 기준으로 행을 연결한다. ON 절에서 어떤 컬럼을 기준으로 연결할지 지정한다.
[orders 테이블] [users 테이블]
order_id user_id item user_id name
1 1 노트북 1 김철수
2 2 마우스 2 이영희
3 5 키보드 3 박민준
여기서 user_id가 두 테이블을 연결하는 기준 컬럼이 된다.
✧ 별칭 (Alias)
JOIN할 때 테이블명이 길면 매번 전체 이름을 쓰기 불편하다. 별칭을 붙여서 간결하게 쓸 수 있다.
-- 테이블 별칭
SELECT o.order_id, u.name
FROM orders o
JOIN users u ON o.user_id = u.user_id;
-- 컬럼 별칭
SELECT o.order_id AS 주문번호, u.name AS 고객명
FROM orders o
JOIN users u ON o.user_id = u.user_id;
✧ INNER JOIN
두 테이블 모두에 일치하는 행만 반환한다. 가장 기본적인 JOIN이다.
orders: user_id 1, 2, 5
users: user_id 1, 2, 3
INNER JOIN 결과: user_id 1, 2 (양쪽 모두 있는 것만)
SELECT o.order_id, u.name, o.item
FROM orders o
INNER JOIN users u ON o.user_id = u.user_id;
-- 결과:
-- order_id name item
-- 1 김철수 노트북
-- 2 이영희 마우스
-- (user_id=5인 주문은 users에 없어서 제외됨)
✧ LEFT JOIN
왼쪽 테이블의 모든 행을 반환하고, 오른쪽 테이블에 일치하는 게 없으면 NULL로 채운다.
orders: user_id 1, 2, 5
users: user_id 1, 2, 3
LEFT JOIN 결과: user_id 1, 2, 5 (왼쪽 orders 전부)
SELECT o.order_id, u.name, o.item
FROM orders o
LEFT JOIN users u ON o.user_id = u.user_id;
-- 결과:
-- order_id name item
-- 1 김철수 노트북
-- 2 이영희 마우스
-- 3 NULL 키보드 ← users에 없어서 NULL
✧ RIGHT JOIN
오른쪽 테이블의 모든 행을 반환하고, 왼쪽 테이블에 일치하는 게 없으면 NULL로 채운다. LEFT JOIN에서 테이블 순서를 바꾼 것과 같다.
SELECT o.order_id, u.name, o.item
FROM orders o
RIGHT JOIN users u ON o.user_id = u.user_id;
-- 결과:
-- order_id name item
-- 1 김철수 노트북
-- 2 이영희 마우스
-- NULL 박민준 NULL ← orders에 없어서 NULL
✧ CROSS JOIN
두 테이블의 모든 행을 조합해서 반환한다. ON 절 없이 사용하며 행 수가 테이블1 행 수 × 테이블2 행 수가 된다.
SELECT *
FROM table1
CROSS JOIN table2;
✧ SELF JOIN
같은 테이블을 자기 자신과 조인하는 것이다. 같은 테이블을 두 개처럼 쓰기 위해 별칭을 반드시 붙여야 한다.
-- 직원과 그 직원의 매니저 이름을 같은 테이블에서 조회
SELECT e.name AS 직원, m.name AS 매니저
FROM employees e, employees m
WHERE e.manager_id = m.id;
✧ 다중 JOIN
테이블을 3개 이상 연결할 때는 JOIN을 연속으로 쓴다.
-- orders, users, products 세 테이블 연결
SELECT o.order_id, u.name, p.product_name
FROM orders o
INNER JOIN users u ON o.user_id = u.user_id
INNER JOIN products p ON o.product_id = p.product_id;
✧ JOIN 종류 한눈에 비교
테이블 A: 1, 2, 3
테이블 B: 2, 3, 4
INNER JOIN → 2, 3 (교집합)
LEFT JOIN → 1, 2, 3 (A 전체 + B 일치)
RIGHT JOIN → 2, 3, 4 (B 전체 + A 일치)
CROSS JOIN → A×B 모든 조합
𖤐 체크포인트
🚨 주의 — JOIN 사용 시 주의
ON 절을 빠뜨리면 CROSS JOIN이 되어 모든 데이터가 서로 연결될 수 있다.SELECT * FROM orders, users; → ON 없이 쓰면 모든 조합이 나옴 (의도치 않은 결과)SELECT * FROM orders o INNER JOIN users u ON o.user_id = u.user_id; → 반드시 ON으로 조건 지정
🚨 주의 — LEFT, RIGHT JOIN에서 NULL 주의
오른쪽(또는 왼쪽) 테이블에 일치하는 게 없으면 해당 컬럼이 NULL로 채워진다. 이걸 이용해서 한쪽에만 있는 데이터를 찾을 수 있다.SELECT o.* FROM orders o LEFT JOIN users u ON o.user_id = u.user_id WHERE u.user_id IS NULL; → orders에는 있지만 users에는 없는 데이터 찾기
𖤐 오늘의 한 줄 요약
JOIN은 공통 컬럼을 기준으로 테이블을 연결하는 것. INNER는 교집합, LEFT/RIGHT는 한쪽 전체 + 반대쪽 일치, CROSS는 모든 조합. ON 절로 기준 컬럼을 반드시 지정하고, 별칭으로 가독성을 높여야 한다.
'DBMS > Part 2. DML' 카테고리의 다른 글
| GROUP BY와 HAVING (0) | 2024.09.24 |
|---|---|
| COUNT, SUM, AVG, MAX, MIN (0) | 2024.09.23 |
| ORDER BY와 LIMIT (0) | 2024.09.22 |
| WHERE와 연산자 (0) | 2024.09.20 |
| SELECT, INSERT, UPDATE, DELETE (0) | 2024.09.17 |