サブクエリまとめ

友人がサブクエリが分からないと言っていたので、
今日はサブクエリのお勉強。

サブクエリについては、SELECTの中にSELECTがあったり訳が分からなくなりそうですが、要するにカッコの中を先に計算しましょうということ。
数学のカッコ()と同じと考えれば分かりやすいと思う。

サブクエリ内とメインクエリで同じ表を参照していると分かりやすいので、例を一つ。

ex1)
select username from dba_users
  where username=(
    select usernaem from dba_users where username='SYS');
ex2)
select username from dba_users
  where username='SYS';

上記ex1)とex2)では検索結果では全く同じものが返ってくる。
なぜなら、ex1)のサブクエリ部がSYSとなり、カッコ内がSYSとなるからだ。
また、ex1)の様に、サブクエリ部が返す値が一行に固定されるものを、単一行サブクエリと呼んだりする。

サブクエリ部が返す行が一行に固定される単一行サブクエリに対して、複数の行を返すサブクエリを複数行サブクエリと呼ぶ。
下記ex3)のサブクエリ部を実行すると、Oracleデフォルトでは、SYS,SYSMAN,SYSTEMの三行が返ってくる。
また、複数行サブクエリでは、演算子として「=」を使用することはできず、「any,in,all」の三種類を演算子として使用することができる。

ex3)
select username from dba_users
  where username in (
    select username from dba_users
      where username like 'SYS%'
      );

まとめ

  • サブクエリ部分は()で囲う
  • メインクエリの比較などがサブクエリ部と実施されること以外は通常の演算と同じ
  • サブクエリは返される行数によって、単一行サブクエリ、複数行サブクエリに分類される
  • 単一行サブクエリでは「=,in,any,all」使用可能
  • 複数行サブクエリでは「all,in,any」使用可能
  • where句,having句の後以外のも、select句の後、from句の後など、多彩な場所に指定可能