メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
ここまでのクエリはすべて 1 つのテーブルを読んできました。実際のデータベースは 情報を多数のテーブルに分散しており、結合はそれらをまたいで読む方法です。この レッスンでは、結合が何をするのか、そして各種類が何のためにあるのかを説明 します。この後のレッスンでは、各種類を順に取り上げます。 始める前に mysql -u root -p sakila でクライアントを開いてください。

データが分かれている理由

Sakila は各映画の言語を数値として記録しています。
その数値に対応する名前は、専用のテーブルにあります。
English という単語を 1 回保存して 1,000 回それを指すほうが、1,000 回保存する より場所を取らず、綴りの修正も 1,000 行ではなく 1 行の変更で済みます。その 代償として、タイトルと言語名が欲しいクエリは両方のテーブルを読まなければ なりません。

結合の仕組み

COLUMN_LIST を欲しい列に、LEFT_TABLE を起点にするテーブルに、 RIGHT_TABLE を追加の列を取り出すテーブルに、各 COLUMN_NAME をそれぞれの 側で 2 つのテーブルをつなぐ列に置き換えます。 サーバーは左テーブルの各行を取り、ON 条件が真になる右テーブルの行を 見つけ、一致ごとに 1 つの結合された行を返します。

例

  1. 数値の代わりに名前を読む

AS f と AS l はテーブルのエイリアスです。 次のレッスンで扱います。

結合の種類は何のためにあるか

種類の違いは 1 点だけです。一致が見つからなかった行がどうなるかです。 外部結合が残した一致しない行も、値を持たない列を埋めなければならず、 NULL で埋めます。LEFT JOIN の横に IS NULL がよく現れる のはそのためです。それが、何にも一致しなかった行を求める方法です。 CROSS JOIN は行の突き合わせを行わないので、仲間外れです。すべての組み合わせが 欲しいときに意図的に使うものであり、ON 句を書き忘れたときに偶然得られる ものでもあります。

キーワードより条件が重要

MySQL では JOIN、INNER JOIN、CROSS JOIN は 1 つのものであり、文法上は どれにも ON 句を付けても付けなくても構いません。つまり、入力したキーワード が結果を決めるのではありません。ON 条件の有無が決めます。あれば一致が 得られ、なければすべての組み合わせが得られます。3 つの語のどれを書いたかは 関係ありません。 サーバーは区別してくれないので、一致を意味するときは INNER JOIN ... ON と 書き、すべての組み合わせを意味するときは ON なしの CROSS JOIN と書いて ください。そうすればキーワードは、サーバーへの命令ではなく次の読み手への メモになります。

まとめ

  • 情報はテーブルをまたいで分かれており、1 つのテーブルが id で別のテーブルを指しています。
  • それらのテーブルを 1 つのクエリでまたいで読むには結合を使います。
  • ON 条件は、どの行同士が対応するかのルールと読みます。
  • 何にも一致しない行がどうなるべきかで、結合の種類を選びます。
  • 外部結合が一致なしで残した行の列には NULL が入ります。

関連項目