DB/SQL/副問い合わせの利用
副問い合わせの基本†
副問い合わせは、SQL 文の中に、別の SQL 文を含めること。SELECT 文の中にもうひとつ SELECT 文を入れるパタンが多い気がするけど、INSERT 文でほかの表からレコードを挿入したり、 CREATE 文でほかのテーブルの設定をパクってくるときにも使う。
このページでは、SELECT 文の中に SELECT 文を入れるパタンを扱う。
副問い合わせは、主に以下の場所で使う。
- WHERE 句の条件の値として
- HAVING 句の条件の値として
- FROM 句の表として
中に入れるほうの SELECT 文の結果が一行なのか複数行なのかで、『単一行副問い合わせ』と『複数行副問い合わせ』とで区別される。
単一行副問い合わせ†
副問い合わせの結果が一行なときをさす。一行のつもりだったのに二行返ってくるとかしちゃうとエラーになるので注意。
- 方法
-- WHERE 句の条件の値として使うパタン select fuga, piyo from hoge where fuga = (select max(bar) from foo); - 補足
- 副問い合わせの SELECT 文が一行だけを返すことが保証されない場合は、WHERE の = の判定で副問い合わせを使うのは望ましくない。エラーになる
複数行副問い合わせ†
副問い合わせの結果が複数行なときをさす。副問い合わせで一列のみ返すようにしたならリストとして扱え、二列以上を返すようにしたなら表として扱える。
- 方法
-- WHERE 句の条件の値として使うパタン select fuga, piyo from hoge where fuga in (select bar from foo); -- FROM 句の表として使うパタン select fuga, piyo from (select bar as fuga, baz as piyo from foo);
- 補足
- WHERE 句では、IN の他にも ANY や ALL をよく使うかも。詳細はSQL/射影と選択#n57370a6に記述
- 副問い合わせの結果に NULL を含む場合は NOT IN (<> ALL と同義)句などで注意が必要
- fuga not in ('hoge', 'piyo', null) の結果は全部 NULL になる
Last-modified: 2011-10-17 (月) 20:05:24