📝 はじめに
今回は、MySQLで初めてWITH句(共通テーブル式: CTE)を使ってみた話を書きます。
「名前は聞いたことあるけど、どう使うの?」
「結局サブクエリと何が違うの?」
そんな疑問に答えるべく、実際に使ってみての感想や、クエリの見やすさの比較、実行計画の違いまで紹介します!
🎯 この記事でわかること
- WITH句(CTE)の基本的な使い方
- サブクエリとの違いとメリット
- 実行計画を使ったパフォーマンス比較
💡 そもそもWITH句って?
MySQL 8.0以降で使える「共通テーブル式(Common Table Expression)」のことです。
クエリの冒頭にWITH句で一時的なテーブルを定義して、それを後続のクエリで参照できる仕組みです。
WITH sumOfAmount AS (
SELECT customer_id, SUM(amount) AS total
FROM sales
GROUP BY customer_id
)
SELECT *
FROM sumOfAmount
WHERE total >= 10000;
🔍 サンプルテーブル
以下の2つのテーブルを使って説明します。
-- 顧客テーブル
CREATE TABLE customers (
id INT PRIMARY KEY,
name VARCHAR(100)
);
-- 売上テーブル
CREATE TABLE sales (
id INT PRIMARY KEY,
customer_id INT,
amount INT,
created_at DATE
);
🆚 サブクエリ vs WITH句
サブクエリ版
SELECT *
FROM (
SELECT customer_id, SUM(amount) AS total
FROM sales
GROUP BY customer_id
) AS totals
WHERE total >= 10000;
WITH句版
WITH totals AS (
SELECT customer_id, SUM(amount) AS total
FROM sales
GROUP BY customer_id
)
SELECT *
FROM totals
WHERE total >= 10000;
✅ 見やすさの違い
- サブクエリ:1クエリ内にロジックがネストされて見づらい
- WITH句:名前付きでクエリが分離され、読みやすい!
複数のサブクエリが絡む場合、WITH句が真価を発揮します。
📊 実行計画の比較(サブクエリ版とWITH句版)
id | select_type | table | type | rows | Extra |
---|---|---|---|---|---|
1 | PRIMARY | derived | ALL | 1000 | Using where |
2 | DERIVED | sales | ALL | 5000 | Using temporary |
実行計画はサブクエリもWITH句も変わりませんでした。
✍️ まとめ
書いてみた感想
- 最初は「サブクエリでいいのでは?」と思ってましたが、CTEはクエリを段階ごとに分けられる点が非常に便利でした。
- 特に集計処理やJOINが増える場合は、読みやすさが段違いです。
✅ 最後に
以上、「はじめてのWITH句を使ってみた」体験記でした!
※本記事は筆者個人の見解であり、所属企業の公式見解ではありません。