취준이랄까../SQLD

MY sql, join 종류, inner / outer / left / right

넹넹선생님 2024. 10. 31. 14:13
728x90
반응형

SQL에서 `JOIN`은 두 테이블을 특정 조건에 맞춰 결합할 때 사용하는 방법입니다. 각 `JOIN` 유형의 차이를 예제를 통해 설명하겠습니다.

### 예제 테이블
두 개의 테이블이 있습니다.

#### 학생 테이블 (Students)
| Student_ID | Student_Name |
|------------|--------------|
| 1          | Alice        |
| 2          | Bob          |
| 3          | Charlie      |
| 4          | David        |

#### 수업 테이블 (Courses)
| Course_ID | Student_ID | Course_Name |
|-----------|------------|-------------|
| 101       | 1          | Math        |
| 102       | 2          | Science     |
| 103       | 1          | Literature  |
| 104       | 5          | History     |

위에서 `Students` 테이블은 학생의 정보를, `Courses` 테이블은 학생이 듣는 수업 정보를 저장하고 있습니다. 이제 `Student_ID`를 기준으로 `JOIN`을 사용해 두 테이블을 결합하는 경우를 살펴보겠습니다.

---

### 1. INNER JOIN
`INNER JOIN`은 두 테이블의 **공통된 데이터만 결합**합니다. 즉, `Student_ID`가 `Students`와 `Courses` 모두에 존재하는 행만 반환합니다.

```sql
SELECT Students.Student_ID, Students.Student_Name, Courses.Course_Name
FROM Students
INNER JOIN Courses ON Students.Student_ID = Courses.Student_ID;
```

#### 결과
| Student_ID | Student_Name | Course_Name |
|------------|--------------|-------------|
| 1          | Alice        | Math        |
| 1          | Alice        | Literature  |
| 2          | Bob          | Science     |

- 여기서 `Student_ID`가 `1`과 `2`인 학생들만 결과에 포함됩니다. `Courses`에 없는 `Student_ID 3`과 `Students`에 없는 `Student_ID 5`는 제외됩니다.

---

### 2. LEFT JOIN
`LEFT JOIN`은 **왼쪽(기준) 테이블의 모든 데이터**를 가져오고, 오른쪽 테이블에 일치하는 데이터가 없는 경우 `NULL`로 표시합니다.

```sql
SELECT Students.Student_ID, Students.Student_Name, Courses.Course_Name
FROM Students
LEFT JOIN Courses ON Students.Student_ID = Courses.Student_ID;
```

#### 결과
| Student_ID | Student_Name | Course_Name |
|------------|--------------|-------------|
| 1          | Alice        | Math        |
| 1          | Alice        | Literature  |
| 2          | Bob          | Science     |
| 3          | Charlie      | NULL        |
| 4          | David        | NULL        |

- `Student_ID`가 `3`과 `4`인 학생들은 `Courses`에 매칭되는 데이터가 없기 때문에 `NULL`로 표시됩니다.

---

### 3. RIGHT JOIN
`RIGHT JOIN`은 **오른쪽(조인 대상) 테이블의 모든 데이터**를 가져오고, 왼쪽 테이블에 일치하는 데이터가 없을 경우 `NULL`로 표시합니다.

```sql
SELECT Students.Student_ID, Students.Student_Name, Courses.Course_Name
FROM Students
RIGHT JOIN Courses ON Students.Student_ID = Courses.Student_ID;
```

#### 결과
| Student_ID | Student_Name | Course_Name |
|------------|--------------|-------------|
| 1          | Alice        | Math        |
| 1          | Alice        | Literature  |
| 2          | Bob          | Science     |
| NULL       | NULL         | History     |

- `Course_ID 104`와 관련된 수업인 `History`는 `Students`에 `Student_ID` 5가 없으므로, `NULL`로 표시됩니다.

---

### 4. FULL OUTER JOIN
`FULL OUTER JOIN`은 **두 테이블의 모든 데이터**를 가져오며, 일치하지 않는 부분은 `NULL`로 표시합니다.

```sql
SELECT Students.Student_ID, Students.Student_Name, Courses.Course_Name
FROM Students
FULL OUTER JOIN Courses ON Students.Student_ID = Courses.Student_ID;
```

#### 결과
| Student_ID | Student_Name | Course_Name |
|------------|--------------|-------------|
| 1          | Alice        | Math        |
| 1          | Alice        | Literature  |
| 2          | Bob          | Science     |
| 3          | Charlie      | NULL        |
| 4          | David        | NULL        |
| NULL       | NULL         | History     |

- `Student_ID`가 `3`과 `4`인 학생들처럼 `Courses`에 일치하는 값이 없는 경우, `NULL`로 표시됩니다.
- `Course_ID`가 `104`인 `History`처럼 `Students`에 일치하는 값이 없는 경우, `NULL`로 표시됩니다.

---

이렇게 각 `JOIN` 유형은 특정 조건에 따라 데이터의 결합 방식을 결정하며, 데이터가 없는 경우 `NULL`로 대체해 보여줍니다.

728x90
반응형

'취준이랄까.. > SQLD' 카테고리의 다른 글

my sql, case when  (0) 2024.10.31
my sql, 정규표현식  (1) 2024.10.31
실수 가능, mysql, distinct  (0) 2024.10.31
MYSQL) SUBSTRING, SUBSTRING_INDEX  (0) 2024.10.31
union all 쿼리시 틀릴 수 있는 부분  (0) 2024.10.31