本節ではPostgreSQLで使用できるSQL準拠の副問い合わせについて説明します。 本節で記載した全ての式は結果として論理値(真/偽)を返します。
EXISTS
EXISTS (subquery
)
EXISTS
の引数は、任意のSELECT
文、つまり副問い合わせです。
副問い合わせはそれが何らかの行を返すか否かの決定のために評価されます。
もし1つでも行を返すのであれば、EXISTS
の結果は「true(真)」となり、副問い合わせが行を返さない場合、EXISTS
の結果は「false(偽)」となります。
副問い合わせは、取り囲んでいる問い合わせから変数を参照することができ、その値は副問い合わせの評価時には定数として扱われます。
この副問い合わせは通常、最後まで実行されず、少なくとも1つの行が返されたかどうかを判定し得るに足りる時点まで実行されます。 (シーケンス関数を呼び出すような)副作用のある副問い合わせを記述することは配慮不足です。副作用が生じるかどうかは予想できません。
結果は何らかの行が返されるのかのみに依存し、それらの行の内容には依存しないことから、副問い合わせの出力リストは通常重要ではありません。
よく使われるコーディング規約は、全てのEXISTS
テストをEXISTS(SELECT 1 WHERE ...)
といった形式で記述することです。
とは言っても、INTERSECT
を使う副問い合わせのようにこの規則には例外があります。
以下の簡単な例はcol2
上の内部結合に似ていますが、しかしたとえtab2
の行といくつか一致したとしてもtab1
のそれぞれの行に対して最大限1つの出力行を生成します。
SELECT col1 FROM tab1 WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
IN
expression
IN (subquery
)
右辺は括弧で括られた副問い合わせで、正確に1列を返すものでなければなりません。
左辺式は評価され、副問い合わせの結果行と比較されます。
副問い合わせの行のどれかと等しい場合、IN
の結果は「true(真)」です。
(副問い合わせが行を返さない場合を含め)等しい行が見つからない場合、結果は「false(偽)」です。
左辺の式がNULLを生じる場合、または右辺の値に等しいものがなくて少なくとも1つの右辺の行がNULLを持つ場合、IN
構文の結果は偽ではなくNULLとなることに注意してください。
これは、NULL値の論理的な組み合わせに対するSQLの標準規則に従うものです。
EXISTS
と同様、副問い合わせが完全に評価されることを前提としてはなりません。
row_constructor
IN (subquery
)
IN
のこの形式の左辺は、4.2.13で説明する、行のコンストラクタです。
右辺は括弧で括られた副問い合わせで、左辺の行にある式の数と正確に同じ数の列を返さなければなりません。
左辺の式は副問い合わせの結果のそれぞれの行に対し、行に関して評価、比較が行われます。
副問い合わせの行に等しいものが見つかった場合、IN
の結果は「true(真)」となります。
(副問い合わせが行を返さない場合を含め)等しい行が見つからない場合、結果は「false(偽)」です。
通常通り、行にあるNULL値はSQLの論理式の標準規則で結合されます。
2つの行は対応する全ての構成要素が非NULLかつ等しい場合に等しいとみなされます。
1つでも対応する構成要素が非NULLかつ等しくないものがあれば、2つの行は等しくないとみなされます。
それ以外の場合、その行の比較結果は不明(NULL)です。
行毎の結果すべてが不等もしくはNULLの場合、少なくとも1つのNULLがあると、IN
の結果はNULLとなります。
NOT IN
expression
NOT IN (subquery
)
右辺は括弧で括られた副問い合わせで、正確に1つの列を返さなければなりません。
左辺の式は副問い合わせ結果の行それぞれに対して評価、比較されます。
等しくない副問い合わせの行だけがある(副問い合わせが行を返さない場合を含む)と、NOT IN
の結果は「true(真)」です。
等しい行が1つでもあれば、結果は「false(偽)」です。
左辺の式でNULLが生じる場合、または右辺の値に等しいものがなく、少なくとも1つの右辺の式がNULLを生み出す場合、NOT IN
構文の結果は真ではなくNULLとなることに注意してください。
これは、NULL値の論理的な組み合わせに対するSQLの標準規則に従うものです。
EXISTS
と同様、副問い合わせが完全に評価されることを前提としてはなりません。
row_constructor
NOT IN (subquery
)
NOT IN
のこの形式の左辺は、4.2.13で説明する行コンストラクタです。
右辺は括弧で括られた副問い合わせで、左辺の行にある式の数と正確に同じ数の列を返さなければなりません。
左辺の式は副問い合わせの結果のそれぞれの行に対し、評価、比較が行われます。
副問い合わせの行に不等のもののみが見つかった場合(副問い合わせが行を返さない場合を含む)、NOT IN
の結果は「true(真)」となります。
等しい行が1つでも見つかった場合、結果は「false(偽)」です。
通常通り、行にあるNULL値はSQLの論理式の標準規則で結合されます。
2つの行は対応する全ての構成要素が非NULLかつ等しい場合に等しいとみなされます。
1つでも構成要素が非NULLかつ等しくない場合、2つの行は等しくないとみなされます。
それ以外の場合、その行の比較結果は不明(NULL)です。
行毎の結果すべてが不等もしくはNULLの場合、少なくとも1つのNULLがあると、NOT IN
の結果はNULLとなります。
ANY
/SOME
expression
operator
ANY (subquery
)expression
operator
SOME (subquery
)
右辺は括弧で括られた副問い合わせで、正確に1つの列を返さなければなりません。
左辺の式は副問い合わせの結果行それぞれに対して、指定されたoperator
を使用して評価、比較されます。なお、operator
は結果として論理値を生成する必要があります。
真の結果が1つでもあると、ANY
の結果は「true(真)」です。
真の結果がない(副問い合わせが行を返さない場合を含む)と、結果は「false(偽)」です。
SOME
はANY
の同義語です。
IN
は= ANY
と等価です。
成功がなく、右辺の行が演算子の結果として1つでもNULLを生成した場合、ANY
構文の結果は偽ではなくNULLになることに注意してください。
これは、NULL値の論理的な組み合わせに対するSQLの標準規則に従うものです。
EXISTS
と同様、副問い合わせが完全に評価されると前提してはなりません。
row_constructor
operator
ANY (subquery
)row_constructor
operator
SOME (subquery
)
ANY
のこの形式の左辺は、4.2.13で説明されている行コンストラクタです。
右辺は括弧で括られた副問い合わせで、左辺の行にある式の数と正確に同じ数の列を返さなければなりません。
左辺の式は副問い合わせの結果のそれぞれの行に対し、与えられたoperator
を使用して行に関する評価、比較が行われます。
比較の結果、副問い合わせの行のどれかに対して真となる場合、ANY
の結果は「true(真)」です。
比較の結果、副問い合わせの全ての行に対して偽となる場合(副問い合わせが行を返さないという場合も含む)、結果は「false(偽)」です。
いかなる副問合せ行との比較の結果も偽を返さず、かつ、少なくとも1つの比較がNULLを返す場合、結果はNULLになります。
行コンストラクタ比較の意味についての詳細は9.23.5を参照して下さい。
ALL
expression
operator
ALL (subquery
)
右辺は括弧で括られた副問い合わせで、正確に1つの列を返さなければなりません。
左辺の式は副問い合わせの結果行それぞれに対して、指定されたoperator
を使用して評価、比較されます。なお、operator
は結果として論理値を生成する必要があります。
全ての行が真になる場合(副問い合わせが行を返さない場合を含む)、ALL
の結果は「true(真)」です。
1つでも偽の結果があると、結果は「false(偽)」です。
比較がどの行でも偽を返さず、かつ、少なくとも1つの行でNULLを返した場合、結果はNULLとなります。
NOT IN
は<> ALL
と等価です。
EXISTS
と同様、副問い合わせが完全に評価されることを前提としてはなりません。
row_constructor
operator
ALL (subquery
)
ALL
のこの形式の左辺は、4.2.13で説明する行コンストラクタです。
右辺は括弧で括られた副問い合わせで、左辺の行にある式の数と正確に同じ数の列を返さなければなりません。
左辺の式は副問い合わせの結果のそれぞれの行に対し、与えられたoperator
を使用して行に関する評価、比較が行われます。
比較した結果、すべての副問い合わせ行に対して真を返す場合(副問い合わせが行を返さないという場合も含む)、ALL
の結果は「true(真)」となります。
比較した結果、いずれかの副問い合わせ行で偽を返す場合、この結果は「false(偽)」となります。
比較結果がすべての副問い合わせ行に対して偽を返さず、少なくとも1行でNULLを返す場合、結果はNULLとなります。
行コンストラクタに関する比較の意味については9.23.5を参照してください。