こんにちは、阿久梨絵です!
SQL のWITH句(Common Table Expressions(CTE))は、一時的な名前付きテーブルを作成し、その結果をメインのクエリで利用できる便利な機能です。
主なメリット
・複雑なサブクエリを整理し、可読性を向上
・一時的なデータセットを作成し、複数のクエリで再利用
・自己結合や再帰クエリに活用できる
基本的な WITH の構文
WITH sales_data AS (
SELECT product_id, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY product_id
)
SELECT s.product_name, sd.total_sales
FROM sales_data sd
JOIN products s ON sd.product_id = s.product_id;
・WITH sales_data AS (…) → 売上データの集計を一時テーブルとして定義
・メインクエリでは、作成したsales_dataをJOINして利用
・サブクエリよりも可読性が向上し、保守が楽になる!
WITH を使うべきケース
1. 複数のサブクエリを整理する
複雑なサブクエリをスッキリまとめる。
WITH employee_salaries AS (
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
)
SELECT e.employee_name, e.salary, es.avg_salary
FROM employees e
JOIN employee_salaries es ON e.department_id = es.department_id;
・サブクエリを別々に処理し、クエリを見やすく整理!
2. 再帰クエリでツリー構造を検索(階層データの取得)
親子関係のあるデータ(例:組織図、カテゴリ階層)を取得
WITH RECURSIVE category_tree AS (
SELECT category_id, category_name, parent_id, 1 AS depth
FROM categories
WHERE parent_id IS NULL
UNION ALL
SELECT c.category_id, c.category_name, c.parent_id, ct.depth + 1
FROM categories c
JOIN category_tree ct ON c.parent_id = ct.category_id
)
SELECT * FROM category_tree;
・CTEを使うことで、階層構造のデータを効率的に取得できる!
3. 一時的なデータを定義し、クエリの再利用を減らす
同じデータセットを複数回計算する場合
WITH recent_sales AS (
SELECT product_id, SUM(sales_amount) AS total_sales
FROM sales
WHERE sales_date >= DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY)
GROUP BY product_id
)
SELECT p.product_name, rs.total_sales
FROM recent_sales rs
JOIN products p ON rs.product_id = p.product_id;
・計算済みの売上データを一時テーブル化し、複数のクエリで使い回し!
まとめ
・サブクエリの整理 → 見やすく、メンテナンスしやすいクエリに!
・再帰クエリ(階層構造の検索) → ツリー型データを取得
・一時的なデータ定義 → 再計算を減らし、処理効率UP
CTE (WITH) は特に可読性を向上させ、 SQL の設計をスマートにする重要なテクニック!
業務システムやデータ分析に活用し、スムーズな SQL 処理を実現しましょう。
阿久梨絵でした!