読みやすい SQL のために CTE を使う
共通テーブル式(WITH 句)は名前付きの一時結果セットを作り、可読性を高め、再帰も可能にします。
- 1
CTE は WITH name AS (SELECT ...) で定義され、テーブルのように参照できます。複数の CTE は WITH a AS (...), b AS (...) SELECT ... と書きます。CTE はクエリごとに 1 回だけ評価されます (複数回評価されうるサブクエリとは異なります)。再帰 CTE (WITH RECURSIVE) は自分自身を参照でき、階層クエリに使えます。
- 2 SQL フォーマッター →
CTE クエリを整形して、各名前付き結果セットを明確に把握します。良い整形は、WITH キーワード、カンマ区切りの CTE 名、メインクエリの位置を揃えます。これにより複雑なクエリが読みやすく、保守しやすくなります。
- 3 sql-format → word-count
SQL 整形ワークフローを使って、CTE クエリを整形・ドキュメント化します。各 CTE の目的を説明するコメント付きの整然とした SQL が得られ、クエリが自己文書化されます。
よくある質問
- CTE は実体化されますか?
- PostgreSQL 12 より前では、CTE は常に実体化されます (1 回計算して保存)。PostgreSQL 12 以降では、MATERIALIZED を指定しない限り、デフォルトでインライン化されます (サブクエリと同様)。SQL Server と MySQL では、CTE はインライン化されます。CTE が複数回参照される場合は実体化が有利で、オプティマイザーが述語をプッシュダウンできる場合はインライン化が有利です。
- CTE はテンポラリテーブルの代わりになりますか?
- 1 つのクエリ内での使用なら、はい。CTE のほうがすっきりします。複数のステートメントで (同じデータを参照する複数のクエリで) 使うなら、テンポラリテーブルを使ってください。CTE は 1 つのステートメント内にしか存在しません。また、テンポラリテーブルにはインデックスを付けられますが、CTE には付けられません。
このタスクを解決するワークフロー
SQL フォーマットと単語統計によるドキュメント化
SQL クエリを整形し、その後フォーマットされた出力を単語統計で分析する。 パイプライン
Lorem Ipsum 生成と単語カウント
Lorem Ipsum テキストを生成し、その後単語をカウントする。 パイプライン
SQL フォーマットと構文検証
SQL クエリをフォーマットし、その後構文を検証する。 パイプライン
テキストのクリーンアップ後の単語統計分析
テキストをトリムして正規化し、その後単語/文字/行統計を計算する。 パイプライン
行の重複除去と単語カウント
行をソートして重複を除去し、その後残りの単語をカウントして簡単な在庫を得る。 パイプライン
テキストの小文字化と単語カウント
テキストのケースを正規化し、その後分析のために単語をカウントする。 パイプライン
URL 除去と単語カウント
テキストから URL を除去し、その後残りの単語をカウントする。 パイプライン
Title Case と単語カウント
Title Case に変換し、その後単語をカウントする。 パイプライン
テキストの折り返しと単語カウント
長いテキストを折り返し、その後結果の単語をカウントする。 パイプライン
関連ツール
SQL フォーマッター
Beautify or minify SQL queries online. Uppercase keywords, indent clauses, or compress to a single line。無料、プライベート、100%クライアントサイド。 ツール
JSON バリデーター
Validate JSON and pinpoint syntax errors by line and column。無料、プライベート、100%クライアントサイド。 ツール
テーブル編集&変換ツール
Edit tabular data and export to CSV/JSON/HTML/Markdown。無料、プライベート、100%クライアントサイド。 ツール