導入
「集計の途中結果を、いったんどこかに置いておきたい」「本番テーブルを汚さずに作業したい」。そんなときに便利なのが 一時テーブル(temporary table) です。今の接続の間だけ存在し、終われば自動で消える“使い捨ての作業台”です。
説明
CREATE TEMP TABLE(または CREATE TEMPORARY TABLE)で作ります。ふつうのテーブルとの違いは、その接続(セッション)が終わると自動的に消えること。本番のスキーマに残らないので、気軽に使えます。
CREATE TEMP TABLE work AS
SELECT id, name, price FROM products WHERE price >= 5000;
SELECT * FROM work;
CREATE TABLE ... AS SELECT ...(CTAS と呼ばれます)は、「SELECT の結果をそのまま中身にしたテーブルを作る」書き方です。一時テーブルと組み合わせると、「重い集計を一度だけ実行して作業台に置き、そこから何度も参照する」といった使い方ができます。
flowchart LR
S["SELECT の結果"] -->|"CREATE TEMP TABLE ... AS"| W["一時テーブル work<br/>(接続が切れたら自動で消える)"]
W --> Q["何度でも参照・加工"]
第7章で学ぶ CTE(WITH 句)も「途中結果に名前を付ける」道具ですが、CTE がそのクエリ1回かぎりなのに対し、一時テーブルは複数のクエリにまたがって使い回せるのが違いです。作業が済んだら DROP TABLE work; で明示的に消すこともできます。
やってみよう
初期表示のコードを実行し、5000円以上の商品だけを集めた一時テーブル work ができて表示されることを確認しましょう。次に SELECT COUNT(*) FROM work; や SELECT * FROM work WHERE price >= 10000; のように、work をふつうのテーブルのように何度でも参照できることを試してください。
演習
users のうち都市が '東京' の会員だけを集めた一時テーブル tokyo_users を、CREATE TEMP TABLE ... AS SELECT ... で作ってください。
ヒント1を見る
CREATE TEMP TABLE tokyo_users AS SELECT * FROM users WHERE city = '東京';
ヒント2を見る
作ったあと SELECT * FROM tokyo_users; で中身を確認できます。