티스토리 뷰
SQL에서 JOIN은 여러 테이블의 데이터를 서로 연결해서 조회하는 핵심 기능입니다.
실무에서는 단순 조회보다 JOIN이 훨씬 많이 사용되며, 성능 문제도 대부분 JOIN 구조에서 발생합니다.
대표적인 JOIN 종류는 아래와 같습니다.
- INNER JOIN
- LEFT OUTER JOIN
- RIGHT OUTER JOIN
- FULL OUTER JOIN
- CROSS JOIN
- SELF JOIN

JOIN 기본 개념
예시 테이블
회원 테이블 (member)
| 1 | 김철수 |
| 2 | 이영희 |
| 3 | 박민수 |
주문 테이블 (orders)
| 100 | 1 | 노트북 |
| 101 | 1 | 키보드 |
| 102 | 2 | 마우스 |
관계:
member.member_id = orders.member_id
즉 회원 번호 기준으로 연결됩니다.
1. INNER JOIN
가장 많이 사용하는 JOIN.
두 테이블에서 조건이 일치하는 데이터만 조회합니다.
SELECT
M.name,
O.product
FROM member M
INNER JOIN orders O
ON M.member_id = O.member_id;
결과:
| 김철수 | 노트북 |
| 김철수 | 키보드 |
| 이영희 | 마우스 |
박민수는 주문 내역이 없으므로 제외됩니다.
2. LEFT OUTER JOIN
왼쪽 테이블 기준으로 모두 조회합니다.
오른쪽 테이블에 데이터가 없어도 NULL로 표시됩니다.
SELECT
M.name,
O.product
FROM member M
LEFT JOIN orders O
ON M.member_id = O.member_id;
결과:
| 김철수 | 노트북 |
| 김철수 | 키보드 |
| 이영희 | 마우스 |
| 박민수 | NULL |
3. RIGHT OUTER JOIN
오른쪽 테이블 기준으로 모두 조회합니다.
SELECT
M.name,
O.product
FROM member M
RIGHT JOIN orders O
ON M.member_id = O.member_id;
실무에서는 LEFT JOIN으로 대부분 대체 가능해서 사용 빈도가 낮습니다.
4. FULL OUTER JOIN
양쪽 테이블 데이터를 모두 조회합니다.
한쪽에만 존재하는 데이터도 포함됩니다.
SELECT
M.name,
O.product
FROM member M
FULL OUTER JOIN orders O
ON M.member_id = O.member_id;
MySQL 방식:
SELECT ...
FROM A
LEFT JOIN B ...
UNION
SELECT ...
FROM A
RIGHT JOIN B ...
5. CROSS JOIN
모든 경우의 수를 조합합니다.
카테시안 곱(Cartesian Product)이라고도 합니다.
SELECT *
FROM member
CROSS JOIN orders;
결과 개수:
member 건수 × orders 건수
3명 × 3주문 = 9건
6. SELF JOIN
자기 자신 테이블을 JOIN.
주로 조직도 구조에서 사용합니다.
직원 테이블
| 1 | 대표 | |
| 2 | 팀장 | 1 |
| 3 | 사원 | 2 |
SELECT
E.name AS 직원명,
M.name AS 관리자명
FROM employee E
LEFT JOIN employee M
ON E.manager_id = M.emp_id;
JOIN 실행 순서 이해
SELECT *
FROM A
JOIN B
ON A.id = B.id
WHERE A.status = 'Y';
실행 개념:
1. FROM
2. JOIN
3. ON 조건
4. WHERE
5. GROUP BY
6. HAVING
7. ORDER BY
즉 JOIN 후 WHERE 필터링.
ON vs WHERE 차이
매우 중요합니다.
잘못된 예
SELECT *
FROM member M
LEFT JOIN orders O
ON M.member_id = O.member_id
WHERE O.product = '노트북';
이렇게 하면 NULL 제거되어 INNER JOIN처럼 동작합니다.
올바른 방식
SELECT *
FROM member M
LEFT JOIN orders O
ON M.member_id = O.member_id
AND O.product = '노트북';
LEFT JOIN 유지 가능.
JOIN 성능 핵심
1. JOIN 컬럼 인덱스 필수
ON A.user_id = B.user_id
이면 둘 중 최소 한쪽은 인덱스 필요.
보통 FK 컬럼에 생성.
2. 데이터 건수 적은 것부터 필터
좋은 예:
WHERE order_date >= SYSDATE - 1
먼저 대상 줄이기.
3. SELECT * 지양
불필요 컬럼 조회는 성능 저하.
SELECT id, name
처럼 필요한 컬럼만.
| INNER JOIN | 일치 데이터만 |
| LEFT JOIN | 왼쪽 전체 유지 |
| RIGHT JOIN | 오른쪽 전체 유지 |
| FULL OUTER JOIN | 양쪽 전체 유지 |
| CROSS JOIN | 모든 조합 |
| SELF JOIN | 자기 자신 연결 |
INNER JOIN = 교집합
LEFT JOIN = 왼쪽 기준 전체
RIGHT JOIN = 오른쪽 기준 전체
FULL JOIN = 합집합
CROSS JOIN = 모든 경우의 수
SELF JOIN = 자기 자신 연결
#SQLJOIN
#INNERJOIN
#LEFTJOIN
#OUTERJOIN
#DBJOIN
#SQL튜닝
#SQL성능
#오라클JOIN
#MYSQLJOIN
#MARIADBJOIN
#ANSIJOIN
#데이터베이스
#SQL기초
#SQL실무
#개발자
'데이터베이스' 카테고리의 다른 글
| DB 파티셔닝(Partitioning)과 샤딩(Sharding) 원리 및 알고리즘 (0) | 2026.06.07 |
|---|---|
| DB 인덱스(Index) 원리부터 B-Tree 구조, 복합 인덱스 설정 기준 완벽 정리 (0) | 2026.06.05 |
| JPA N+1 문제 원인 및 해결 방법: Fetch Join과 Batch Size 완벽 정리 (0) | 2026.06.04 |
| 데이터베이스 정규화 BCNF (0) | 2026.05.17 |
| 데이터베이스 제3정규화 (0) | 2026.05.17 |
| 데이터베이스 제2정규화 (0) | 2026.05.17 |
| 데이터베이스 제1정규화 (0) | 2026.05.17 |
| 가장 많이 사용된 데이터베이스(DBMS) TOP10 - 2026 최신버전 (0) | 2026.05.07 |
- Total
- Today
- Yesterday
- 파이썬
- Android
- 벡터
- Java
- C언어
- 자료구조
- 블루투스
- OpenCV
- 아두이노
- 리스트
- String
- 알고리즘
- 배열
- C
- 정보처리기사
- DB연동
- 상속
- C++
- 파일처리
- 문제풀이
- 문자열
- 자바
- c#
- 안드로이드
- Class
- 클래스
- html
- 데이터베이스
- MySQL
- C++ 클래스
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 31 |