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

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

All examples on this page work on VillageSQL. Install Now →
WHERE のサブクエリは値を供給します。FROM のサブクエリはテーブル全体を供給し、 外側のクエリはそれを実在するテーブルであるかのように読みます。それが派生テーブル であり、クエリの結果をクエリする方法です。 始める前に mysql -u root -p sakila でクライアントを開いてください。

派生テーブルの仕組み

COLUMN_LIST を必要な列に、TABLE_NAME を内側のクエリが読むテーブルに、 ALIAS_NAME を結果の名前に置き換えます。内側のクエリの列名は、エイリアスを含めて、 派生テーブルの列になります。 サーバーはまず内側の結果を作り、それから外側のクエリをその上で実行します。

可能になること

GROUP BY は詳細行をグループごとの 1 行に置き換えるため、グループ化したクエリは 行そのものを見せてくれません。派生テーブルは両方を保ちます。内側のクエリで グループ化し、その結果を詳細に結合し直します。 これは、自分のレーティングの平均より長い映画を一覧にし、それぞれの横にその平均を 示します。
WHERE も HAVING も、単独ではこれを書けません。HAVING はグループをフィルタするのでタイトルを捨ててしまい、WHERE はどの平均も存在 しないうちに実行されます。5 つの平均は内側のクエリで 1 回計算され、結合が正しい ものを各映画に付けます。 相関サブクエリのレッスンは、同じ質問に 1 行ずつ答えます。この形は代わりに平均を 1 回だけ計算します。

エイリアスは省略できない

ERROR 1248 は常にこの意味で、修正も常に同じです。閉じ括弧の後に AS SOME_NAME を置きます。名前は何でも構いませんが、行の内容を表すものにする価値があります。 読者は、その行を生成したクエリを読む前にその名前に出会うからです。

派生テーブルか CTE か

共通テーブル式は、サブクエリを先頭に取り出して名前を付け、 同じ仕事をします。2 つの形は同じ行を生成し、次のレッスンでその違いを扱います。 MySQL の CTE が派生テーブルより優れる場合は、 オプティマイザがどちらを異なる扱いにするかを計測しています。

まとめ

  • クエリの結果をクエリするには派生テーブルを使います。
  • エイリアスを付けます。付けないと ERROR 1248 が返ります。
  • 内側のクエリの列エイリアスが派生テーブルの列になると考えてください。
  • 計算した列でフィルタや結合をする必要があるときに使います。
  • クエリが複数の段階を持つ、または同じサブクエリを繰り返すようになったら CTE を使います。

関連項目