
サブクエリ(副問い合わせ)とは?
一言で言えば、SELECT文の中で使用できる「使い捨てのビュー」です。
サブクエリの階層を増やした場合
サブクエリの階層を増やすと、複数文ではなく、単一のSQLで書けるというメリットもありますが、下記のデメリットがあるのでなるべく避けた方がよいでしょう。
- SQL文が読みづらくなる。
- パフォーマンスが悪くなる。
サブクエリに名前を付けるには?
ASキーワードを使用してもよいですし、省略してもかまいません。
サブクエリのメリット
サブクエリ はパフォーマンス面において不利な点が多いです。
ただ、結合が関係するクエリにおいては性能面でサブクエリを使っていくというのも選択肢の一つになってきます。
例えば、以下のような二つの例があるとします。
joinを先にやって、条件を絞る。
1 2 3 |
select * from テーブル1 inner join テーブル2 on 結合条件 where 条件 |
サブクエリ の中で条件を抽出してそれをjoinする。
1 2 |
select * from テーブル1 inner join (条件つきのサブクエリ) on 結合条件 |
この場合だと、joinで結合するテーブルの件数が減るので、サブクエリ を使用した方がパフォーマンスが良くなるケースがあります。
サブクエリ の問題点
サブクエリ の計算コストが上乗せされる。
サブクエリ はテーブルと違って実体のデータを保持していないので、アクセスするたびにSELECT文が発行されて計算コストがかかります。サブクエリ の中身が複雑であればあるほどこのコストは増えます。
データのI/Oコストがかかる。
計算した結果がメモリ上に乗れば早いのですが、メモリからはみ出た場合は「TEMP落ち」になって速度が低下します。
最適化が受けられない。
明示的に制約やインデックスを使っているテーブルと違って、サブクエリ にはそのようなメタ情報が一切存在しない。
オプティマイザがクエリを解析するための必要な情報がサブクエリ の結果からは得ることができません。
対策
本当にサブクエリ を使わないとできないかを常に考えるようにすること。
ウインドウ関数などで置き換えられないか考える。
サブクエリの注意点
基本的には、通常のサブクエリであれば、複数行返すのでSELECT句には書けません。
また、WHERE句に書いたとしても、比較演算子を使うことができません。
しかし、「スカラ・サブクエリ」という類のサブクエリを使うことで、書ける場所が広がります。
スカラ・サブクエリとは?
サブクエリの実行結果として、「必ず1行、1列の値を返す」サブクエリのことです。
スカラ・サブクエリの戻り値の例
ITEM |
---|
商品1 |
スカラ・サブクエリの特徴
比較演算子(=、<、>等)を使うことができます。
例えば、WHERE句では、集計関数を使うことはできませんが、サブクエリで集計するSELECT文を作って、その結果を返せば、WHERE句で集計結果の抽出と言うような使い方も可能です。
SELECT文の中で、書ける場所が多い。
基本的には、複数行を返すサブクエリの場合は、書ける場所も制限があります。
しかし、スカラ・サブクエリの場合は、定数や列名を記述できる場所であればどこでもよく、記述できる句が多いです。
- SELECT句
- GROUP BY句
- HAVING句
- ORDER BY句
相関サブクエリ
複数行値を返すようなサブクエリでも、条件を指定してテーブルの一部分のみに絞ることで、述語(=、<、>等)を使えるようにする目的で使うサブクエリです。
詳しくは下記の記事でも解説しています。
この記事へのコメントはありません。