元エンジニアPMのプロダクトマネージャーお役立ち情報

プロダクトとビジネスの両輪どっちも回してる人 事業戦略やプロダクトマネジメントに関する情報を発信

SQL初学者向けのWITH句とサブクエリの使い分け

SQLはデータベースを操作するための言語です。初心者の方にとって、WITH句とサブクエリは難しい概念かもしれませんが、実際に使ってみると理解が深まります!本記事では、WITH句とサブクエリについてと、パフォーマンスなど使い分けのタイミングを解説します。 2026年現在はAIツールを使ってWITH句やサブクエリを書く方法も一般的になってきたので、記事の後半ではAIを活用した実践方法も紹介します。

WITH句について

WITH句は、一時的なテーブルを作成するための機能です。例えば、複数のテーブルから情報を取得して、一時的なテーブルを作成したい場合に便利です。WITH句を使うと、SQL文が簡潔になり可読性も上がります。 以下は、WITH句を使った例です。

WITH tmp_table AS (
  SELECT id, name FROM users WHERE age >= 20
)
SELECT * FROM tmp_table WHERE name LIKE '%山田%';

この例では、usersテーブルからageが20以上のユーザーを取得し、その結果をtmp_tableという一時的なテーブルに格納しています。その後、tmp_tableからnameに「山田」を含むユーザーを取得しています。WITH句を使うことで、テーブルの結合などをする必要がなく、SQL文が簡潔になっています。またWITH句によって生成される一時的な結果セットを共通テーブル式(CTE、Common Table Expressions)と呼びます。

WITH句のメリットとデメリット

WITH句を使うメリットとしては、チームへクエリを共有する際など、クエリの可読性が高まりやすくなります。この後説明するサブクエリだと、複雑なケースのクエリの場合読みづらくなってしまいますが、WITH句で必要な単位で一時的なテーブルを作成することでで読み取りやすくなります。複数人メンバーでのクエリを共有する場合や、自分の作業としてクエリをわかりやすく整理しておきたい場合などはWITH句をお勧めします。
ちなみに上の例をサブクエリに置き換えると下記のようになります。

SELECT name FROM (
  SELECT id, name FROM users WHERE age >= 20
) AS tmp_table WHERE name LIKE '%山田%';

一方で、WITH句のデメリットも存在します。WITH句では作成されたデータはメモリに保持されることになります。そのため、メモリを使い過ぎるレベルで大容量のデータを作りすぎるとメモリがどんどん圧迫されてパフォーマンスが落ちてしまいます。可読性を重要視しすぎて、本来抽出したいデータが読み取れないのは本末転倒なのでそこのバランスは注視したいところです。
何度も使うようなテーブルであれば、一時的なテーブルではなく中間テーブルとして作成し参照先をそちらに変えるなどをお勧めします。

続いてサブクエリについて説明していきます。

サブクエリについて

サブクエリとは、SQL文の中に別のSQL文を埋め込んだものです。主に、複数のテーブルからデータを取得するときや、特定の条件を満たすデータを取得するときに使われます。サブクエリは、SELECT文の中に書くことが多いです。

以下は、サブクエリを使った例です。

SELECT name FROM users WHERE id IN (
  SELECT user_id FROM orders WHERE price >= 5000
);

この例では、ordersテーブルからpriceが5000以上の注文をしたユーザーのIDを取得し、その結果をusersテーブルから取得していることが分かります。サブクエリを使うことで、ordersテーブルとusersテーブルを結合する必要がなく、SQL文が簡潔になっています。
サブクエリのメリットとしては、冗長に書く必要がないのでコードを少なく書くことができることや、今回のように必要な情報だけ抜き出して条件に指定するなどができます。

WITH句とサブクエリの使い分け・パフォーマンスの違い

WITH句とサブクエリのパフォーマンスについては、データベースの種類や実際のクエリの内容によって異なりますが一般的には、WITH句を使った場合の方がパフォーマンスが良いとされています。
WITH句を使うことで、一時的なテーブルを作成することができそのテーブルを使ってクエリを実行するため、データアクセスの回数が少なくなるからです。ただし、WITH句を使う場合でも、必要なデータだけを取得するようにクエリを最適化することが重要です。また、サブクエリを使う場合でも、必要なデータだけを取得するようにクエリを最適化することが重要です。

WITH句で作ったデータは一度その部分が作成されるとそのクエリ内セッションではメモリに保存されます。そのため、WITH句で使ったテーブルをその後何度か利用するケースの場合はWITH句を使うほうがパフォーマンスが増します。 PMのデータ分析ではそこまで気にすることもないと思いますが、知識として覚えておくことをオススメします。

AIを活用したWITH句の実践

WITH句とサブクエリの違いは理解できても、実際にゼロからクエリを書こうとすると手が止まる人は多いですよね。最近はAIツールを使ってクエリを生成する方法が広まっていて、WITH句の学習や実務にも役立ちます。

自然言語でWITH句を生成する

たとえば「usersテーブルから20歳以上のユーザーを抽出して、その中から名前に山田を含む人を取得したい」とAIに伝えるだけで、WITH句を使った構造化されたクエリが返ってきます。本記事の冒頭で紹介した WITH tmp_table AS (...) のサンプルと同じ構造のクエリです。自分で書く前にAIの出力を読むことで、WITH句の書き方をパターンとして身につけやすくなります。

リファクタリングにも使える

既存のサブクエリが深くネストして読みづらくなったとき、AIに「このクエリをWITH句を使ってリファクタリングして」と頼むと、可読性の高い形に変換してくれます。変換前と変換後を並べて比較すると、WITH句のメリットが具体的に分かるはずです。データ分析を任されているPM・非エンジニアの企画職にとっては、既存クエリの整理に使うのが一番実用的な場面かもしれません。

使い分けの理解を深める

「同じ結果を返すWITH句版とサブクエリ版を両方出して、違いを説明して」と聞くと、パフォーマンスや可読性の観点で解説が返ってきます。本記事の内容を手を動かしながら復習するのに向いている使い方です。

SQLの学習・業務にAIを活用する方法は、別の記事で詳しく書いたのでそちらも参考にしてください。 → SQL × Claude Code -- 非エンジニアがクエリを書ける速度が変わった話

Claude Code自体に馴染みがない方は、まずClaude Code入門 -- PM・非エンジニアのための実践ガイドから読んでみてください。

まとめ

本記事では、SQLの初学者の方に向けて、WITH句とサブクエリについて解説しました。WITH句は、一時的なテーブルを作成するために使い、SQL文を簡潔にすることができます。一方、サブクエリは、SQL文の中に別のSQL文を埋め込んで使うことができ、複数のテーブルからデータを取得するときや、特定の条件を満たすデータを取得するときに便利です。初心者の方でも、実際に使ってみると理解が深まるので、是非試してみてください。

だいぶ昔ですが筆者がクエリ初学者の時はこちらの本で体系的に覚えました。

元々エンジニア出身だったのでとっつきやすかったですが、エンジニア以外のプロダクトマネージャーにオススメしたところ理解しやすかったとのことでおすすめです。