[SQLの基本]一時テーブルとCTE(WITH句)入門: 効率的なデータ操作のためのツール

投稿日:

はじめに

SQLを使用してデータベースを操作する際、一時的にデータを保存して複雑なクエリを簡潔にする方法がいくつかあります。その中でも「一時テーブル(Temporary Table)」と「CTE(Common Table Expressions、WITH句)」は非常に便利なツールです。今回は、一時テーブルとCTEの基本とその使用方法について解説します。

一時テーブル(Temporary Table)

一時テーブルは、セッションごとに一時的に作成されるテーブルであり、セッションが終了すると自動的に削除されます。一時テーブルを使用することで、複雑なクエリを簡潔にし、パフォーマンスを向上させることができます。

一時テーブルの作成

一時テーブルを作成するには、CREATE TEMPORARY TABLE文を使用します。

CREATE TEMPORARY TABLE temp_table_name (
  column1 datatype,
  column2 datatype,
    ...
);

例 従業員の一時テーブルを作成するクエリは次の通りです。

CREATE TEMPORARY TABLE temp_employees (
  employee_id INT,
  first_name VARCHAR(50),
  last_name VARCHAR(50),
  salary DECIMAL(10, 2)
);

一時テーブルへのデータ挿入

一時テーブルにデータを挿入するには、通常のINSERT文を使用します。

INSERT INTO temp_employees (employee_id, first_name, last_name, salary)
VALUES (1, 'John', 'Doe', 50000.00),(2, 'Jane', 'Smith', 60000.00);

一時テーブルの使用

一時テーブルを使用してデータを操作するには、通常のテーブルと同様にクエリを実行します。

SELECT 
  * 
FROM temp_employees;

一時テーブルの削除

一時テーブルはセッションが終了すると自動的に削除されますが、手動で削除することもできます。

DROP TEMPORARY TABLE temp_employees;

CTE(Common Table Expressions、WITH句)

CTEは、一時的な結果セットを定義し、それを元にクエリを実行するための構文です。CTEを使用することで、クエリを分かりやすくし、再利用可能なクエリ部品を作成できます。

CTEの作成

CTEを作成するには、WITH句を使用します。

WITH cte_name AS (
  SELECT
    column1, 
    column2, ...
  FROM table_name
  WHERE condition
)
SELECT 
  column1, 
  column2, ...
FROM cte_name;

例 従業員テーブルから給与が50000以上の従業員を取得するCTEを作成するクエリは次の通りです。

WITH HighSalaryEmployees AS (
  SELECT 
    employee_id, 
    first_name, 
    last_name, 
    salary
  FROM employees
  WHERE salary >= 50000
)
SELECT 
  * 
FROM HighSalaryEmployees;

このクエリは、給与が50000以上の従業員の情報を含む一時的な結果セットを作成し、それを元にデータを取得します。

再帰CTE

再帰CTEは、自分自身を再帰的に参照することで階層的なデータを操作するために使用されます。

WITH RECURSIVE cte_name AS (
  -- 基底部
  SELECT 
    column1, 
    column2, ...
  FROM table_name
  WHERE condition
  UNION ALL
  -- 再帰部
  SELECT 
    column1, 
    column2, ...
  FROM table_name
  JOIN cte_name ON condition
)
SELECT 
  *
FROM cte_name;

例 組織内の階層構造を再帰的に取得するクエリは次の通りです。

WITH RECURSIVE EmployeeHierarchy AS (
    -- 基底部
    SELECT employee_id, first_name, last_name, manager_id
    FROM employees
    WHERE manager_id IS NULL

    UNION ALL

    -- 再帰部
    SELECT e.employee_id, e.first_name, e.last_name, e.manager_id
    FROM employees e
    INNER JOIN EmployeeHierarchy eh ON e.manager_id = eh.employee_id
)
SELECT * FROM EmployeeHierarchy;

このクエリは、従業員の階層構造を再帰的に取得します。

一時テーブルとCTEの使い分け

一時テーブルとCTEはどちらも便利なツールですが、使用する場面が異なります。

一時テーブル: 複数のクエリで同じデータを何度も使用する場合や、大量のデータを一時的に保存する場合に適しています。

CTE: クエリを分かりやすくし、再利用可能なクエリ部品を作成する場合に適しています。CTEは一時的な結果セットを定義し、その結果を元にクエリを実行するため、クエリの可読性を向上させます。

まとめ

今回は、SQLの一時テーブルとCTE(WITH句)の基本とその使用方法について学びました。これらのツールを使いこなすことで、データベース操作がより効率的に行えるようになります。次回の記事では、さらに高度なSQLクエリやデータベース操作について詳しく解説していきます。ぜひご期待ください!