

高岡智則
年齢:33歳 性別:男性 職業:Webディレクター(兼ライティング・SNS運用担当) 居住地:東京都杉並区・永福町の1LDKマンション 出身地:神奈川県川崎市 身長:176cm 体系:細身〜普通(最近ちょっとお腹が気になる) 血液型:A型 誕生日:1992年11月20日 最終学歴:明治大学・情報コミュニケーション学部卒 通勤:京王井の頭線で渋谷まで(通勤20分) 家族構成:一人暮らし、実家には両親と2歳下の妹 恋愛事情:独身。彼女は2年いない(本人は「忙しいだけ」と言い張る)
共通テーブル式とは?
共通テーブル式(Common Table Expression、CTE)は、複雑な SQL クエリを分かりやすく整理するための仕組みです。呼び方としては「共通のテーブルを式として使う」という意味の表現がよく使われます。CTE を使うと、長い処理を段階的に分けて書けるので、読み返すときや他の人に説明するときにとても役立ちます。
CTE の基本は、WITH というキーワードを使って「仮のテーブル」を定義し、その仮の名前を後の SELECT で参照することです。仮のテーブルは「一時的なデータの名前付きの箱」のようなもので、クエリの途中で何度も使えます。
なぜCTEが役立つのか
たとえば売上データを部門ごとに集計してから、さらにその結果を使って別の計算をする場合、サブクエリを何重にも書くことになり、読みにくくなります。CTE を使えば「まずこの仮データを作る」という段階を分けて書けるので、全体の流れが一目で理解できます。
基本の書き方
基本形は次のとおりです。WITH で仮テーブルを定義し、定義した名前を後の SELECT で参照します。以下は簡単な例です。
WITH top_sales AS ( SELECT department, SUM(amount) AS total FROM sales GROUP BY department ) SELECT department, total FROM top_sales WHERE total > 1000;
簡単なデータのイメージ
| 売上 | |
|---|---|
| A | 1200 |
| B | 800 |
| C | 1500 |
この表のようなデータを使って、CTE で仮テーブルを作成し、それを元に最終のクエリを実行します。すると、どの部門が条件を満たしているかをすぐに理解できます。
再帰的共通テーブル式の例
CTE には再帰的な書き方もあります。再帰的 CT E を使うと、階層的なデータの処理や、反復的な計算を一つのクエリで実現できます。以下は再帰的 CT E の簡単な例です。
WITH RECURSIVE nums(n) AS ( SELECT 1 UNION ALL SELECT n+1 FROM nums WHERE n < 5 ) SELECT n FROM nums;
注意点とヒント
CTE は定義した名前がその後のクエリの範囲で有効です。複雑さが増える場合は、読みやすさを保つためにコメントをつけると良いでしょう。また、データベースによってはCTEの最適化の方法が異なることがあるので、使っている DB の仕様を確認してください。
まとめ
共通テーブル式は複雑な SQL を分解して理解しやすくする強力なツールです。最初は「WITH で仮テーブルを作り、それを後の SELECT で参照する」という基本形を押さえることから始めてください。慣れてくると、複数の処理を一つの読みやすいクエリとしてまとめられるようになります。
共通テーブル式の同意語
- 共通テーブル式
- SQLの WITH句を使って宣言する、一時的な結果セットに名前を付ける機能。読みやすくし、再利用性を高める目的で用いる。
- CTE
- Common Table Expressionの略語。英語表記での名称で、WITH句を用いて定義する仮想的なテーブルを指す。
- Common Table Expression
- 英語表記の名称。日本語では『共通テーブル式』と同義で、WITH句で宣言された仮想テーブルを指す概念。
共通テーブル式の対義語・反対語
- サブクエリ
- 意味: クエリの中に別のSELECTを直接書く方法。共通テーブル式(CTE)を使わず、1回限りの結果を参照します。CTEの代替として使われることが多いです。
- 派生表
- 意味: FROM句に置くサブクエリを派生表として扱う書き方。CTEを使わずに同様の結果を得る手法です。
- 直接書きSQL
- 意味: WITH句を使わず、1つのSELECT文だけで完結させる書き方。
- WITH句なしのSQL
- 意味: WITH句を使わないSQL表現。再利用性は落ちますが、単純な処理には向きます。
- 単発クエリ
- 意味: 複数の段階で結果を組み立てるCTEを使わず、1回のクエリで完結させるスタイル。
- 非CTE型のSQL
- 意味: 共通テーブル式を使わない設計のSQL全般。読みやすさや再利用性が低下する場合がある一方、実装がシンプルです。
- ネストされたサブクエリ
- 意味: サブクエリの中にさらに別のサブクエリを組み込み、階層的に条件を組み立てる書き方。CTEを使わずに複雑さを表現します。
- 直書きクエリ
- 意味: クエリをその場で直書きして記述する表現。CTEの名前付きテーブルを作らずに済みます。
- 1つのSELECTで完結するSQL
- 意味: 複数の補助的な式を切り離さず、1つのSELECT文だけで要件を満たす設計。
共通テーブル式の共起語
- CTE
- Common Table Expressionの略。SQLで共通の仮想テーブルを定義する機能の総称です。
- CTE名
- CTEを参照する際の識別子となる名前のことです。
- 名前付きCTE
- CTEに名前をつけて再利用する考え方のことです。
- WITH句
- 共通テーブル式を定義するための構文。WITHの後にCTE名とASを付けて仮想テーブルを作成します。
- WITH RECURSIVE
- 再帰的CTEを使う際の構文で、親子関係をたどる階層データの取得に有効です。
- 再帰的共通テーブル式
- 自己参照を用いてデータを再帰的に展開するCTEのことです。
- 再帰的クエリ
- 再帰を使ってデータを段階的に取得するクエリの総称です。
- 非再帰的共通テーブル式
- 階層を持たない通常のCTEのことです。
- アンカー
- 再帰CTEの基盤となる初期データを定義する部分です。
- 再帰部
- 自己参照を行い、結果を再帰的に拡張する部分を指します。
- UNION ALL
- 再帰CTEで前回の結果と新しい結果を連結するためによく使われる演算子です。
- UNION
- 2つ以上の結果を結合しますが重複を取り除く点がUNION ALLと異なります。
- サブクエリ
- CTEとは別にクエリの中に書く別のクエリで、再利用性や可読性の観点から比較されます。
- 実行計画
- CTEを含むクエリの実行方法とコストをDBの実行計画で確認します。
- パフォーマンス
- CTEの性能はケースにより異なるため、適切な使い分けが重要です。
- 可読性
- 長いクエリを分割して読みやすくする効果があります。
- 一時テーブル
- CTEは実質的に一時的な結果セットとして扱われ、クエリ終了後に破棄されます。
- 一時的な結果セット
- クエリの途中で生成される仮想テーブルのことです。
- ベーステーブル
- 再帰CTEのアンカー部が参照する基になるデータを含むテーブルのことです。
- 参照テーブル
- CTEがデータを引く元となるテーブルのことです。
- 階層データ
- 親子関係を表すデータなど階層構造を扱う場面で便利です。
- 階層クエリ
- 階層構造を辿るためのクエリのことです。
- 親子関係
- 階層データの具体的な例として、上位と下位の関係を表します。
- SQL Server
- Microsoft製のRDBMSでCTEのサポートが充実しています。
- PostgreSQL
- WITH RECURSIVEを活用した強力な再帰CTEが特徴のDBMSです。
- MySQL
- 8.0以降にCTEが標準サポートされ、再帰も可能です。
- SQLite
- 軽量なデータベースでもCTEが利用できます。
- 標準SQL
- 共通テーブル式はSQL標準の機能として規定されており、DBMS間で共通に利用できます。
共通テーブル式の関連用語
- 共通テーブル式 (CTE)
- SQLで一時的な結果セットを名前付きの表として定義する機能。WITH句を使い、複数のクエリをまとめて再利用できる。
- WITH句
- CTEを定義する文の先頭に置く句。複数のCTEをカンマ区切りで宣言し、主クエリの前に現れる。
- WITH RECURSIVE
- 再帰的なCTEを定義する際に使うキーワード。PostgreSQLやSQLiteなどで用いられる。
- 再帰的共通テーブル式
- 自分自身を参照してデータを階層的に展開するCTE。アンカー部と再帰部で構成される。
- 再帰クエリ
- 再帰を用いたクエリ全般のこと。再帰的CTEを含むことが多い。
- アンカー部
- 再帰の起点となる最初のSELECT。これをもとに再帰が展開される。
- 再帰部
- 自分自身を参照して新しい行を生成する部分。アンカー部の結果を基に追加行を作る。
- UNION ALL
- アンカー部と再帰部の結果を結合する際に使う。重複を自動で排除せず結合するため再帰でよく使われる。
- 自己参照
- 再帰部がCTE自身を参照して処理を進める仕組み。再帰の要です。
- 階層構造の表現
- 親子関係などの階層データを表現・探索するのにCTEが便利。
- 再帰深さ
- 再帰が進む深さのこと。無限ループを防ぐために深さ制限や終了条件を設ける。
- 終了条件
- 再帰をいつ止めるかを決める条件。適切に設定しないと無限ループになる可能性がある。
- マテリアライズ
- CTEの結果を一時的に保存して再利用する。実行計画に影響し得る。
- NOT MATERIALIZED
- CTEを物理的に保存せずに再計算する指定。デフォルトの挙動を変えることがある。
- スカラーCTE
- 1行1列だけを返すCTE。値の注入や条件分岐で使われることがある。
- CTEのスコープ
- WITH句で宣言されたCTEはそのSQL文の中でのみ有効。
- 実行計画とパフォーマンス
- 可読性向上の一方で再帰CTEはパフォーマンスに影響を与えることがある。適切なインデックスや条件で最適化を図る。
- CTEとサブクエリの違い
- CTEは複数箇所で再利用でき、可読性が高い。サブクエリはネストされた1箇所の処理になりやすい。
- DBMS固有の差異
- DBMSごとにWITH/CTEの記法や動作が異なる。例: PostgreSQL、SQL Server、MySQL、Oracle、SQLiteの差異に注意。
- データの更新・削除での利用
- CTEを先に絞り込んだ結果をUPDATE/DELETEで使うなど、複雑な操作を分解して記述しやすくする。



















