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 でクライアントを開いてください。
CTE の仕組み
CTE_NAME を中間結果の名前に、COLUMN_LIST を必要な列に、TABLE_NAME を内側の
クエリが読むテーブルに置き換えます。メインクエリは CTE_NAME をテーブルで
あるかのように読みます。
CTE は 1 つの文の間だけ存続します。保存されず、次のクエリはそれについて何も
知りません。
例
- 名前付きのステップ 1 つ
FROM から外に出され、名前を
与えられています。
- 前のステップの上に積む複数のステップ
CTE はカンマで区切り、後の CTE は前の CTE を読めます。これは派生テーブルが、
繰り返しなしにはできないことです。
busiest は counts を読み、メインクエリは両方を読みます。派生テーブルとして
書くと、集計クエリは 2 回現れることになります。
CTE が派生テーブルより優れている点
行はどちらでも同じです。異なるのは 2 点です。- CTE は名前を持つため、3 段階のクエリが上から下へ読めます。
countsとbusiestは、次の読者に各部品が何のためのものかを伝えます。 - CTE は同じ文の中で名前で複数回参照できます。派生テーブルはもう一度書き出さなければ なりません。
まとめ
- それを読むクエリの前にクエリに名前を付けるには
WITH name AS (...)を使います。 - 複数の CTE はカンマで区切り、後の CTE に前の CTE を読ませます。
- CTE は 1 つの文の間だけ存続すると考えてください。
- クエリが複数の段階を持つ、または同じサブクエリを繰り返すときは CTE を使います。
関連項目
- 派生テーブル — 同じ考えをインラインで書いたもの
- 再帰 CTE — 自分自身を読む CTE
- GROUP BY — 内側のステップが通常行うこと
- MySQL の CTE が派生テーブルより優れる場合 — オプティマイザがそれらをどう扱うか