[TIL] 내일배움캠프 61일차_[MySQL] 예시로 알아보는 JOIN의 종류
👀Today I Learn
JOIN
- JOIN 연산은 두 테이블을 결합하는 연산
- 예시 데이터
-
테이블 1 : employees
id name department_id 1 Alice 1 2 Bob 2 3 Charlie NULL 4 David 3 -
테이블 2 : departments
id department_name 1 HR 2 Engineering 3 Marketing 4 Sales
-
1. INNER JOIN
- 두 테이블에서 일치하는 행만 반환
- 일치 조건(ON 절)에 부합하는 데이터만 반환
-
예시
SELECT employees.name, departments.department_name FROM employees INNER JOIN departments ON employees.department_id = departments.id
-
결과
name department_name Alice HR Bob Engineering David Marketing employees.department_id
와departments.id
가 일치하는 행만 반환Charlie
는department_id
가NULL
이므로 반환되지 않음
2. LEFT JOIN (또는 LEFT OUTER JOIN)
- 왼쪽 테이블의 모든 행과, 일치하는 오른쪽 테이블의 행을 반환
- 오른쪽 테이블에 일치하는 행이 없으면 NULL로 채워짐
-
예시
SELECT employees.name, departments.department_name FROM employees LEFT JOIN departments ON employees.department_id = departments.id
-
결과
name department_name Alice HR Bob Engineering Charlie NULL David Marketing employees
테이블의 모든 행이 반환되고, 일치하지 않는department_id
는 NULL로 채워짐Charlie
는 부서가 없기 때문에department_name
이NULL
로 표시
3. RIGHT JOIN (또는 RIGHT OUTER JOIN)
- 오른쪽 테이블의 모든 행과, 일치하는 왼쪽 테이블의 행을 반환
- 왼쪽 테이블에 일치하는 행이 없으면 NULL로 채워짐
-
예시
SELECT employees.name, departments.department_name FROM employees RIGHT JOIN departments ON employees.department_id = departments.id
-
결과
name department_name Alice HR Bob Engineering David Marketing NULL Sales departments
테이블의 모든 행이 반환employees.department_id
와 일치하지 않는departments.id
의 경우,employees.name
은NULL
로 표시Sales
부서에는 직원이 없으므로name
이NULL
4. FULL JOIN (또는 FULL OUTER JOIN)
- 두 테이블의 모든 행을 반환하며, 일치하지 않는 행은 NULL로 채워짐
- MySQL은 FULL OUTER JOIN을 기본적으로 지원하지 않지만, UNION을 통해 구현할 수 있음
-
예시
SELECT employees.name, departments.department_name FROM employees LEFT JOIN departments ON employees.department_id = departments.id UNION SELECT employees.name, departments.department_name FROM employees RIGHT JOIN departments ON employees.department_id = departments.id
-
결과
name department_name Alice HR Bob Engineering Charlie NULL David Marketing NULL Sales - 두 테이블의 모든 데이터를 반환하며, 어느 한쪽에 데이터가 없는 경우
NULL
로 표시 Charlie
는 부서가 없고,Sales
부서에는 직원이 없기 때문에 각각NULL
값이 포함
- 두 테이블의 모든 데이터를 반환하며, 어느 한쪽에 데이터가 없는 경우
5. CROSS JOIN
- 두 테이블의 행을 모두 조합한 결과를 반환
- 카티션 곱(Cartesian Product)을 생성
-
예시
SELECT employees.name, departments.department_name FROM employees CROSS JOIN departments
-
결과
name department_name Alice HR Alice Engineering Alice Marketing Alice Sales Bob HR Bob Engineering Bob Marketing Bob Sales Charlie HR Charlie Engineering Charlie Marketing Charlie Sales David HR David Engineering David Marketing David Sales employees
와departments
의 모든 행 조합이 반환- 이 경우 모든 직원과 모든 부서가 서로 연결
6. SELF JOIN
- 테이블을 자기 자신과 조인
- 동일 테이블의 데이터를 비교하거나 계층적 데이터를 처리할 때 유용
-
예시
SELECT A.name AS Employee, B.name AS Manager FROM employees A INNER JOIN employees B ON A.id = B.department_id
-
결과
Employee Manager David Bob employees
테이블을 자기 자신과 조인하여, 직원과 그 직원의 부서 관리자를 연결David
는Bob
이 관리하는 부서에 속해 있음
7. NATURAL JOIN
- 동일한 이름의 열을 기준으로 두 테이블을 조인(ON 절을 명시할 필요가 없음)
- 열 이름이 정확히 일치해야 함
-
예시
SELECT employees.name, departments.department_name FROM employees NATURAL JOIN departments
-
결과
name department_name Alice HR Bob Engineering David Marketing - 두 테이블에서 동일한 이름을 가진 열(id)을 기준으로 자동으로 조인
Charlie
는 일치하는 부서가 없기 때문에 결과에 포함되지 않음
🪄 요약
JOIN 유형 | 설명 | NULL 포함 여부 |
---|---|---|
INNER JOIN | 일치 조건을 만족하는 데이터만 반환 | 포함 안 함 |
LEFT JOIN | 왼쪽 테이블의 모든 행과 일치하는 데이터, 없으면 NULL로 표시 | 왼쪽 테이블 기준 NULL 포함 |
RIGHT JOIN | 오른쪽 테이블의 모든 행과 일치하는 데이터, 없으면 NULL로 표시 | 오른쪽 테이블 기준 NULL 포함 |
FULL JOIN | 두 테이블의 모든 데이터를 반환, 없으면 NULL로 표시 | 양쪽 모두 NULL 포함 |
CROSS JOIN | 두 테이블의 카티션 곱 반환 | N/A |
SELF JOIN | 자기 자신과 조인 | N/A |
NATURAL JOIN | 동일한 이름의 열을 기준으로 조인 | N/A |
💡Today I Thought
오늘의 체크리스트
- 알고리즘 코드카타 266-270
- SQL 코드카타 90-91
- TIL 작성
댓글남기기