CodeGym /コース /SQL SELF /分析用の一時テーブルの作成

分析用の一時テーブルの作成

SQL SELF
レベル 59 , レッスン 3
使用可能

PostgreSQLの一時テーブルは、データを一時的に保存するためのテーブルで、セッションやトランザクションが終わると自動的に消える(設定によるけどね)。複雑な操作をシンプルにしたり、クエリの実行を速くしたいときにめっちゃ便利。

たとえば、君が三ツ星レストランのシェフだと想像してみて。サラダ一つのためだけにキッチンに専用のテーブルをずっと置いておく?しないよね?一時テーブルはまさにその「一時的な作業台」みたいなもの。使い終わったら片付ける感じ。

メリット:

  • データの分離: 一時テーブルは今のセッションやトランザクションの中だけで見える。他の人は中身をいじれないよ。
  • 効率的: 複雑なクエリを何度も実行しなくて済むように、中間結果を保存できる。
  • クリーン: 作業が終わったら一時テーブルは自動で消える。

一時テーブル作成の構文

PostgreSQLでは、CREATE TEMP TABLEコマンドで簡単に一時テーブルを作れるよ。

基本の構文:

CREATE TEMP TABLE table_name (
    column_name1 data_type constraints,
    column_name2 data_type constraints,
    ...
);
  • TEMPまたはTEMPORARY — 一時テーブルだよって意味のキーワード。
  • table_name — テーブル名。好きに決めていいけど、意味のある名前にしよう。
  • column_name — カラム名。
  • data_type — カラムのデータ型(INTEGERTEXTDATEなど)。
  • constraints — 制約、例えばNOT NULLUNIQUEなど。

シンプルな一時テーブルの作成例:

CREATE TEMP TABLE temp_sales (
    id SERIAL PRIMARY KEY,
    product_name TEXT NOT NULL,
    sale_date DATE NOT NULL,
    amount NUMERIC(10, 2) NOT NULL
);
  • ここでは売上データを保存する一時テーブルを作ってるよ。
  • idフィールドは各行のIDを自動生成する。
  • amountフィールドは小数点付きの値(例:1234.56)を保存する。

一時テーブルの使い方例

例1: 分析用の中間データを保存する

たとえばordersテーブルに全ての注文が入ってるとする。商品カテゴリごとの売上合計を出したいとき、複雑なクエリを毎回書く代わりに、一時テーブルにデータを保存できる。

一時テーブルを作成:

CREATE TEMP TABLE temp_category_sales (
    category TEXT,
    total_sales NUMERIC(10, 2)
);

一時テーブルにデータを入れる:

INSERT INTO temp_category_sales
SELECT category, SUM(amount)
FROM orders
GROUP BY category;

この一時テーブルを使って、たとえばトップ3カテゴリを抽出できる:

SELECT *
FROM temp_category_sales
ORDER BY total_sales DESC
LIMIT 3;

例2: 複数テーブルのデータをまとめる

例えば、students(学生情報)とenrollments(履修記録)の2つのテーブルがあるとする。それらの履修データを一箇所にまとめたい。

一時テーブルを作成:

CREATE TEMP TABLE temp_student_enrollments (
    student_id INTEGER,
    student_name TEXT,
    course_id INTEGER,
    enrollment_date DATE
);

データを結合:

INSERT INTO temp_student_enrollments
SELECT s.id, s.name, e.course_id, e.enrollment_date
FROM students s
JOIN enrollments e ON s.id = e.student_id;

このテーブルを使って、例えば各学生の履修数を数えるのも簡単:

SELECT student_name, COUNT(course_id) AS enrollment_count
FROM temp_student_enrollments
GROUP BY student_name
ORDER BY enrollment_count DESC;

トランザクション内の一時テーブル

さらに、一時テーブルはON COMMITキーワードでトランザクション単位に制限できるよ。

ON COMMITのバリエーション:

  • ON COMMIT DELETE ROWS: トランザクション終了時に一時テーブルの中身を消す。
  • ON COMMIT PRESERVE ROWS: 終了後もデータを残す。
  • ON COMMIT DROP: トランザクション終了時にテーブル自体を消す。

例:

CREATE TEMP TABLE temp_analysis (
    category TEXT,
    total_sales NUMERIC(10, 2)
) ON COMMIT DROP;

この場合、トランザクションが終わると一時テーブルは消えるよ。

実践的な意味と利用ケース

一時テーブルは実際のプロジェクトでも大活躍。いくつかのシチュエーションを見てみよう:

ケース:

  1. ビジネスでの複雑なレポート: 複雑な計算を何度もやるとき、中間結果を保存できる。
  2. ETL用のデータ準備: データの抽出・変換・ロード(ETL)プロセスで一時テーブルはよく使われる。
  3. クエリの開発・テスト: デバッグ中にデータを分離するために一時テーブルを使おう。

たとえば売上レポートを作るとき、一時テーブルを使えば、総収入や地域ごとのトレンドみたいな中間結果を保存できて、メインのDB構造に影響を与えずに済むよ。

特徴とよくあるミス

一時テーブルはだいたい楽しいけど、いくつか注意点もある:

  • アクセス制限: 一時テーブルは今のセッションやトランザクションだけで見える。セッションを終えるとテーブルは消える。
  • 名前の重複エラー: 同じセッション内で、すでに使われてる名前の一時テーブルは作れない。
  • データの消失: セッションを終える前に必要なデータをちゃんと取り出しておこう。
  • パフォーマンス: 一時テーブルに大量の行を入れると、メモリ使用量に影響が出ることもある。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION