【SQL脱初心者】「ネスト地獄」にさようなら。WITH句(共通テーブル式)でクエリを劇的に美しくする方法
公開日: 2025年11月29日
前回の記事で、便利な「サブクエリ」について解説しました。 しかし、サブクエリには一つだけ大きな弱点があります。それは、「使いすぎると、SQLが『ネスト地獄』になり、絶望的に読みづらくなる」ことです。
FROM (SELECT ... FROM (SELECT ...)) のようにカッコが幾重にも重なったSQLは、書いた本人でさえ、翌日には解読不能になってしまいます。
そこで登場するのが、今回の主役「WITH句(共通テーブル式 / CTE)」です。 これを使うと、複雑なサブクエリを「名前付きの部品」として切り出し、SQLを上から下へと、物語を読むように記述できるようになります。 現場で「読みやすいSQLを書く人」と評価されるための、必須スキルです。
😱 問題:サブクエリによる「ネスト地獄」
まず、WITH句を使わない場合の「読みにくいSQL」を見てみましょう。 「各部署ごとの平均給与を出し、その平均より高い給与をもらっている社員をリストアップする」というクエリです。
-- サブクエリを使った書き方(視線が行ったり来たりする)
SELECT
e.name,
e.salary,
d.avg_salary
FROM employees AS e
INNER JOIN (
-- ここで部署ごとの平均を計算している(ネスト!)
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
) AS d ON e.department_id = d.department_id
WHERE e.salary > d.avg_salary;
この書き方だと、メインの処理の途中に、突然集計ロジックが割り込んでくるため、構造を理解するのに脳のメモリを消費します。
✨ 解決:WITH句で「部品」を先に定義する
同じ処理を、WITH句を使って書き直してみましょう。 WITH 名前 AS (クエリ) と書くことで、そのクエリ結果に名前を付け、一時的なテーブルとして扱うことができます。
-- WITH句を使った書き方(上から下に読める!)
-- 1. まず「部署ごとの平均給与」という部品を作る
WITH dept_avg AS (
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
)
-- 2. 作った部品を使って、メインの検索を行う
SELECT
e.name,
e.salary,
da.avg_salary
FROM employees AS e
INNER JOIN dept_avg AS da ON e.department_id = da.department_id
WHERE e.salary > da.avg_salary;
メリット
1. 可読性: 「まず平均を計算するんだな」→「その結果を使って社員を探すんだな」と、思考の順序通りにコードが並びます。
2. 再利用: 定義したCTE(上記のdept_avg)は、その後のクエリ内で何度でも呼び出せます。
🔥 応用:複数のWITH句を繋げる
WITH句は、カンマで区切っていくつでも定義できます。 これにより、複雑な多段階の集計も、驚くほどスッキリ記述できます。
WITH
-- 1. 2024年の注文データを抽出
orders_2024 AS (
SELECT user_id, amount FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31'
),
-- 2. ユーザーごとの合計金額を計算(1の結果を利用!)
user_totals AS (
SELECT user_id, SUM(amount) AS total_spent
FROM orders_2024
GROUP BY user_id
)
-- 3. 最終結果:合計10万円以上の優良顧客リスト
SELECT u.name, ut.total_spent
FROM users u
JOIN user_totals ut ON u.id = ut.user_id
WHERE ut.total_spent >= 100000;
まるでプログラミング言語で変数を定義していくように、段階的にデータを加工できていますね。 これをサブクエリだけで書こうとすると、恐ろしいことになります…。
🤖 AIに、スパゲッティコードを「リファクタリング」させる
もし、あなたの手元に、サブクエリが何重にもネストされた読み解けないSQLがあるなら、AIコード解説ツール「SerchCode Pro」の出番です。
「このSQLを、WITH句を使って読みやすくリファクタリングして」 そうAIに依頼してみてください。 AIは、複雑に絡み合ったロジックを解きほぐし、意味のある単位でWITH句に切り出し、美しいクエリに書き換えてくれます。 それは、単なる書き換えではなく、「論理的な思考の整理」そのものです。
まとめ:SQLも「読みやすさ」が命
「動けばいい」という段階を卒業したら、次は「読みやすさ」にこだわりましょう。
- 複雑なサブクエリは、WITH句で外に出す。
- 処理を「部品の定義」と「メインの処理」に分ける。
- AIを使って、既存のクエリをリファクタリングする習慣をつける。
WITH句を使いこなせば、あなたのSQLは「解読が必要な暗号」から「誰でも読める仕様書」へと生まれ変わります。 ぜひ、SQL道場で練習してみてください!
あなたのSQL、もっと読みやすくできます
「このクエリ、ごちゃごちゃして読みづらい...」と思ったら、AI SQLチェッカーに貼り付けてみてください。WITH句を使ったリファクタリング案や、構文エラーの修正をAIがサポートします。
AI SQLチェッカーを使ってみる →