왼쪽 테이블을 기준으로 오른쪽 테이블을 결합하는 방식, 결합할 데이터가 없으면 NULL 처리.
SELECT u.SEQ
, u.NAME
, c.CODE_NAME
FROM USER u
LEFT JOIN CODE c
ON u.CODE_SEQ = c.CODE_SEQ;
-- 위 LEFT JOIN과 같은 결과 출력
SELECT u.SEQ
, u.NAME
, c.CODE_NAME
FROM CODE c
RIGHT JOIN USER u
ON c.CODE_SEQ = u.CODE_SEQ;
보통 왼쪽에서 오른쪽으로 읽는 습관이 있어서 RIGHT JOIN 보다는,
LEFT JOIN을 압도적으로 많이 사용
결과는 완벽하게 동일
-- 위 LEFT JOIN과 같은 결과 출력
SELECT u.SEQ
, u.NAME
, c.CODE_NAME
FROM USER u
LEFT OUTER JOIN CODE c
ON u.CODE_SEQ = c.CODE_SEQ;
LEFT OUTER JOIN은
매칭되지 않는 데이터도 포함이라는 의미를 명시적으로 강조
LEFT JOIN = LEFT OUTER JOIN
SELECT u.SEQ
, u.NAME
, c.CODE_NAME
FROM USER u
INNER JOIN CODE c
ON u.CODE_SEQ = c.CODE_SEQ;
JOIN 역시 교집합을 표시해주고, INNER JOIN과 같은 결과를 보여줌
-- 위 INNER JOIN과 같은 결과 출력
SELECT u.SEQ
, u.NAME
, c.CODE_NAME
FROM USER u
JOIN CODE c
ON u.CODE_SEQ = c.CODE_SEQ;
| 구분 | JOIN (INNER JOIN) | LEFT JOIN |
|---|---|---|
| 결과 범위 | 매칭 행만 (교집합) | 왼쪽 테이블 전체 + 매칭/NULL |
| 매칭 실패 | 행 제외 | 오른쪽 NULL로 채움 |
| 성능 | 상대적으로 빠름 | 느릴 수 있음 |
단, 인덱스(Index)가 잘 설정되어 있다면 성능 차이가 미미해질 수 있음.
FROM 절에 테이블들을 쉼표(,)로 나열하는 방식으로, JOIN 조건은 WHERE절에서 처리
JOIN 키워드를 직접 쓰지 않음-- 위 INNER JOIN과 같은 결과 출력
SELECT u.SEQ
, u.NAME
, c.CODE_NAME
FROM USER u
, CODE c
WHERE u.CODE_SEQ = c.CODE_SEQ;
INNER JOIN은 WHERE에서 조건을 정의하므로, COMMA JOIN에 비해 오류 발생 가능성이 높다
| 구분 | INNER JOIN | COMMA JOIN |
|---|---|---|
| 문법 | ON 절 명시적 | WHERE 절 조건 (구식) |
| 우선순위 | 높음 (LEFT JOIN 등과 혼용 안전) | 낮음 (오류 발생 가능) |
| 가독성 | 높음 (JOIN 조건 명확) | 낮음 (복잡 쿼리에서 혼란) |
| 표준 | 현재 권장 표준 | 과거 방식 (지양) |
COMMA JOIN에서 조건이 없으면 카티션 곱 (Cartesian Product)이 발생하여 많은 양의 데이터가 출력될 수 있음
두 테이블의 모든 행을 조합해 카티션 곱을 생성
ON절이 없음 (JOIN 조건이 없음)SELECT u.SEQ
, u.NAME
, c.CODE_NAME
FROM USER u
CROSS JOIN CODE c
| 구분 | CROSS JOIN | LEFT JOIN |
|---|---|---|
| 핵심 키워드 | 모든 조합 (카티션 곱) | 기존 테이블 보존 |
조인 조건 (ON) | 없음 | 필수 |
| 결과 행 | (A 테이블 행 수) (B 테이블 행 수) | 최소 (A 테이블 행 수) 이상 |
| NULL 발생 | 발생하지 않음 | 오른쪽 테이블 매칭 안 될 시 발생 |
| 성능 | 대용량 시 폭발적 증가 | 조건 최적화 가능 |
지금까지 내가 실전에서 활용해본 JOIN만 리마인드차 정리해보았다.
이어서는 FULL OUTER JOIN, SELF JOIN 그 외 ANTI JOIN, SEMI JOIN등을 학습할 것이다.