(最終更新月:2023年5月)
✔以下の疑問をお持ちの方へ向けた記事です
「SQLのWITH句とは何か知りたい」
「SQLのWITH句の使い方を覚えたい」
「具体的な使用例を見ながら理解を深めたい」
✔この記事を読むことで得られる知識
- SQLのWITH句の基本的な使い方
- WITH句の応用法
- SQLのWITH句を用いた具体的な使用例
「SQLのWITH句を使えるようになると、複雑なクエリをスッキリまとめられます。
サブクエリを何度も書き直す手間が省けるだけでなく、クエリの可読性も大きく改善できるのです。
当記事では、初心者の方でもわかるように、SQLのWITH句を基礎から具体例まで丁寧に解説していきます。
ぜひ最後まで読んで、WITH句を実践に活かしてください!」
✔【約10分】スキマ時間で聞いて、見て学びたい方はこちら
SQLのWITH句を理解するための前提知識
こちらでは、SQLとその中の重要な概念であるWITH句についてお伝えしていきます。
- SQLとは
- SQLのWITH句の重要性
SQLとは
SQL(Structured Query Language) は、データベースを操作するための言語です。
- データの取得(SELECT)
- 追加(INSERT)
- 更新(UPDATE)
- 削除(DELETE)
など、幅広い操作ができます。
データを扱う職種全般で使われるため、SQLを習得しておくことは非常に重要です。
たとえば、データ分析者ならSQLでレポートやダッシュボードを作成し、ビジネスに役立つインサイトを引き出します。
2. SQLのWITH句の重要性
WITH句 は、SQLの中でもクエリを整理しやすくする便利な機能です。
- 複雑な処理をわかりやすいステップに分けられる
- サブクエリの結果を一時的なテーブル(CTE: Common Table Expression)として再利用できる
これにより、SQLがシンプルになり、可読性・保守性が大幅にアップします。
「サブクエリ」とは?
WITH句を理解するためには、「サブクエリ」という概念についても理解しておく必要があります。
- サブクエリの基本的な定義と用途
- サブクエリのわかりやすい例
- サブクエリとWITH句の関連性
サブクエリの基本的な定義と用途
サブクエリとは、「クエリの中に書かれた別のクエリ」のことです。
- 一度に複数の操作をまとめて行う場合に便利
- メインのSELECT文の中で、サブクエリが返す結果を条件にしたり、結合したりできる
サブクエリのわかりやすい例
たとえば、商品の平均価格を計算し、その平均価格より高い商品を一覧表示するクエリは次のように書けます。
SELECT
product_name,
price
FROM
products
WHERE
price > (
SELECT
AVG(price)
FROM
products
);
この (...)
の部分がサブクエリです。
サブクエリが平均価格を算出し、その結果をメインクエリで条件として利用しています。
サブクエリとWITH句の関連性
WITH句 は、サブクエリのように「一度取ってきたデータ」を再利用できる機能です。
ただし、WITH句では「一時的なテーブル」を作成するため、サブクエリを使う場合よりもコードが整理しやすくなり、可読性が高まります。
WITH句とは
こちらでは、WITH句の詳細な説明を行います。
- WITH句の定義
- WITH句の目的と主な使用ケース
WITH句の定義
With句の定義は以下のようにまとめられます。
- SQL標準機能のひとつ
- 一時的なテーブル(CTE: Common Table Expression)を作成するための仕組み
- 同じクエリ内で何度でも再利用可能
WITH句の目的と主な使用ケース
- クエリを複数のステップに分けて書けるので、可読性が高まる
- 同じ中間結果を何度も使う必要がある場合、パフォーマンス面 でも有利になることが多い
- 「一度取ってきたデータを、別のサブクエリを書くことなく同じクエリ内で使える」というのがWITH句の最大のメリットです。
WITH句の使い方:基本ルールと構文
このセクションでは、WITH句の具体的な使用方法について説明します。
- WITH句の基本的な構文と使用法
- WITH句を用いた簡単なクエリ例
WITH句の基本的な構文と使用法
WITH句の基本的な構文は次のようになります。
WITH 一時テーブル名 AS (
SELECT
column1,
column2
FROM
original_table
WHERE
condition
)
SELECT
*
FROM
一時テーブル名;
WITH
の後に**一時テーブル名(任意の名前)**を指定- その中に「実際のSELECT文」を書く
- その後の本クエリ部分で、先ほど定義した一時テーブルを参照
WITH句を用いた簡単なクエリ例
以下は、WITH句を使った具体的なSQLクエリの一例です。
WITH sales_2020 AS (
SELECT
product_id,
SUM(quantity) AS total_sales
FROM
sales
WHERE
year = 2020
GROUP BY
product_id
)
SELECT
products.product_name,
sales_2020.total_sales
FROM
products
JOIN sales_2020 ON products.id = sales_2020.product_id
ORDER BY
total_sales DESC;
sales_2020
という一時テーブルを定義し、2020年の売上データを集計- 集計結果をベースに、
products
テーブルとJOINして商品名と売上数量を一覧表示
こうすることで、2020年の売上集計結果を使い回しでき、クエリをスッキリ書けます。
WITH句の具体的な使用例
このセクションでは、さらに具体的なWITH句の使用例を説明します。
- 実例で使用するテーブルのデータ
- 具体的なクエリ例と結果を用いたWITH句の使用例の解説
実例で使用するテーブルのデータ
上記の例で使用したsales
テーブルは、各商品の売上データを持っています。
各行は1つの売上を表し、以下3つの絡むが存在します。
product_id
(売られた商品のID)quantity
(売られた数量)year
(売上が発生した年)
また、products
テーブルは、各商品の詳細データを持っています。
各行は1つの商品を表し、id
(商品のID)、product_name
(商品の名前)の2つのカラムがあります。
具体的なクエリ例と結果を用いたWITH句の使用例の解説
以下に、WITH句を使った具体的なクエリの例をもう一つご紹介します。
WITH customers_with_orders AS (
SELECT customer_id
FROM orders
GROUP BY customer_id
)
SELECT customers.name
FROM customers
WHERE customers.id IN (
SELECT customer_id
FROM customers_with_orders
);
orders
テーブルから、注文を行ったことのあるcustomer_id
をグループ化して取得- その結果を一時テーブル
customers_with_orders
として保存 - メインクエリで
customers
テーブルと照合し、実際に注文をしたことがある顧客名だけを取得
サブクエリでも書けますが、WITH句を使うと「注文を行った顧客のIDをまとめたテーブルを先に作成している」という流れが明確になるので、可読性が向上します。
WITH句とサブクエリ:どちらが優れているか?
こちらでは、WITH句とサブクエリの比較、及び、どちらを使用するべきかについて説明します。
- サブクエリとWITH句の比較
- WITH句の優位性の理由
サブクエリとWITH句の比較
サブクエリとWITH句は、どちらもSQLクエリ内で別のクエリの結果を使用するための方法です。
違いをまとめると以下のとおり。
- サブクエリ:クエリ内で一度だけ実行して結果を使う
- WITH句:クエリの冒頭で一時テーブルを作成し、そのクエリ内で何度でも再利用できる
特に複雑なクエリでは、サブクエリを何度も書くよりWITH句の方が見通しがよくなることが多いです。
WITH句の優位性の理由
WITH句の主な利点は、クエリの可読性と再利用性を向上させられる点です。
とくに、複雑なデータ操作を行う場合や、同じ結果セットを複数の場所で使用する場合には、WITH句の使用が推奨されます。
複数の一時テーブルを作る場合のWITH句の使用法
WITH句を使用して複数の一時テーブルを作成することも可能です。以下に具体的なクエリの例を示します。
WITH table1 AS (
SELECT
column1,
column2
FROM
original_table1
WHERE
condition1
),
table2 AS (
SELECT
column3,
column4
FROM
original_table2
WHERE
condition2
)
SELECT
*
FROM
table1
JOIN table2 ON table1.column1 = table2.column3;
この例では、以下のような流れになっています。
- 2つの一時的なテーブル(table1
と
table2)を作成 - テーブルをJOIN(結合)するためのクエリを作成
- 各一時的なテーブルは、それぞれ元のテーブル(original_table1
と
original_table2)から特定の条件を満たす行を選択して作成 - table1
の
column1と
table2の
column3が一致するすべての行を結合
WITH句の注意点と活用例
こちらでは、WITH句を使用する際に注意すべき点・活用例をあわせて説明します。
活用の際は、注意点を理解のうえ使用しましょう。
- WITH句の使用時に注意する点
- 実際の業務でのWITH句の使用例
- 現場でのWITH句の活用による利点
WITH句の使用時に注意する点
WITH句は非常に便利な機能ですが、適切に使用しないとパフォーマンスに影響を与える可能性があります。
メモリ使用量
- 一時テーブルは基本的にメモリ上に展開されるため、大量データを扱うとパフォーマンスに影響する可能性がある
クエリ完了後のテーブルは消失
- WITH句で作られた一時テーブルは、そのクエリが終了すると同時に消去される
- 別のクエリでも同じデータセットを使いたい場合は、再度同じWITH句(もしくは別の仕組み)を定義する必要がある
実際の業務でのWITH句の使用例
データ分析系の業務
- 例えば「特定の期間に購入した顧客群」だけを先に抽出しておき、そこから追加分析を行う
集計クエリの分割
複雑な集計ロジックを段階的に組み立てることで、後から読んでも「何をしているか」が理解しやすい
現場でのWITH句の活用による利点
WITH句を活用すると、複雑なデータ処理を一連のシンプルなステップに分割することができます。
- 保守が容易:可読性が高いので、SQLを修正する際に迷いにくい
- エラー削減:サブクエリを何度も書き直さなくても済むため、コピペミスや論理ミスが減る
- パフォーマンス改善につながる場合も:同じ集計を繰り返し書くのではなく、一回の計算結果を使い回せる
WITH句を使ったクイズ
最後に、学んだ内容をチェックするクイズを用意しました。
- WITH句を使用すると、一時的なテーブルをクエリ内で何度でも使用できる。(真 or 偽)
- WITH句で作成した一時テーブルは、クエリが終了した後も残り続ける。(真 or 偽)
- WITH句を使うことで、複雑なクエリを分割し、より読みやすい形にできる。(真 or 偽)
まとめ
当記事を通じて、WITH句を使いこなすことでSQLクエリの整理・可読性向上が期待できることがおわかりいただけたと思います。
実務では、分析用の複雑なクエリを組む場面や、集計処理を何ステップにも分割するケースがよくあります。
ぜひ積極的にWITH句を活用して、きれいでメンテナンスしやすいSQLを書いてみてください。
これからSQLを使いこなしていくうえで、「リーダブルコード」 のような書籍も参考にしながら、他の人に見てもらっても恥ずかしくないクエリを書く練習をしていきましょう!