【SQL】WITH句の使い方と使いどころ
SQLクエリで利用されるWITH句とは何か、使い方、どのようなときに利用すべきなのかを説明します。
WITH句とは?
WITH句は紐づくSQLクエリの中でのみ利用できる一時的なテーブルを作成するための句です。
実例を見た方が分かりやすいと思うので、MySQLの公式ページに載っている例を転記します。
WITH
cte1 AS (SELECT a, b FROM table1),
cte2 AS (SELECT c, d FROM table2)
SELECT b, d FROM cte1 JOIN cte2
WHERE cte1.a = cte2.c;
SELECTの前にWITH句で2つの一時テーブルcte1とcte2を作成しています。このようにSQLクエリを修飾する形でWITHを利用することで、SQLクエリ内で利用できる一時テーブルを事前に定義出来ます。
また、WITH句で作成したテーブルはあくまで一時テーブルであり、別のSQLクエリでは利用することはできないことに注意です。
使いどころ
WITH句に近いSQL上の仕組みが存在します。一つ目がサブクエリです。2つ目がviewです。それぞれ個別に比較して説明します。
サブクエリとの比較
サブクエリとWITH句はほとんど同じように動作します。しかしいくつかの点で異なるため、どのように使い分けるかは概ね決まっています。
まず、一時テーブルとして利用するならWITH句を使うことをおすすめします。というのもサブクエリはどうしても入れ子の構造になり階層が深くなってしまうのに対し、WITH句はクエリの先頭で階層を深くすることなく記述でき、読みやすいコードになるためです。効果が同じであれば読みやすい方が良いでしょう。
しかしWITH句ではなくサブクエリを利用すべき場面も存在します。それが一時テーブルではなく単一の値を取得してSQLクエリで利用する場合です。具体的には以下のようなクエリが該当します。
SELECT salesperson, amount
FROM sales
WHERE amount > (SELECT AVG(amount) FROM sales);
この例ではサブクエリによってsalesテーブルから取得した値をテーブルとして利用するのではなく、単一の値(スカラーと呼ばれる)として利用しています。WITH句はあくまで一時テーブルを作成する仕組みであり単一の値を取得することはできないため、単一の値を利用したい場合にはサブクエリを利用する必要があります。
サブクエリについては以下の記事で詳しく述べているので併せてご確認ください。
【例付き】サブクエリ(副問い合わせ)とは?【SQL】 | Laplace
Viewとの比較
SQLにはViewという仕組みも存在します。Viewは一つまたは複数のテーブルに対するクエリの実行結果を基にした仮想的なテーブルです。
ViewがWITH句と異なる点は一度作成すると別のクエリでも再利用可能なところです。またWITH句と同じように、Viewに対するクエリを実行したタイミングでViewを生成するテーブルに対して問い合わせを行うため、常に最新のデータを取得することが出来ます。
このような性質から、複数のクエリで頻繁に利用されることが予測される一時テーブルであれば事前にViewとして定義してしまうのが良いです。限られたクエリでしか利用されないようであればWITH句を使うのが良いです。
Viewについてより詳しい説明を聞きたい方は以下の記事にて。
【例付き】ビュー(View)とは?仕組みと使い所【SQL】 | Laplace
まとめ
最後にWITH句について簡単にまとめます。
WITH句は紐づくSQLクエリの中でのみ利用できる一時的なテーブルを作成するための句です。
WITH句と似た仕組みにサブクエリとビューがありますが、以下のように使い分けると良いです。
- サブクエリ:単一の値を取得してクエリで利用したい場合
- View:複数のクエリで利用するテーブルを作成したい場合
- WITH:限られたクエリのみで利用する一時テーブルを定義したい場合