0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

📝 はじめに

今回は、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句を使ってみた」体験記でした!

※本記事は筆者個人の見解であり、所属企業の公式見解ではありません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?