VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
RIGHT JOIN は、一致するかどうかにかかわらず、右側のテーブルのすべての行を
保持します。これは LEFT JOIN の鏡像であり、
LEFT JOIN にできないことは何もしないため、このレッスンは短いものです。
このレッスンがあるのは、他の人の SQL でこれを読むことになるからです。
始める前に、mysql -u root -p sakila でクライアントを開いてください。
RIGHT JOIN の仕組み
COLUMN_LIST を欲しい列に、LEFT_TABLE を起点にするテーブルに、
RIGHT_TABLE をすべての行を保持したいテーブルに、各 COLUMN_NAME を
その側で両者をつなぐ列に置き換えます。何にも一致しない右側の行は、左側の
テーブルのすべての列が NULL になって返ります。RIGHT OUTER JOIN は同じ句を
省略せずに綴ったものです。
例
- 2 番目のテーブルのすべての行を保持する
film が左側で language が右側なので、これは 6 つの言語すべてを保持します。
LEFT JOIN のレッスンが同じ 2 つのテーブルを逆の順序で結合して
得たのと同じ行数です。
- 何にも一致しなかった行を一覧にする
左結合と同じパターンですが、今度は NULL のテストが左側のテーブルに対して
行われます。
すべての RIGHT JOIN は LEFT JOIN として書ける
a RIGHT JOIN b は b LEFT JOIN a と同じ行を返します。2 つのテーブル名を
入れ替え、キーワードを入れ替えても、答えは変わりません。SELECT * では列が
異なる順序で返ります。* は FROM にテーブルが現れる順序で展開されるため
です。順序が重要なら、列名を明示してください。
あなたが読む SQL のほとんどは、その理由から LEFT JOIN で書かれています。
クエリ内のすべての結合が同じ方向に傾いていると、クエリは追いやすくなります。
WHERE の罠を含め、これに関する他のすべては、LEFT JOIN
のレッスンが説明するとおりに、左と右を入れ替えた形で動作します。
まとめ
- 2 番目に名前を挙げたテーブルのすべての行を保持するには
RIGHT JOINを使います。 - 何にも一致しなかった行では、左側のすべての列が NULL になると考えてください。
a RIGHT JOIN bはb LEFT JOIN aとして読み、*を使うのではなく列名を明示します。- 自分が書く SQL では
LEFT JOINを優先し、クエリ内の結合がすべて同じ方向に傾くようにします。
関連項目
- LEFT JOIN — 同じ動作と、それに伴う罠
- INNER JOIN — 一致した行だけを保持する結合
- 結合の仕組み — 結合の種類を分けるもの
- MySQL の JOIN のパフォーマンスとよくある間違い — レビュアーが書き直しを求める理由