DB/SQL/副問い合わせの利用

Top / 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 (2383d)