SQLにおけるCTEs(共通テーブル式)の理解
James Reed
Infrastructure Engineer · Leapcell

Key Takeaways
- CTEはSQLクエリの可読性と構造を向上させます。
- 再帰的なCTEは階層的なデータを簡単に処理するのに役立ちます。
- CTEは広くサポートされていますが、必ずしもパフォーマンスを向上させるとは限りません。
はじめに
構造化照会言語(SQL)は、リレーショナルデータベースを管理およびクエリするための強力なツールです。その多くの機能の中でも、共通テーブル式(CTE)は、複雑なクエリを整理するためのエレガントで効果的な方法として際立っています。SQL:1999で導入され、Microsoft SQL Server、PostgreSQL、MySQL(バージョン8.0以降)、Oracleなどの最新のデータベースシステムで広くサポートされているCTEは、可読性と柔軟性の両方を提供します。
CTEとは?
共通テーブル式(CTE)は、単一のSQLステートメントの実行スコープ内で定義される一時的な結果セットです。SELECT、INSERT、UPDATE、またはDELETEステートメント内で参照できる名前付きクエリと考えてください。サブクエリとは異なり、CTEは可読性を向上させ、再帰をサポートし、複雑な操作をよりシンプルで保守しやすい部分に分割できます。
CTEの構文
CTEの基本的な構文は次のとおりです。
WITH cte_name (column1, column2, ...) AS ( SELECT ... FROM ... WHERE ... ) SELECT * FROM cte_name;
WITH
キーワードはCTEを導入します。cte_name
は、一時的な結果セットに付ける名前です。- 括弧内には、オプションで列名を指定できます。
- 括弧内のSELECTステートメントは、CTEのデータを定義します。
例:単純なCTEの使用
Employees
というテーブルがあり、平均給与よりも高い給与を得ているすべての従業員を見つけたいとします。CTEを使用すると、次のように記述できます。
WITH AverageSalary AS ( SELECT AVG(Salary) AS AvgSalary FROM Employees ) SELECT Name, Salary FROM Employees, AverageSalary WHERE Employees.Salary > AverageSalary.AvgSalary;
このアプローチにより、従来のサブクエリと比較して、クエリの読みやすさと保守性が向上します。
再帰的なCTE
CTEの最も強力な用途の1つは再帰です。再帰的なCTEを使用すると、組織図内のマネージャーのすべての部下を見つけるなど、階層的またはツリー構造のクエリを実行できます。
簡単な例を次に示します。
WITH RecursiveCTE AS ( SELECT EmployeeID, ManagerID, Name FROM Employees WHERE ManagerID IS NULL -- トップマネージャーから開始 UNION ALL SELECT e.EmployeeID, e.ManagerID, e.Name FROM Employees e INNER JOIN RecursiveCTE r ON e.ManagerID = r.EmployeeID ) SELECT * FROM RecursiveCTE;
このクエリは、すべての従業員を管理階層ごとに整理して返します。
CTEを使用する利点
- 可読性の向上: サブクエリに名前を付けることで、SQLコードをより読みやすく、保守しやすくすることができます。
- モジュール化: 複雑なクエリを論理的な構成要素に分割できます。
- 再帰クエリ: 再帰的なCTEは、階層的なデータを扱う場合に非常に役立ちます。
- 再利用: 同じCTEをクエリ内で複数回参照できます。
制限事項と考慮事項
- スコープ: CTEは、定義されているステートメント内でのみ表示されます。
- パフォーマンス: CTEは可読性を向上させますが、場合によっては、サブクエリまたは派生テーブルよりもパフォーマンス上の利点がない場合があります。常にクエリプランを確認し、必要に応じて最適化してください。
- サポートされていない機能: 一部の古いデータベースシステムまたは以前のバージョンでは、CTEがサポートされていない場合があります。
結論
CTEは、最新のSQLの汎用的で不可欠な機能です。複雑なクエリを簡素化し、再帰を可能にし、SQLコード全体の構造を改善します。CTEをマスターすることで、より効率的で読みやすく、保守しやすいSQLクエリを作成できます。
FAQs
CTEは、複雑なクエリを整理するための一時的な結果セットです。
CTEを使用すると、SQLクエリが読みやすく、保守しやすくなります。
ほとんどの最新のデータベースはCTEをサポートしていますが、古いバージョンではサポートされていない場合があります。
バックエンドプロジェクトのホスティングに最適なLeapcellはこちらです。
Leapcellは、ウェブホスティング、非同期タスク、Redis向けの次世代サーバーレスプラットフォームです。
多言語サポート
- Node.js、Python、Go、またはRustで開発します。
無制限のプロジェクトを無料でデプロイ
- 使用量に対してのみ料金が発生します — リクエストも料金もかかりません。
比類のないコスト効率
- アイドル料金なしの従量課金制。
- 例:25ドルで、平均応答時間60msで694万リクエストをサポートします。
合理化された開発者エクスペリエンス
- 簡単なセットアップのための直感的なUI。
- 完全に自動化されたCI/CDパイプラインとGitOps統合。
- 実用的な洞察のためのリアルタイムのメトリックとロギング。
簡単なスケーラビリティと高性能
- 高い並行性を簡単に処理するための自動スケーリング。
- 運用オーバーヘッドはゼロ — 構築に集中するだけです。
詳細については、ドキュメントをご覧ください!
Xでフォローしてください: @LeapcellHQ