VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
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 つの結合された行を返します。
例
- 数値の代わりに名前を読む
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 が入ります。
関連項目
- テーブルのエイリアスと INNER JOIN — 短い名前と、一致だけを残す結合
- LEFT JOIN と RIGHT JOIN — 一致しない行を残す結合
- CROSS JOIN と自己結合 — すべての組み合わせと、自分自身と結合するテーブル
- MySQL の JOIN のパフォーマンスとよくある間違い — テーブルが大きくなったときに起きる問題