2025. 1. 25. 13:40ㆍBackend/Database
테이블 예시
1. INNER JOIN
두 테이블의 교집합의 결과만 가져온다.
SELECT *
FROM table_1 t1
JOIN table_2 t2 -- INNER 생략 가능
ON t1.num = t2.num; -- USING(num) 컬럼명이 같을 경우 USING 사용가능
2. LEFT OUTER JOIN
조인문의 왼쪽에 있는 테이블의 모든 결과를 가져 온 후
-> 오른쪽 테이블의 데이터를 매칭하고
-> 매칭되는 데이터가 없는 경우 NULL로 표시한다.
SELECT *
FROM table_1 t1
LEFT JOIN table_1 t2 --OUTER 생략가능
ON t1.num = t2.num;
3. RIGHT OUTER JOIN
조인문의 오른쪽에 있는 테이블의 모든 결과를 가져온 후
-> 왼쪽의 테이블의 데이터를 매칭하고
-> 매칭되는 데이터가 없는 경우 NULL을 표시한다.
SELECT *
FROM table_1 t1
RIGHT JOIN table_1 t2 --OUTER 생략가능
ON t1.num = t2.num;
4. FULL OUTER JOIN (Oracle에만 있음)
LEFT OUTER JOIN + RIGHT OUTER JOIN
즉, 두 테이블의 모든 행을 포함하며, 일치하는 데이터가 없으면 NULL로 채운다.
MYSQL에서는 FULL OUTER JOIN을 지원하지 않으므로
LEFT JOIN과 RIGHT JOIN을 UNION으로 결합하여 비슷한 결과를 낼 수 있다.
-- ORACLE
SELECT *
FROM table_1 t1
FULL JOIN table_1 t2 --OUTER 생략가능
ON t1.num = t2.num;
-- MYSQL
SELECT * from test_1 t1
LEFT JOIN test_2 t2
ON t1.NUM = t2.NUM
UNION
SELECT * from test_1 t1
RIGHT JOIN test_2 t2
ON t1.NUM = t2.NUM
5. NATURAL JOIN (자연 조인)
두 테이블에서 같은 이름을 가진 컬럼을 자동으로 찾아 조인하는 방식
즉, ON 조건 없이도 같은 컬럼명이 있으면 자동으로 매칭된다.
SELECT *
FROM table_1 t1
NATURAL JOIN table_1 t2 -- INNER JOIN과 동일하게 동작
NATURAL LEFT JOIN table_1 t2 -- LEFT OUTER JOIN과 동일하게 동작
NATURAL RIGHT JOIN table_1 t2 -- RIGHT OUTER JOIN과 동일하게 동작
그러나 table_1과 table_2 테이블에서 동일한 컬럼명 num을 찾아 자동으로 조인
의도치 않게 다른 컬럼까지 조인될 수 있어서 잘 사용하지 않는 편이다.
* NATURAL JOIN은 오라클과 MySQL이 다르게 동작한다.
오라클은 컬럼명과 값이 모두 같은 경우에만 조인되고, MySQL은 컬럼명만 같아도 INNER JOIN을 진행하므로 같은 SQL문이어도 결과 값이 다르다. 그러므로 NATURAL JOIN보다 명시적인 JOIN을 사용하는 것이 바람직하다.
6. CROSS JOIN (교차 조인)
두 테이블의 모든 행을 곱집합(카테시안 곱) 형태로 반환
즉, 하나의 테이블에 있는 모든 행과 다른 테이블의 모든 행을 조합해 모든 경우의 수를 생성
SELECT *
FROM table_1 t1
CROSS JOIN table_1 t2
JOIN 유형 정리
JOIN 유형 | 설명 | NULL 표함 여부 |
INNER JOIN | 조인 조건을 만족하는 행만 가져옴 | ❌ |
LEFT OUTER JOIN | 왼쪽 테이블의 모든 행 + 오른쪽 테이블에서 일치하는 행 | ✅ (오른쪽 NULL) |
RIGHT OUTER JOIN | 오른쪽 테이블의 모든 행 + 왼쪽 테이블에서 일치하는 행 | ✅ (왼쪽 NULL) |
FULL OUTER JOIN | 두 테이블의 모든 행 포함 (일치하지 않으면 NULL) | ✅ (양쪽 NULL) |
NATURAL JOIN | 같은 이름의 컬럼을 자동으로 찾아 조인 | ❌ (자동 매칭) |
CROSS JOIN | 두 테이블의 모든 행을 곱집합으로 조인 | ❌ (모든 조합 생성) |