3秒でわかる
FROM 句の中に書いたサブクエリを、その場限りのテーブルとして扱う書き方。集計した結果をさらに絞り込みたいときに使います。
もう少し詳しく
どういうものか
導出テーブルは、FROM 句や JOIN の対象としてサブクエリを書き、その結果セットを一時的なテーブルとして扱う仕組みです。インラインビューとも呼ばれます。実体としてデータベースに残るものではなく、そのクエリを実行している間だけ存在します。
多くの製品で別名(エイリアス)を付けることが必須です。MySQL では名前を付けないと構文エラーになります。
なぜ必要か
集計した結果に対して、さらに条件を付けたり結合したりしたい場面があるためです。WHERE は集計の前に評価されるので、SUM() の結果で絞り込むことはできません。いったん集計した結果を導出テーブルにしてしまえば、それはただのテーブルなので、通常どおり条件も結合も書けます。
具体例
-- 合計購入額が 10000 円を超える顧客だけを、顧客名つきで出す
SELECT c.name, t.total
FROM (
SELECT customer_id, SUM(price * quantity) AS total
FROM orders
GROUP BY customer_id
) AS t
JOIN customers AS c ON c.id = t.customer_id
WHERE t.total > 10000
ORDER BY t.total DESC;内側のサブクエリが顧客ごとの合計を作り、外側はそれを 1 枚のテーブルとして扱っています。
つまずきやすいところ
導出テーブルの中で定義した別名は、外側からは新しい列名でしか参照できません。上の例で外側から SUM(price * quantity) とは書けず、t.total と書きます。
入れ子が深くなると読めなくなるのも実務での問題です。二段以上重ねたくなったら、WITH 句(共通テーブル式)に切り出すと、名前が付いて上から順に読めるようになります。同じ結果を二か所で使いたい場合も、導出テーブルでは二度書くことになりますが、WITH なら一度で済みます。
似た用語との違い
| 書き方 | 置き場所 | 寿命 |
|---|---|---|
| 導出テーブル | FROM 句の中 | そのクエリの実行中だけ |
| 共通テーブル式(WITH) | クエリの先頭 | そのクエリの実行中だけ。名前を付けて再利用できる |
| ビュー | データベースに定義を保存 | 削除するまで残る |
| 一時テーブル | セッション内に実体を作る | 接続が切れるまで |
覚え方
「その場で作って、使い終わったら消える表」です。実体を持たないので、名前を付けないと外側から呼べません。