Get to the point/ja

From SQLZoo
Language:Project:Language policy English  • 日本語

映画データベース: The JOIN

このデータベースに対するはっきりとした質問は3つのテーブル全てに関わります。 誰がこれこれの映画に出演したか、あるいはどの映画に誰彼が出演したか。 実際、それらの質問に既に見てきた入れ子のSELECT文で回答できます。

Joinでは"共通"のフィールドを持つ2つのテーブルを結合できます。actorテーブルのidフィールドはcastingテーブルのactoridから参照されます。 これらのテーブルの結合で各々のフィールドから両方のテーブルの全ての属性(フィールド)を含むテーブルが生成されます。

2つのテーブルを結合する

castingとactorを actoridとid で結合する。

SELECT * FROM casting JOIN actor
          ON casting.actorid=actor.id
  WHERE actor.name='John Hurt'
SELECT * FROM casting JOIN actor
          ON casting.actorid=actor.id
  WHERE actor.name='John Hurt'

上記の結果はJohn Hurtに関連するcastingテーブルの各要素1つに付き1行が得られます。 actoridに加えて関連する役者の名前も分かります。 (訳者注 castingテーブルにはactoridだけ記載されnameは無い。actorの結合によりnameを得ることができる)

3つのテーブルを結合する

上記のテーブル(訳者注 castingとactorを結合した)とmovieテーブルとの結合は意味があるでしょう。 結合条件のフィールドは明らかにmovieidフィールドです。

movie と casting を id と movieid で結合する。 casting と actor を actoridとidで結合する。

SELECT * FROM
   movie JOIN casting ON movie.id=movieid
         JOIN actor   ON actorid=actor.id
  WHERE actor.name='John Hurt'
SELECT * FROM
   movie JOIN casting ON movie.id=movieid
         JOIN actor   ON actorid=actor.id
  WHERE actor.name='John Hurt'

結果は今回も再びcastingテーブルの各要素1つにつき1行が得られます。 今回は役者の名前と同様に映画の詳細が得られます。

注 これまでたびたびフィールドに関して単にそのままフィールド名を使っていました。(例 actorid) テーブル名に続けてフィールド名を付けますこともあります。(例 casting.actorid) フィールド名が固有でない場合はテーブル名を含める必要が有ります。