1. JOIN이란?
- JOIN은 말 그대로 “결합”이라는 의미이며, 두 개 이상의 테이블을 합쳐 하나의 결과로 만드는 것을 말합니다.
- 하나의 테이블만으로는 부족한 정보(예:
주문 테이블 + 고객 정보 테이블)를 연결해서 볼 때 주로 사용됩니다.
- 대표적인 JOIN 유형:
- INNER JOIN
- LEFT JOIN
- RIGHT JOIN
- FULL OUTER JOIN
- (MySQL은 FULL OUTER JOIN을 직접 지원하지 않지만 UNION을 통해 구현 가능)
- CROSS JOIN (Cartesian product, 데카르트 곱)
2. INNER JOIN
- INNER JOIN은 양쪽 테이블에 공통된 조건(매칭되는 값)이 있는 행만 조회
- 가장 흔히 사용되며, 보통
JOIN이라고만 써도 INNER JOIN을 의미할 때가 많습니다.
- 예시:
sql
코드 복사
SELECT A.*, B.*
FROM TableA A
INNER JOIN TableB B ON A.key = B.key;
A.key = B.key로 양쪽 테이블의 key가 일치하는 레코드만 결과로 반환
3. LEFT JOIN
- LEFT JOIN(또는 LEFT OUTER JOIN)은 왼쪽 테이블(A)에 있는 모든 행은 무조건 가져오고,오른쪽 테이블(B)에 매칭되는 값이 있으면 해당 컬럼을 채워주고, 만약 매칭되는 값이 없으면 NULL로 표시
- 예시:
sql
코드 복사
SELECT A.*, B.*
FROM TableA A
LEFT JOIN TableB B ON A.key = B.key;
TableA에 존재하나 TableB에 해당 key가 없으면, B.* 부분은 NULL이 됩니다.
4. RIGHT JOIN
- RIGHT JOIN(또는 RIGHT OUTER JOIN)은 오른쪽 테이블(B)에 있는 모든 행은 무조건 가져오고,왼쪽 테이블(A)에 매칭되는 값이 없으면 NULL 처리
- 예시:
sql
코드 복사
SELECT A.*, B.*
FROM TableA A
RIGHT JOIN TableB B ON A.key = B.key;
TableB에 존재하나 TableA에 해당 key가 없으면, A.* 부분은 NULL이 됩니다.
- LEFT JOIN과는 반대되는 개념이지만, 실제로는 LEFT JOIN이 훨씬 자주 쓰입니다.
5. FULL OUTER JOIN
- FULL OUTER JOIN은 양쪽 테이블(A, B) 어느 한쪽에만 존재하는 행도 모두 가져오는 JOIN 방식
- 결과적으로 INNER JOIN + LEFT ONLY + RIGHT ONLY까지 모두 포함된 형태
- MySQL에서는 기본적으로 FULL OUTER JOIN을 지원하지 않아, 다음과 같이 LEFT JOIN과 RIGHT JOIN을 UNION해서 사용합니다.
sql
코드 복사
SELECT A.*, B.*
FROM TableA A
LEFT JOIN TableB B ON A.key = B.key
UNION
SELECT A.*, B.*
FROM TableA A
RIGHT JOIN TableB B ON A.key = B.key;
- 다른 DBMS(Oracle, PostgreSQL, MS SQL Server 등)에서는
FULL OUTER JOIN 구문을 지원하기도 합니다.
6. CROSS JOIN (Cartesian Join)
- CROSS JOIN은 조건 없이 모든 레코드를 서로 곱(Cartesian product)하는 방식
- A 테이블에 4개 행, B 테이블에 3개 행이 있으면 결과는
4 x 3 = 12개 행
- 예시:
sql
코드 복사
SELECT A.*, B.*
FROM TableA A
CROSS JOIN TableB B;
- 보통 의도적으로 사용되는 경우는 많지 않고, 실수로 조인 조건을 적지 않았을 때 엄청난 수의 결과셋이 나올 수 있으니 주의가 필요합니다.
7. 간단 비교 요약
- INNER JOIN: 두 테이블에서 매칭되는 행만 반환
- LEFT JOIN: 왼쪽 테이블의 모든 행 + 오른쪽 테이블의 매칭된 행
- RIGHT JOIN: 오른쪽 테이블의 모든 행 + 왼쪽 테이블의 매칭된 행
- FULL OUTER JOIN: 양쪽 테이블에 있는 모든 행 (매칭 안 된 것도 포함)
- CROSS JOIN: 조건 없이 모든 행을 곱 (Cartesian product)
| JOIN 유형 | 포함 범위 | MySQL 지원 여부 |
|---|
| INNER JOIN | A와 B 모두 매칭되는 행만 | O |
| LEFT JOIN | A 전체 + B 매칭 | O |
| RIGHT JOIN | B 전체 + A 매칭 | O |
| FULL OUTER JOIN | A + B 전체 (매칭 안 된 행 포함) | X (Union으로 간접 구현) |
| CROSS JOIN | A x B 데카르트 곱 | O |
8. 실무 팁 & 주의사항
- 조인 조건(ON 절) 누락 주의
- 조건 없이 JOIN(특히 CROSS JOIN)하면 엄청난 행이 생성될 수 있음
- 조인 순서
- 대체로 INNER JOIN → OUTER JOIN 순서로 나열하는 편이 가독성 좋음
- 필요한 컬럼만 SELECT
A.*, B.* 식으로 모두 다 SELECT 시, 불필요한 데이터까지 불러와 성능 저하 가능
- 별칭(Alias) 명시
- 같은 이름의 컬럼(A.id, B.id)이 있을 때 충돌 방지
SELECT A.id AS a_id, B.id AS b_id, A.name, B.desc ...
마무리
- JOIN을 잘 이해하면 관계형 데이터베이스에서 복수 테이블을 연결해 풍부한 정보를 얻을 수 있습니다.
- 각 JOIN의 특성을 숙지하고, 비즈니스 로직에 맞는 방식(INNER, LEFT, RIGHT, FULL, CROSS)을 적절히 선택하세요.
- 특히 MySQL에서는 FULL OUTER JOIN이 직접 지원되지 않으니, LEFT + RIGHT + UNION 방식을 기억해두면 유용합니다.
이상으로 SQL JOIN 전반에 대한 개념과 예시를 살펴봤습니다.