> ## Documentation Index
> Fetch the complete documentation index at: https://villagesql.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# MySQL RIGHT JOIN

> MySQL RIGHT JOIN이 두 번째 테이블의 모든 행을 유지하는 방식, 그것이 두 테이블을 맞바꾼 LEFT JOIN인 이유, 그리고 대부분의 SQL이 대신 LEFT JOIN으로 쓰이는 이유입니다.

> [card] [VillageSQL is a drop-in replacement for MySQL with extensions.](https://villagesql.com/docs/en/8.4/stable/install-server.md)
>
> All examples on this page work on VillageSQL. Install Now →

`RIGHT JOIN`은 일치 여부와 관계없이 오른쪽 테이블의 모든 행을 유지합니다. [LEFT JOIN](https://villagesql.com/docs/ko/tutorial/left-join.md)의 거울상이고 `LEFT JOIN`이 할 수 없는 일은 하나도 하지 않으므로, 이 레슨은 짧습니다. 그래도 다른 사람의 SQL에서 `RIGHT JOIN`을 읽게 될 것이기 때문에 이 레슨이 존재합니다.

시작하기 전에 `mysql -u root -p sakila`로 클라이언트를 여세요.

## RIGHT JOIN의 동작 방식

```sql theme={null}
SELECT COLUMN_LIST
FROM LEFT_TABLE
RIGHT JOIN RIGHT_TABLE ON LEFT_TABLE.COLUMN_NAME = RIGHT_TABLE.COLUMN_NAME;
```

`COLUMN_LIST`를 원하는 열로, `LEFT_TABLE`을 시작하는 테이블로, `RIGHT_TABLE`을 모든 행을 유지하고 싶은 테이블로, 각 `COLUMN_NAME`을 그쪽에서 둘을 잇는 열로 바꾸세요. 아무것과도 일치하지 않는 오른쪽 행은 왼쪽 테이블의 모든 열이 NULL로 설정된 채 돌아옵니다. `RIGHT OUTER JOIN`은 같은 절을 풀어 쓴 것입니다.

## 예제

### 두 번째 테이블의 모든 행 유지하기

`film`이 왼쪽에 있고 `language`가 오른쪽에 있으므로, 이 쿼리는 6개의 언어를 모두 유지합니다.

```sql theme={null}
SELECT l.name, f.title
FROM film AS f
RIGHT JOIN language AS l ON f.language_id = l.language_id
ORDER BY l.name, f.title;
```

```text theme={null}
+----------+-----------------------------+
| name     | title                       |
+----------+-----------------------------+
| English  | ACADEMY DINOSAUR            |
| English  | ACE GOLDFINGER              |
| English  | ADAPTATION HOLES            |
...
+----------+-----------------------------+
1005 rows in set (0.00 sec)
```

1,005개의 행으로, `LEFT JOIN` 레슨이 같은 2개의 테이블을 반대 순서로 써서 얻은 것과 같은 수입니다.

### 아무것과도 일치하지 않은 행 나열하기

왼쪽 조인과 같은 패턴이고, 이번에는 NULL 검사가 왼쪽 테이블에 있습니다.

```sql theme={null}
SELECT f.title, l.name
FROM film AS f
RIGHT JOIN language AS l ON f.language_id = l.language_id
WHERE f.film_id IS NULL
ORDER BY l.name;
```

```text theme={null}
+-------+----------+
| title | name     |
+-------+----------+
| NULL  | French   |
| NULL  | German   |
| NULL  | Italian  |
| NULL  | Japanese |
| NULL  | Mandarin |
+-------+----------+
5 rows in set (0.00 sec)
```

어떤 영화도 쓰지 않는 5개의 언어입니다.

## 모든 RIGHT JOIN은 LEFT JOIN으로 쓸 수 있습니다

`a RIGHT JOIN b`는 `b LEFT JOIN a`와 같은 행을 반환합니다. 2개의 테이블 이름을 바꾸고 키워드를 바꾸면 답은 변하지 않습니다. `SELECT *`를 쓰면 열이 다른 순서로 돌아오는데, `*`가 테이블이 `FROM`에 나타난 순서대로 펼쳐지기 때문이므로, 순서가 중요하다면 열의 이름을 쓰세요.

읽게 되는 대부분의 SQL이 `LEFT JOIN`으로 쓰여 있는 이유가 그것입니다: 쿼리 안의 모든 조인이 같은 방향으로 기울어 있으면 쿼리를 따라가기 더 쉽습니다.

`WHERE` 함정을 포함한 그 밖의 모든 것은 [LEFT JOIN](https://villagesql.com/docs/ko/tutorial/left-join.md) 레슨이 설명하는 그대로, 왼쪽과 오른쪽만 바뀐 채 동작합니다.

## 요약

* 두 번째로 이름을 쓴 테이블의 모든 행을 유지하려면 `RIGHT JOIN`을 쓰세요.
* 아무것과도 일치하지 않은 행에서는 왼쪽의 모든 열에 NULL이 있다고 예상하세요.
* `a RIGHT JOIN b`를 `b LEFT JOIN a`로 읽고, `*` 대신 열의 이름을 쓰세요.
* 직접 쓰는 SQL에서는 `LEFT JOIN`을 쓰세요. 쿼리 안의 조인이 모두 같은 방향으로 기울어지게 됩니다.

## 함께 보기

* [LEFT JOIN](https://villagesql.com/docs/ko/tutorial/left-join.md) — 같은 동작, 그리고 그에 따라오는 함정
* [INNER JOIN](https://villagesql.com/docs/ko/tutorial/inner-join.md) — 일치하는 것만 유지하는 조인
* [조인의 동작 방식](https://villagesql.com/docs/ko/tutorial/joins.md) — 조인의 종류를 가르는 것
* [MySQL JOIN 성능과 흔한 실수](https://villagesql.com/docs/ko/guides/joins.md) — 리뷰어가 다시 쓰라고 요청하는 이유


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.