サイトアイコン ITC Media

【結論】WITH句を使うとSQLクエリの可読性と再利用性が大きく向上する

(最終更新月:2023年5月)

✔以下の疑問をお持ちの方へ向けた記事です

「SQLのWITH句とは何か知りたい」
「SQLのWITH句の使い方を覚えたい」
「具体的な使用例を見ながら理解を深めたい」

✔この記事を読むことで得られる知識

「SQLのWITH句を使えるようになると、複雑なクエリをスッキリまとめられます。

サブクエリを何度も書き直す手間が省けるだけでなく、クエリの可読性も大きく改善できるのです。

当記事では、初心者の方でもわかるように、SQLのWITH句を基礎から具体例まで丁寧に解説していきます。

ぜひ最後まで読んで、WITH句を実践に活かしてください!」

✔【約10分】スキマ時間で聞いて、見て学びたい方はこちら

筆者プロフィール

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

SQLのWITH句を理解するための前提知識

こちらでは、SQLとその中の重要な概念であるWITH句についてお伝えしていきます。

SQLとは

SQL(Structured Query Language) は、データベースを操作するための言語です。

など、幅広い操作ができます。

データを扱う職種全般で使われるため、SQLを習得しておくことは非常に重要です。

たとえば、データ分析者ならSQLでレポートやダッシュボードを作成し、ビジネスに役立つインサイトを引き出します。

2. SQLのWITH句の重要性

WITH句 は、SQLの中でもクエリを整理しやすくする便利な機能です。

これにより、SQLがシンプルになり、可読性・保守性が大幅にアップします。

「サブクエリ」とは?

WITH句を理解するためには、「サブクエリ」という概念についても理解しておく必要があります。

サブクエリの基本的な定義と用途

サブクエリとは、「クエリの中に書かれた別のクエリ」のことです。

サブクエリのわかりやすい例

たとえば、商品の平均価格を計算し、その平均価格より高い商品を一覧表示するクエリは次のように書けます。

SELECT
  product_name,
  price
FROM
  products
WHERE
  price > (
    SELECT
      AVG(price)
    FROM
      products
  );

この (...) の部分がサブクエリです。

サブクエリが平均価格を算出し、その結果をメインクエリで条件として利用しています。

サブクエリとWITH句の関連性

WITH句 は、サブクエリのように「一度取ってきたデータ」を再利用できる機能です。

ただし、WITH句では「一時的なテーブル」を作成するため、サブクエリを使う場合よりもコードが整理しやすくなり、可読性が高まります。

WITH句とは

こちらでは、WITH句の詳細な説明を行います。

WITH句の定義

With句の定義は以下のようにまとめられます。

WITH句の目的と主な使用ケース

WITH句の使い方:基本ルールと構文

このセクションでは、WITH句の具体的な使用方法について説明します。

WITH句の基本的な構文と使用法

WITH句の基本的な構文は次のようになります。

WITH 一時テーブル名 AS (
  SELECT
    column1,
    column2
  FROM
    original_table
  WHERE
    condition
)
SELECT
  *
FROM
  一時テーブル名;

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;

こうすることで、2020年の売上集計結果を使い回しでき、クエリをスッキリ書けます。

WITH句の具体的な使用例

このセクションでは、さらに具体的なWITH句の使用例を説明します。

実例で使用するテーブルのデータ

上記の例で使用したsalesテーブルは、各商品の売上データを持っています。

各行は1つの売上を表し、以下3つの絡むが存在します。

また、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
);
  1. orders テーブルから、注文を行ったことのある customer_id をグループ化して取得
  2. その結果を一時テーブル customers_with_orders として保存
  3. メインクエリで customers テーブルと照合し、実際に注文をしたことがある顧客名だけを取得

サブクエリでも書けますが、WITH句を使うと「注文を行った顧客のIDをまとめたテーブルを先に作成している」という流れが明確になるので、可読性が向上します。

WITH句とサブクエリ:どちらが優れているか?

こちらでは、WITH句とサブクエリの比較、及び、どちらを使用するべきかについて説明します。

サブクエリとWITH句の比較

サブクエリとWITH句は、どちらもSQLクエリ内で別のクエリの結果を使用するための方法です。

違いをまとめると以下のとおり。

特に複雑なクエリでは、サブクエリを何度も書くより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;

この例では、以下のような流れになっています。

WITH句の注意点と活用例

こちらでは、WITH句を使用する際に注意すべき点・活用例をあわせて説明します。

活用の際は、注意点を理解のうえ使用しましょう。

WITH句の使用時に注意する点

WITH句は非常に便利な機能ですが、適切に使用しないとパフォーマンスに影響を与える可能性があります。

メモリ使用量

クエリ完了後のテーブルは消失

実際の業務でのWITH句の使用例

データ分析系の業務

集計クエリの分割

複雑な集計ロジックを段階的に組み立てることで、後から読んでも「何をしているか」が理解しやすい

現場でのWITH句の活用による利点

WITH句を活用すると、複雑なデータ処理を一連のシンプルなステップに分割することができます。

WITH句を使ったクイズ

最後に、学んだ内容をチェックするクイズを用意しました。

まとめ

当記事を通じて、WITH句を使いこなすことでSQLクエリの整理・可読性向上が期待できることがおわかりいただけたと思います。

実務では、分析用の複雑なクエリを組む場面や、集計処理を何ステップにも分割するケースがよくあります。

ぜひ積極的にWITH句を活用して、きれいでメンテナンスしやすいSQLを書いてみてください。

これからSQLを使いこなしていくうえで、「リーダブルコード」 のような書籍も参考にしながら、他の人に見てもらっても恥ずかしくないクエリを書く練習をしていきましょう!

モバイルバージョンを終了