> ## 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 が 2 番目のテーブルのすべての行を保持する仕組み、それがテーブルを入れ替えた 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/ja/tutorial/left-join.md) の鏡像であり、
`LEFT JOIN` にできないことは何もしないため、このレッスンは短いものです。
このレッスンがあるのは、他の人の SQL でこれを読むことになるからです。

始める前に、`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` は同じ句を
省略せずに綴ったものです。

## 例

### 2 番目のテーブルのすべての行を保持する

`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/ja/tutorial/left-join.md)
のレッスンが説明するとおりに、左と右を入れ替えた形で動作します。

## まとめ

* 2 番目に名前を挙げたテーブルのすべての行を保持するには `RIGHT JOIN` を使います。
* 何にも一致しなかった行では、左側のすべての列が NULL になると考えてください。
* `a RIGHT JOIN b` は `b LEFT JOIN a` として読み、`*` を使うのではなく列名を明示します。
* 自分が書く SQL では `LEFT JOIN` を優先し、クエリ内の結合がすべて同じ方向に傾くようにします。

## 関連項目

* [LEFT JOIN](https://villagesql.com/docs/ja/tutorial/left-join.md) — 同じ動作と、それに伴う罠
* [INNER JOIN](https://villagesql.com/docs/ja/tutorial/inner-join.md) — 一致した行だけを保持する結合
* [結合の仕組み](https://villagesql.com/docs/ja/tutorial/joins.md) — 結合の種類を分けるもの
* [MySQL の JOIN のパフォーマンスとよくある間違い](https://villagesql.com/docs/ja/guides/joins.md) — レビュアーが書き直しを求める理由


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