조인이란?
데이터베이스에서 JOIN은 두 개 이상의 테이블을 서로 결합해 하나의 결과를 생성하는 핵심 기능이다. 공통된 열(Column)을 기준으로 데이터를 연결하고, 각 테이블이 단독으로는 표현할 수 없는 복합적인 정보를 한 번에 조회할 수 있도록 도와준다. MySQL에서 JOIN은 복잡한 비즈니스 로직을 구현할 때 자주 사용되므로, 그 종류와 특징을 명확히 이해하는 것이 중요하다
1. JOIN의 필요성
- 분리된 테이블을 논리적으로 연결해 데이터 중복을 최소화
- ERD(Entity-Relationship Diagram)의 관계 모델을 그대로 SQL로 표현
- 복합 조건을 만족하는 결과를 효율적으로 추출
2. JOIN의 종류
MySQL에서는 대표적으로 네 가지 JOIN을 지원한다. 내부 조인, 외부 조인, 상호 조인, 자체 조인이다.
내부 조인 (INNER JOIN)
- 정의
- 두 테이블의 조건에 일치하는 행(Row)만 결과로 출력
- 집합 연산 관점에서 교집합(∩)과 동일
- 문법
SELECT A.열1, B.열2
FROM 테이블A A
INNER JOIN 테이블B B
ON A.공통열 = B.공통열;
- 예제
- 직원 테이블 employees와 부서 테이블 departments를 조인해 직원명과 부서명을 출력
SELECT E.employee_name, D.department_name
FROM EMPLOYEES E
INNER JOIN DEPARTMENTS D
ON E.department_id = D.department_id;
- 특징
- 일치하는 데이터가 없으면 해당 행은 결과에서 제외
- NULL이 아닌 값만 결합
외부 조인(OUTER JOIN)
외부 조인은 내부 조인과 달리 한쪽 테이블에만 존재하는 행도 결과에 포함한다. MySQL에서는 LEFT JOIN과 RIGHT JOIN을 지원하지만 풀 조인은 직접 구현해야 한다

- LEFT JOIN (왼쪽 외부 조인)
- 왼쪽 테이블의 모든 행을 결과에 포함
- 오른쪽 테이블에 매칭되는 데이터가 없으면 NULL로 채움
SELECT E.employee_name, D.department_name
FROM EMPLOYEES E
LEFT JOIN DEPARTMENTS D
ON E.department_id = D.department_id;
- RIGHT JOIN (오른쪽 외부 조인)
- 오른쪽 테이블의 모든 행을 결과에 포함
- 왼쪽에 매칭이 없으면 NULL로 채움
SELECT E.employee_name, D.department_name
FROM EMPLOYEES E
RIGHT JOIN DEPARTMENTS D
ON E.department_id = D.department_id;
- FULL OUTER JOIN (전체 외부 조인)
- MySQL은 직접 지원하지 않음
- UNION으로 LEFT JOIN과 RIGHT JOIN 결과를 합쳐 구현
SELECT * FROM EMPLOYEES E
LEFT JOIN DEPARTMENTS D ON E.department_id = D.department_id
UNION
SELECT * FROM EMPLOYEES E
RIGHT JOIN DEPARTMENTS D ON E.department_id = D.department_id;
- 특징
- NULL 포함 여부를 통해 결측치 확인 가능
- 누락된 관계를 분석할 때 유용
상호 조인(CROSS JOIN)
- 정의
- 두 테이블의 모든 조합(카테시안 곱, Cartesian Product)을 반환
- 문법
SELECT A.*, B.*
FROM 테이블A A
CROSS JOIN 테이블B B;
- 예제
products 테이블과 colors 테이블을 조합해 모든 상품-색상 조합 생성
SELECT P.product_name, C.color_name
FROM PRODUCTS P
CROSS JOIN COLORS C;
- 특징
- 결과 행 수 = A의 행 수 × B의 행 수
- 주로 브루트포스 체크, 조합 생성 시 사용
- 조건 없이 모든 조합을 생성하므로 주의
자체 조인(SELF JOIN)
- 정의
- 하나의 테이블을 두 개 이상의 별칭(Alias)으로 참조해 조인
- 자기 자신과 비교하는 구조
- 문법
SELECT A.컬럼1, B.컬럼2
FROM 테이블 A
JOIN 테이블 B
ON A.비교열 = B.비교열;
- 예제
직원 테이블에서 직원과 매니저 관계 조회
SELECT E.employee_name AS 직원,
M.employee_name AS 매니저
FROM EMPLOYEES E
LEFT JOIN EMPLOYEES M
ON E.manager_id = M.employee_id;
- 특징
- 계층형 데이터(부모-자식, 선후 관계) 조회에 적합
- 자기 참조 컬럼을 이용해 재귀적 관계 표현
성능 최적화 팁
- 인덱스 활용
- ON 절에 사용되는 컬럼에 인덱스를 생성해 조회 속도 개선
- Composite 인덱스로 다중 조건 처리
- 조인 순서
- 작은 결과를 먼저 필터링해 처리량 감소
- 실행 계획(EXPLAIN) 확인 후 순서 조정
- 불필요한 컬럼 제거
- SELECT * 대신 필요한 컬럼만 지정
- 네트워크 전송량 및 메모리 사용량 절감
- 조인 유형 선택
- OUTER JOIN은 처리 비용이 크므로 필요한 경우에만 사용
- 가능한 INNER JOIN으로 변환 검토
'웹개발 > SQL(mySQL)' 카테고리의 다른 글
| MySQL 형변환 (0) | 2025.06.21 |
|---|---|
| MySQL에서 변수 사용하기 (1) | 2025.06.20 |
| MySQL SubQuery 활용 (1) | 2025.06.18 |
| MySQL SELECT 문 사용방법 (0) | 2025.06.17 |
| MySQL DML 문법 (INSERT, UPDATE, DELETE) (0) | 2025.06.16 |