データ分析
2024/08/19
與田 龍人

サブクエリとWITH句の使い分け:プロジェクトから考える可読性の重要性

SQLのクエリを書く際に、サブクエリやWITH句(Common Table Expressions、CTE)を使う場面に直面することがよくあります。どちらを選ぶべきか迷うことがあるかもしれませんが、それぞれの特徴と利点を理解することで、状況に応じた適切な選択ができるようになります。

はじめに

SQLのクエリを書く際に、サブクエリやWITH句(Common Table Expressions、CTE)を使う場面に直面することがよくあります。どちらを選ぶべきか迷うことがあるかもしれませんが、それぞれの特徴と利点を理解することで、状況に応じた適切な選択ができるようになります。

プロジェクト経験から感じたサブクエリの課題

あるプロジェクトで複雑なサブクエリを多用したSQLを作成したことがありました。しかし、クエリが複雑になるにつれ、ネストされたサブクエリが増え、クエリ全体の可読性が大幅に低下するという問題に直面しました。特に、プロジェクトチームの他のメンバーがクエリを理解しにくいと感じることが多く、メンテナンス性も悪化しました。


この経験から、特に複雑なクエリの場合、可読性を重視することが重要であり、場合によってはサブクエリよりもWITH句を使う方が適切であると感じました。


サブクエリとWITH句の例

まず、以下のようなサンプルデータを考えます。



 


サブクエリの使用例


サブクエリは、メインクエリ内でデータを一時的に抽出し、その結果をメインクエリで利用する場合に有効です。例えば、特定期間内に売れた商品だけを抽出し、その商品情報を取得するクエリを考えます。


例:



SELECT product_id, product_name
FROM products
WHERE product_id IN (
SELECT product_id
FROM sales
WHERE sales_date >= '2024-01-01'
);



結果:



このクエリでは、サブクエリで2024-01-01以降に売れた商品を抽出し、そのproduct_idに基づいてproductsテーブルから該当する商品を取得しています。


WITH句の使用例


次に、WITH句を使って同じデータを取得する方法を見てみましょう。WITH句を使うことで、クエリの構造を明確にし、読みやすくなります。


例:



WITH recent_sales AS (
SELECT product_id
FROM sales
WHERE sales_date >= '2024-01-01'
)
SELECT product_id, product_name
FROM products
WHERE product_id IN (
SELECT product_id
FROM recent_sales
);


結果:



この例では、recent_salesというCTEを定義し、その結果をメインクエリで再利用しています。


サブクエリ vs WITH句

サブクエリを使うべき場合



  • 単純なケース: クエリがシンプルで、ネストされたクエリが少ない場合。

  • 一回の利用: 特定のサブクエリ結果が一度しか使用されない場合。

  • パフォーマンスが重視される場合: 一部のデータベースエンジンでは、サブクエリの方が効率的に実行されることがあります。


WITH句を使うべき場合



  • 複雑なクエリ: クエリが複数のサブクエリを必要とする場合、CTEを使うことでクエリの構造を明確にし、理解しやすくすることができます。

  • 再利用性: 一時的な結果セットを複数回使用する場合、CTEを使うことで同じクエリを何度も書く必要がなくなります。

  • デバッグとメンテナンスの容易さ: CTEは個別の部分に分けて考えることができるため、デバッグやメンテナンスがしやすくなります。


まとめ

サブクエリとWITH句には、それぞれの適用場面があります。サブクエリはシンプルで一時的なデータ抽出に便利ですが、クエリが複雑になったり再利用が必要な場合には、WITH句を使うことでクエリを整理し、可読性を向上させることができます。私が経験したように、複雑なサブクエリは可読性が低下し、メンテナンスが困難になることがあるため、可読性を重視してWITH句を使うことを検討するのも一つの手です。

New call-to-action