su-tudy 님의 블로그

JOIN (INNER, LEFT, RIGHT, OUTER) 본문

DBMS/Part 2. DML

JOIN (INNER, LEFT, RIGHT, OUTER)

su-tudy 2024. 10. 11. 19:17

 

𖤐 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