SQLはデータベースを操作するための言語です。初心者の方にとって、WITH句とサブクエリは難しい概念かもしれませんが、実際に使ってみると理解が深まります!本記事では、WITH句とサブクエリについてと、パフォーマンスなど使い分けのタイミング解説します。
WITH句は、一時的なテーブルを作成するための機能です。例えば、複数のテーブルから情報を取得して、一時的なテーブルを作成したい場合に便利です。WITH句を使うと、SQL文が簡潔になり可読性も上がります。
以下は、WITH句を使った例です。 この例では、usersテーブルからageが20以上のユーザーを取得し、その結果をtmp_tableという一時的なテーブルに格納しています。その後、tmp_tableからnameに「山田」を含むユーザーを取得しています。WITH句を使うことで、テーブルの結合などをする必要がなく、SQL文が簡潔になっています。またWITH句によって生成される一時的な結果セットを共通テーブル式(CTE、Common Table Expressions)と呼びます。 WITH句を使うメリットとしては、チームへクエリを共有する際など、クエリの可読性が高まりやすくなります。この後説明するサブクエリだと、複雑なケースのクエリの場合読みづらくなってしまいますが、WITH句で必要な単位で一時的なテーブルを作成することでで読み取りやすくなります。複数人メンバーでのクエリを共有する場合や、自分の作業としてクエリをわかりやすく整理しておきたい場合などはWITH句をお勧めします。 一方で、WITH句のデメリットも存在します。WITH句では作成されたデータはメモリに保持されることになります。そのため、メモリを使い過ぎるレベルで大容量のデータを作りすぎるとメモリがどんどん圧迫されてパフォーマンスが落ちてしまいます。可読性を重要視しすぎて、本来抽出したいデータが読み取れないのは本末転倒なのでそこのバランスは注視したいところです。 続いてサブクエリについて説明していきます。 サブクエリとは、SQL文の中に別のSQL文を埋め込んだものです。主に、複数のテーブルからデータを取得するときや、特定の条件を満たすデータを取得するときに使われます。サブクエリは、SELECT文の中に書くことが多いです。 以下は、サブクエリを使った例です。 この例では、ordersテーブルからpriceが5000以上の注文をしたユーザーのIDを取得し、その結果をusersテーブルから取得していることが分かります。サブクエリを使うことで、ordersテーブルとusersテーブルを結合する必要がなく、SQL文が簡潔になっています。 WITH句とサブクエリのパフォーマンスについては、データベースの種類や実際のクエリの内容によって異なりますが一般的には、WITH句を使った場合の方がパフォーマンスが良いとされています。 WITH句で作ったデータは一度その部分が作成されるとそのクエリ内セッションではメモリに保存されます。そのため、WITH句で使ったテーブルをその後何度か利用するケースの場合はWITH句を使うほうがパフォーマンスが増します。 PMのデータ分析ではそこまで気にすることもないと思いますが、知識として覚えておくことをオススメします。 本記事では、SQLの初学者の方に向けて、WITH句とサブクエリについて解説しました。WITH句は、一時的なテーブルを作成するために使い、SQL文を簡潔にすることができます。一方、サブクエリは、SQL文の中に別のSQL文を埋め込んで使うことができ、複数のテーブルからデータを取得するときや、特定の条件を満たすデータを取得するときに便利です。初心者の方でも、実際に使ってみると理解が深まるので、是非試してみてください。 だいぶ昔ですが筆者がクエリ初学者の時はこちらの本で体系的に覚えました。WITH句について
WITH tmp_table AS (
SELECT id, name FROM users WHERE age >= 20
)
SELECT * FROM tmp_table WHERE name LIKE '%山田%';
WITH句のメリットとデメリット
ちなみに上の例をサブクエリに置き換えると下記のようになります。SELECT name FROM (
SELECT id, name FROM users WHERE age >= 20
) AS tmp_table WHERE name LIKE '%山田%';
何度も使うようなテーブルであれば、一時的なテーブルではなく中間テーブルとして作成し参照先をそちらに変えるなどをお勧めします。サブクエリについて
SELECT name FROM users WHERE id IN (
SELECT user_id FROM orders WHERE price >= 5000
);
サブクエリのメリットとしては、冗長に書く必要がないのでコードを少なく書くことができることや、今回のように必要な情報だけ抜き出して条件に指定するなどができます。WITH句とサブクエリの使い分け・パフォーマンスの違い
WITH句を使うことで、一時的なテーブルを作成することができそのテーブルを使ってクエリを実行するため、データアクセスの回数が少なくなるからです。ただし、WITH句を使う場合でも、必要なデータだけを取得するようにクエリを最適化することが重要です。また、サブクエリを使う場合でも、必要なデータだけを取得するようにクエリを最適化することが重要です。まとめ
元々エンジニア出身だったのでとっつきやすかったですが、エンジニア以外のプロダクトマネージャーにオススメしたところ理解しやすかったとのことでおすすめです。