SQL Common Table Expressions(CTEs)の理解
Min-jun Kim
Dev Intern · Leapcell

Key Takeaways
- CTEは、複雑なSQLクエリをより読みやすく、保守しやすくします。
- CTEは、階層データの再帰クエリをサポートします。
- CTEは一時的なものであり、クエリの実行中にのみ存在します。
構造化照会言語(SQL)は、リレーショナルデータベースの管理と操作に不可欠です。データベースクエリがより複雑になるにつれて、SQLはコードをより読みやすく、保守しやすくするためのさまざまなツールを提供します。最も強力な機能の1つは、**共通テーブル式(CTE)**です。この記事では、CTEとは何か、その仕組み、そしてSQLプログラミングで役立つ理由について探ります。
共通テーブル式とは?
共通テーブル式(CTE)とは、SELECT、INSERT、UPDATE、またはDELETEステートメント内で参照できる一時的な結果セットです。CTEは、特に複数のサブクエリまたは再帰的な操作を含む複雑なクエリを簡素化するのに役立ちます。
CTEは、WITH
キーワードの後にCTE名とCTEを定義するクエリを使用して定義されます。CTEは、ステートメントの実行中にのみ存在します。
構文例
WITH CTE_Name (column1, column2, ...) AS ( SELECT column1, column2, ... FROM table_name WHERE condition ) SELECT * FROM CTE_Name;
CTEを使用する利点
SQLクエリでCTEを使用する理由はいくつかあります。
- 可読性の向上: CTEは、複雑なクエリを論理的なビルディングブロックに分割します。
- コードの再利用性: クエリ内でCTEを複数回参照できます。
- 再帰サポート: CTEは再帰クエリを有効にし、階層データまたはツリー構造データに役立ちます。
- 保守性: CTEはコードの繰り返しを減らし、クエリのデバッグと変更を容易にします。
実用的な例
1. サブクエリの簡素化
会社の平均給与よりも高い給与の従業員を一覧表示するとします。
WITH AvgSalary AS ( SELECT AVG(salary) AS avg_sal FROM employees ) SELECT name, salary FROM employees WHERE salary > (SELECT avg_sal FROM AvgSalary);
2. 再帰CTEの例
再帰CTEは、組織図やカテゴリツリーなどの階層データに特に役立ちます。
例:従業員テーブルでマネージャーのすべての子分を検索します。
WITH RECURSIVE Subordinates AS ( SELECT employee_id, name, manager_id FROM employees WHERE manager_id IS NULL -- トップマネージャーから開始 UNION ALL SELECT e.employee_id, e.name, e.manager_id FROM employees e INNER JOIN Subordinates s ON e.manager_id = s.employee_id ) SELECT * FROM Subordinates;
CTE対一時テーブルとビュー
- 一時テーブル: セッションの間データベースに存在し、明示的な作成と削除が必要です。
- ビュー: データベーススキーマに格納されている永続的なオブジェクトです。
- CTE: 単一のクエリの実行中にのみ存在するため、軽量で中間計算に最適です。
CTEの制限
CTEは便利ですが、制限があります。
- インデックスが作成されておらず、大きなデータセットで過剰に使用するとパフォーマンスに影響を与える可能性があります。
- スコープは、定義されているステートメントに限定されます。
結論
共通テーブル式(CTE)は、複雑なクエリの作成、読み取り、および保守をはるかに簡単にする強力なSQL機能です。ロジックを管理しやすい部分に分割し、再帰をサポートし、ネストされたサブクエリに代わるよりクリーンな方法を提供します。CTEを習得することで、SQL開発者はより効率的で保守可能なデータベースコードを作成できます。
FAQs
CTEは、SQLステートメント内で使用される一時的な結果セットです。
CTEはクエリの実行中にのみ存在しますが、一時テーブルはより長く保持されます。
複雑なSQLクエリまたは再帰的なSQLクエリを簡素化するためにCTEを使用します。
Leapcellは、バックエンドプロジェクトをホストするための最良の選択肢です。
Leapcellは、Webホスティング、非同期タスク、およびRedis向けの次世代のサーバーレスプラットフォームです。
多言語サポート
- Node.js、Python、Go、またはRustで開発します。
無制限のプロジェクトを無料でデプロイ
- 使用量に対してのみ支払い—リクエストも料金もかかりません。
圧倒的な費用対効果
- アイドル料金なしで、使用量に応じて支払い。
- 例:25ドルで、平均応答時間60msで694万リクエストをサポートします。
合理化された開発者エクスペリエンス
- 簡単なセットアップのための直感的なUI。
- 完全に自動化されたCI / CDパイプラインとGitOps統合。
- 実用的な洞察のためのリアルタイムのメトリックとロギング。
簡単なスケーラビリティと高性能
- 高い同時実行性を簡単に処理するための自動スケーリング。
- 運用上のオーバーヘッドはゼロ—構築に集中するだけです。
詳細については、ドキュメントをご覧ください。
Xでフォローしてください:@LeapcellHQ