Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |
Tags
- 데이터베이스
- ai agent
- dhgrp
- SQL기초
- ai 에이전트
- 디자인패턴
- mcp server
- linux 권한
- 매직메서드
- Tool Calling
- 인덱스
- docker network
- Agent Loop
- SQL문법
- 소프트웨어설계
- Laravel
- PHP
- MySQL
- 객체지향
- PHP객체지향
- 어댑터패턴
- docker
- SQL
- 라라벨
- 객체복제
- OOP
- MCP
- LLM
- mcp client
- 데코레이터패턴
Archives
- Today
- Total
개발블로그
[SQL] JOIN 본문
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 |