개발블로그

[SQL] JOIN 본문

STUDY/SQL

[SQL] JOIN

devmel 2026. 7. 29. 15:03
Contents 접기
 

JOIN의 기본 개념

 

개념

서로 관련된 여러 테이블의 행을 연결하여 하나의 조회 결과로 만드는 구문 

 

EX]

users 회원정보 + orders 주문정보

=> 두 테이블을 JOIN :주문 정보와 주문한 회원 정보를 함께 조회 

 

문법

SELECT
    기준_별칭.컬럼,
    연결_별칭.컬럼
FROM 기준_테이블 AS 기준_별칭
JOIN 연결할_테이블 AS 연결_별칭
    ON 기준_별칭.연결_컬럼 = 연결_별칭.연결_컬럼;

 

EX]

users

id name
1 김개발
2 이개발

 

orders

id user_id total_price
101 1 30000
102 1 50000
103 2 20000

 

SELECT
    o.id,
    u.name,
    o.total_price
FROM orders AS o
JOIN users AS u
    ON u.id = o.user_id;

 

결과

id name total_price
101 김개발 30000
102 김개발 50000
103 이개발 20000

 


 

JOIN의 종류

JOIN
├─ INNER JOIN
├─ OUTER JOIN
│  ├─ LEFT JOIN
│  ├─ RIGHT JOIN
│  └─ FULL OUTER JOIN
├─ CROSS JOIN
└─ SELF JOIN

종류 의미
(INNER) JOIN 양쪽 테이블에서 연결 조건을 만족하는 행만 조회
LEFT JOIN 왼쪽 테이블의 모든 행을 유지
RIGHT JOIN 오른쪽 테이블의 모든 행을 유지
FULL (OUTER) JOIN 양쪽 테이블의 모든 행을 유지
CROSS JOIN 두 테이블의 모든 행을 서로 조합

특징)
- 연결 관계를 판단하지 않아 일반적으로 ON 조건을 사용하지 않는다. 
- 결과 행 수 : 첫 번째 테이블의 행 수 * 두 번째 테이블의 행 수

사용)
- 가능한 모든 조합을 만들 때.

예시)
SELECT
    c.color,
    s.size
FROM colors AS c
CROSS JOIN sizes AS s;
/**
검정 × S
검정 × M
검정 × L
흰색 × S
흰색 × M
흰색 × L
*/
SELF JOIN 하나의 테이블을 자기 자신과 연결

- 같은 테이블에 서로 다른 별칭을 붙여 JOIN

SELECT
    t1.컬럼,
    t2.컬럼
FROM 테이블 AS t1
JOIN 테이블 AS t2
    ON t1.연결_컬럼 = t2.연결_컬럼;

- 주로 다음과 같은 계층 관계에 사용함
ex) 직원과 관리자, 카테고리와 상위 카테고리, 댓글과 부모 댓글, 조직과 상위 조직 

 

EX] OUTER JOIN 예시

users

id name
1 사용자 A
2 사용자 B
3 사용자 C

orders

id user_id
101 1
102 1
103 2
104 4
-- INNER JOIN --
SELECT
    u.id AS user_id,
    u.name,
    o.id AS order_id
FROM users AS u
(INNER) JOIN orders AS o
    ON u.id = o.user_id;

/**
[결과]
| user_id | name  | order_id |
| ------: | ----- | -------: |
|       1 | 사용자 A |      101 |
|       1 | 사용자 A |      102 |
|       2 | 사용자 B |      103 |
*/

-- OUTER JOIN --

-- LEFT JOIN : 왼쪽 테이블의 모든 행을 유지하고, 오른쪽 테이블에서 연결되는 행을 붙임.
SELECT
    u.id AS user_id,
    u.name,
    o.id AS order_id
FROM users AS u
LEFT JOIN orders AS o
    ON u.id = o.user_id;
/** 결과
| user_id | name  | order_id |
| ------: | ----- | -------: |
|       1 | 사용자 A |      101 |
|       1 | 사용자 A |      102 |
|       2 | 사용자 B |      103 |
|       3 | 사용자 C |   `NULL` |
*/

-- OUTER JOIN : 양쪽 테이블의 모든 행을 결과에 포함
SELECT
    u.id AS user_id,
    u.name,
    o.id AS order_id
FROM users AS u
FULL OUTER JOIN orders AS o
    ON u.id = o.user_id;
    
/** [결과]
| user_id | name   | order_id |
| ------: | ------ | -------: |
|       1 | 사용자 A  |      101 |
|       1 | 사용자 A  |      102 |
|       2 | 사용자 B  |      103 |
|       3 | 사용자 C  |   `NULL` |
|  `NULL` | `NULL` |      104 |
*/

 

EX] SELF 조인 예시

id name manager_id
1 관리자 A NULL
2 직원 B 1
3 직원 C 1

 

SELECT
    e.name AS employee_name,
    m.name AS manager_name
FROM employees AS e
LEFT JOIN employees AS m
    ON e.manager_id = m.id;
    
/** 결과
| employee_name | manager_name |
| ------------- | ------------ |
| 관리자 A         | `NULL`       |
| 직원 B          | 관리자 A        |
| 직원 C          | 관리자 A        |
*/

 


 

여러 테이블 JOIN

개념

JOIN ... ON 구문을 필요한 만큼 이어서 작성

SELECT
    t1.컬럼,
    t2.컬럼,
    t3.컬럼
FROM 기준_테이블 AS t1
JOIN 두_번째_테이블 AS t2
    ON t1.연결_컬럼 = t2.연결_컬럼
JOIN 세_번째_테이블 AS t3
    ON t2.연결_컬럼 = t3.연결_컬럼;

기준 테이블
    ↓ JOIN
두 번째 테이블 연결
    ↓ JOIN
세 번째 테이블 연결
    ↓
하나의 조회 결과

 

연결기준

새로운 테이블은 바로 앞 테이블과 연결할 필요는 없음. 

이미 앞에서 사용한 테이블 중 관계가 있는 테이블과 연결하면 됨.

 

일대다 관계

JOIN은 테이블의 행을 하나씩 단순히 옆에 붙이는 것이 아니라

연결 조건을 만족하는 행이 여러 개라면 그 개수만큼 결과 행이 만들어진다. 

 

예시

EX] 

orders

id order_date
101 2026-07-01
102 2026-07-02

 

order_items

order_id product_id quantity
101 1 2
101 2 1
102 1 1

 

products

id name
1 상품 A
2 상품 B

 

주문번호, 상품명, 주문 수량을 함께 조회

SELECT
    o.id AS order_id,
    p.name AS product_name,
    oi.quantity
FROM orders AS o
JOIN order_items AS oi
    ON o.id = oi.order_id
JOIN products AS p
    ON oi.product_id = p.id;
    
/**
결과
| order_id | product_name | quantity |
| -------: | ------------ | -------: |
|      101 | 상품 A         |        2 |
|      101 | 상품 B         |        1 |
|      102 | 상품 A         |        1 |
*/

 


 

조건 작성 - ON, WHERE

ON
→ 테이블의 어떤 행끼리 연결할지 결정

두 테이블의 관계를 나타내는 조건 

WHERE
→ JOIN이 끝난 결과에서 필요한 행만 선택

 

'STUDY > SQL' 카테고리의 다른 글

[SQL] 데이터 추가·수정·삭제  (1) 2026.07.29
[SQL] 서브쿼리  (0) 2026.07.29
[SQL] SQL 기본 조회  (0) 2026.07.29
[SQL] SQL 개념  (0) 2026.07.29
[데이터베이스와 DBMS 기초] 관계형 데이터베이스의 기본 구조  (0) 2026.07.28