副問合せ
本日の勉強中。今回は、副問合せについて。
サブクエリはややこしくて序盤、躓いてしかいなかった。
理解しきらなかったところを
重点的にまとめるあくまで備忘録。
副問合せは、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(値のリスト)と等価である
次回
ハッピーターンを食べながら書いた今回の記事ですが、
見落としが多く、落ち着いて解いたら取れそうなんだよなあ。
引き続き進めていきます。。
随時更新中@あんず飴