LoginSignup
0
2

More than 3 years have passed since last update.

Oracle Bronze SQL基礎I -副問合せ-

Posted at

副問合せ

本日の勉強中。今回は、副問合せについて。
サブクエリはややこしくて序盤、躓いてしかいなかった。

理解しきらなかったところを
重点的にまとめるあくまで備忘録

副問合せは、SELECT文のSELECT句、FROM句、WHERE句、HAVING句、ORDER BY句の他、INSERT文やUPDATE文等のDML文でも使用することができます。

副問合せの使用方法

副問合せには、次のようにいろいろな使用方法があります。
・SELECT文のSELECT句、FROM句、WHERE句、HAVING句、ORDER BY句や、
 INSERT文、UPDATE文等のDML文で使用できる
・主問合せと副問合せで異なる表にアクセスできる
・1つの主問合せに対し、複数の副問合せを指定できる
・副問合せをネストできる(WHERE句に指定した副問合せでは255レベルのネストが可能)
・副問合せの中でGROUP BY句やHAVIMG句、ORDER BY句を使用できる

なお、副問合せには、1件のデータを返す単一行副問合せ
複数行の結果を返す複数行副問合せがあります。

複数行副問合せとは、複数件のデータを返す副問合せです。
単一行副問合せと同じようにGROUP BY句を指定したり、
副問合せを(*1)ネストしたりすることができます。

また、複数列のデータを返すこともできます。

(*1)用語は次項で解説

副問合せを記述する場合は必ず()括弧で囲みます。
また、副問合せは通常比較演算子の右辺に記述しますが、左辺に記述してもかまいません。

また、単一行副問合せの場合、比較演算子に複数行演算子を使用しても
エラーにならず正常に実行されます。
しかし、複数行副問合せに単一行演算子を使用するとエラーとなります。

用いられる用語

用語 説明
インライン・ビュー FROM句の副問合せのこと
ネスト 関数の引数に別の関数を指定すること
内部結合 表の結合において結合条件を満たすデータのみを取り出す方法
複数行副問合せ 複数件のデータを返す副問合せのこと

特徴

Oracle DatabaseではSQL文の中に別のSQL文を入れ子にして実行することができ、
入れ子の内側の問合せのことを副問合せといいます
(副問合せに対し、外側の問合せを主問合せといいます)。

通常の副問合せを使用したSQL文ではまず副問合せが実行され、
副問合せの実行結果をもとに主問合せが実行されます。

演算子

演算子 説明
IN リスト内のいずれかの値と等しい場合にTRUEを返す
NOT IN リスト内の全ての値と等しくない場合にTRUEを返す
ALL 'リスト内のすべての値と'という意味で等号不等号記号等を用いて使用される
ANY 'リスト内のいずれかの値と'という意味で等号不等号記号等を用いて使用される

IN演算子

IN演算子はリスト内のいずれかの値と等しい場合にTRUEを返すため、
IN演算子の値のリストにNULL値以外の値が含まれていて、
その値と比較対象の値が等しければ、主問合せでデータが取り出されます。

なお、NULL値同士を判定してもNULL値となり、
値が等しいという判定ができないため、"NULL"である行は取り出されません。

NOT IN演算子

NOT IN演算子は、リスト内の全ての値と等しくない場合にTRUEを返します。
そのため、NOT IN演算子の値のリストにNULL値が含まれていると、
NULL値と比較対象の値の比較結果がNULL値になるので、
全ての値と等しくないという判定がなされず、
主問合せではデータが1件も取り出されません。

・NOT IN(値のリスト)は<>ALL(値のリスト)と等価である
・NOT IN(値のリスト)にNULL値が含まれている場合は、データは1件も返されない

ALL

'リスト内のすべての値と'という意味で等号不等号記号等を用いて使用されます。

演算子 説明
=ALL リスト内すべての値と一致
<>ALL リスト内すべての値と不一致
>ALL リスト内すべての値より大きい
>=ALL リスト内すべての値以上
<ALL リスト内すべての値より小さい
<=ALL リスト内すべての値以下

・=ALL(値のリスト)はIN(値のリスト)と等価ではない

ANY

'リスト内のいずれかの値と'という意味で等号不等号記号等を用いて使用されます。

演算子 説明
=ANY リスト内のいずれかの値と一致
<>ANY リスト内のいずれかの値と不一致
>ANY リスト内のいずれかの値より大きい
>=ANY リスト内のいずれかの値以上
<ANY リスト内のいずれかの値より小さい
<=ANY リスト内のいずれかの値以下

・=ANY(値のリスト)はIN(値のリスト)と等価である

次回

ハッピーターンを食べながら書いた今回の記事ですが、
見落としが多く、落ち着いて解いたら取れそうなんだよなあ。

引き続き進めていきます。。

随時更新中@あんず飴

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2