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

スタートアップから大規模プロダクトまで担当している元エンジニアの筆者が、事業開発・プロダクトマネジメントに役立つ情報を発信します

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

SQLはデータベースを操作するための言語です。初心者の方にとって、WITH句とサブクエリは難しい概念かもしれませんが、実際に使ってみると理解が深まります!本記事では、WITH句とサブクエリについてと、パフォーマンスなど使い分けのタイミング解説します。

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句を使うメリットとしては、チームへクエリを共有する際の可読性が高まりやすくなります。この後説明するサブクエリだと複雑なケースの時読みづらくなってしまいますが、WITH句でまとめたテーブルであれば読み取りやすくなります。
ちなみに上の例をサブクエリに置き換えると下記のようになります。

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

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

サブクエリについて

サブクエリとは、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のデータ分析ではそこまで気にすることもないと思いますが、知識として覚えておくことをオススメします。

まとめ

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

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

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