コンテンツへスキップ
uencoder

SQL のサブクエリと CTE を使う

サブクエリは、クエリの中に別のクエリをネストします。CTE(WITH 句)は名前付きで読みやすいサブクエリを提供します。それぞれの使い分けを学びましょう。

  1. 1

    サブクエリは SELECT、FROM、WHERE、HAVING 句の中に現れます。種類:スカラー (1 つの値を返す)、行 (1 行)、テーブル (複数行) です。CTE (Common Table Expressions、WITH name AS (...)) は名前付きサブクエリで、可読性が向上し、再帰も可能です。可読性のため、入れ子のサブクエリよりも CTE を優先してください。ほとんどのデータベースで、オプティマイザーは両者を同等に扱います。

  2. 2
    SQL フォーマッター →

    サブクエリや CTE を含むクエリを整形します。サブクエリでは、整形により入れ子の深さが分かります。CTE では、各名前付きクエリが明確になります。CTE 構文を優先してください。深く入れ子になったサブクエリより読みやすく、デバッグしやすいです。

  3. 3

    SQL 整形ワークフローを使って、複数の CTE やサブクエリを含む複雑なクエリを整形します。理解しやすく保守しやすい、整然としたコメント付き SQL が得られます。

よくある質問

CTE とサブクエリはどちらがよいですか?
CTE は (名前付きで、順次記述でき、フラットなため) 可読性が高く、再帰も可能です。サブクエリは単純なケースではよりコンパクトです。性能は通常同じです。オプティマイザーが CTE をインラインに展開します。複雑なクエリや再帰には CTE を、単純な 1 回限りのケースにはサブクエリを使ってください。
再帰 CTE とは何ですか?
自分自身を参照する CTE で、階層データ (組織図、ファイルシステム、グラフ探索) に使われます。構造:WITH RECURSIVE name AS (基底ケース UNION ALL 再帰ステップ)。再帰は、新しい行が生成されなくなるまで続きます。PostgreSQL、MySQL 8 以降、SQLite、SQL Server でサポートされています。

このタスクを解決するワークフロー

関連ツール