情報は別々のテーブルに分かれて保存されていることがあり、それらをまとめるには INNER JOIN ... ON を使います。テーブルの結合は SQL の中心的な機能ですが、とても複雑になることもあります。ここではまず簡単な例から、そして INNER JOIN から始めます。
下にあるとおり、テーブルは 3 つあります。
character: 各キャラクターが 1 行で、一意の識別子(id)で表されます。たとえば 1 は Doogie Howser です。
character_tv_show: 各キャラクターがどの番組に出ているか。
character_actor: 各キャラクターを演じている俳優は誰か。
character_tv_show では、キャラクター名と番組名の両方(たとえば Willow Rosenberg と Buffy the Vampire Slayer)を保存する代わりに、キャラクター名の代わりとして character_id を保存している点に注目してください。この character_id は、character テーブルの対応する id の行を指しています。
こうするのはデータを重複させないためです。たとえばキャラクターの名前が変わっても、1 行だけ直せば済みます。
これにより、その参照用の共通列「で(on)」テーブルどうしを「結合(join)」できます。
各キャラクター名とその番組名を得るには、次のように書けます。
SELECT character.name, character_tv_show.tv_show_name
FROM character
INNER JOIN character_tv_show
ON character.id = character_tv_show.character_id;
これで character の各行と、character_tv_show の対応する行が組み合わされます(逆も同じです)。
注意:
- テーブル名.列名 という書き方を使います。列名 だけを書くと、SQL がどのテーブルのものか取り違えるおそれがあります。
- 上の例のクエリは読みやすさのために複数行に分けていますが、それによって動作が変わることはありません。
内部結合を使って、各キャラクター名とそれを演じる俳優を対応づけられますか? 次の列を選択してください: character.name、character_actor.actor_name