無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

9.22. 副問い合わせ式

本節では PostgreSQL で使用できる SQL 準拠の副問い合わせについて説明します。本節で記載した全ての式は結果として論理値(真/偽)を返します。

9.22.1. 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);

9.22.2. 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となります。

9.22.3. 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となります。

9.22.4. 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 を参照して下さい。

9.22.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 を参照してください。

9.22.6. 行に関する比較



row_constructor

 

operator

 (

subquery

)

左辺は、 項4.2.13 で説明されている行コンストラクタです。右辺は括弧で括られた副問い合わせで、左辺の行とまったく同じ数の列を返さなければなりません。さらに、副問い合わせは複数行を返すことはできません(行をまったく返さない場合、結果はNULLとみなされます)。左辺は副問い合わせの結果の単一行に対し行全体で評価、比較が行われます。

行に関する比較の意味についての詳細は 項9.23.5 を参照してください。


powered by SEO.CUG.NET