副問い合わせ式

PostgreSQL 8.0.0 文書
前のページ | 巻戻し | 第 9章関数と演算子 | 早送り | 次のページ

# 9.16. 副問い合わせ式

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

## 9.16.1. `EXISTS`

    EXISTS ( subquery )

`EXISTS`の引数は、任意の`SELECT`文または副問い合わせです。 副問い合わせはそれが何らかの行を返すか否かの決定のために評価されます。 もし一つでも行を返すのであれば、`EXISTS`の結果は"真"となり、副問い合わせが行を返さない場合、`EXISTS`の結果は"偽"となります。

副問い合わせは、その回りの問い合わせ内の変数を参照することができます。 その値は副問い合わせの評価時には定数として扱われます。

この副問い合わせは通常、最後まで実行されず、少なくとも一つの行が返されたかどうかを判定し得るに足りる時点まで実行されます。 実際に副作用がなされるか否かを予想するのは難しいので、(シーケンス関数を呼び出すような)何らかの副作用を持つ副問い合わせを記述することはお勧めしません。

結果は何らかの行が返されるのかのみに依存し、それらの行の内容には依存しないことから、副問い合わせの出力リストは通常興味のあるものではありません。 良く使われるコーディング規約は、全ての`EXISTS`テストを`EXISTS(SELECT 1 WHERE ...)`といった形式で記述することです。 とは言っても、`INTERSECT`を使う副問い合わせのようにこの規則には例外があります。

以下の平易な例は`col2`上の内部結合のようですが、たとえ`tab2`の行と複数一致したとしても`tab1`のそれぞれの行に対して多くても一つの出力行を生成します。

    SELECT col1 FROM tab1
        WHERE EXISTS(SELECT 1 FROM tab2 WHERE col2 = tab1.col2);

## 9.16.2. `IN`

    expression IN (subquery)

右辺は括弧で括られた副問い合わせで、正確に1列を返すものでなければなりません。 左辺式は評価され、副問い合わせの結果行と比較されます。 副問い合わせの行のどれかと等しい場合、`IN`の結果は"真"です。 (副問い合わせが行を返さない特別の場合を含め)等しい行が見つからない場合、結果は"偽"です。

左辺の式がNULLを生じる場合、または右辺の値に等しいものが無くて少なくとも一つの右辺の行がNULLを持つ場合、`IN`構文の結果は偽では無くNULLとなります。 これは、NULL値の論理的な組合せに対するSQLの通常の規則に従うものです。

`EXISTS`と同様、副問い合わせが完全に評価されると前提してはなりません。

    row_constructor IN (subquery)

`IN`のこの形式の左辺は、項4.2.11で説明する、行のコンストラクタです。 右辺は括弧で括られた副問い合わせで、左辺の行にある式の数と正確に同じ数の列を返さなければなりません。 左辺の式は副問い合わせの結果のそれぞれの行に対し、行に関して評価、比較が行なわれます。 副問い合わせの行に等しいものが見つかった場合、`IN` の結果は"真"となります。 (副問い合わせが行を返さない特別の場合を含め)等しい行が見つからない場合、結果は"偽"です。

いつもの通り、行にあるNULL値は、SQLの論理式の通常規則で結合されます。 二つの行は対応する全ての構成要素が非NULLかつ等しい場合に等しいと見做されます。 1つでも対応する構成要素が非NULLかつ等しくないものがあれば、2つの行は等しくないと見做されます。 それ以外その行の比較結果は不明(NULL)です。 全ての行の結果が不等もしくはNULLの場合、少なくとも一つのNULLがあると、`IN` の結果はNULLとなります。

## 9.16.3. `NOT IN`

    expression NOT IN (subquery)

右辺は括弧で括られた副問い合わせで、正確に1つの列を返さなければなりません。 左辺の式は副問い合わせ結果の行それぞれに対して評価、比較されます。 (副問い合わせが行を返さない特別な場合を含む)等しくない副問い合わせの行だけがあると、`NOT IN`の結果は"真"です。 等しい行が1つでもあれば、結果は"偽"です。

左辺の式でNULLが生じる場合、または右辺の値に等しいものがなく、少なくとも一つの右辺の式がNULLを産みだす場合、`NOT IN`構文の結果は真では無くNULLとなることに注意してください。 これは、NULL値の論理的な組合せに対するSQLの通常の規則に従うものです。

`EXISTS`と同様、副問い合わせが完全に評価されると前提してはなりません。

    row_constructor NOT IN (subquery)

`NOT IN`のこの形式の左辺は、項4.2.11で説明する行コンストラクタです。 右辺は括弧で括られた副問い合わせで、左辺の行にある式の数と正確に同じ数の列を返さなければなりません。 左辺の式は副問い合わせの結果のそれぞれの行に対し、評価、比較が行なわれます。 (副問い合わせが行を返さない特別の場合を含め)副問い合わせの行に不等のもののみが見つかった場合、`NOT IN`の結果は"真"となります。 等しい行が1つでも見つかった場合、結果は"偽"です。

いつもの通り、行にあるNULL値は、SQLの論理式の通常規則で結合されます。 二つの行は対応する全ての構成要素が非NULLかつ等しい場合に等しいと見做されます。 一つでも構成要素が非NULLかつ等しくない場合、2つの行は等しくないと見做されます。 それ以外その行の比較結果は不明(NULL)です。 全ての行の結果が不等もしくはNULLの場合、少なくとも一つのNULLがあると、`NOT IN`の結果はNULLとなります。

## 9.16.4. `ANY`/`SOME`

    expression operator ANY (subquery)
    expression operator SOME (subquery)

右辺は括弧で括られた副問い合わせで、正確に1つの列を返さなければなりません。 左辺の式は副問い合わせの結果行それぞれに対して、指定された`operator`を使用して評価、比較されます。 なお、`operator`は結果として論理値を生成する必要があります。 真の結果が1つでもあると、`ANY`の結果は"真"です。 (副問い合わせが行を返さない特別な場合を含む)真の結果がないと、結果は"偽"です。

`SOME`は`ANY`の同義語です。 `IN`は`= ANY`と等価です。

成功したものがなく、右辺の行が演算子の結果として1つでもNULLを生成した場合、`ANY`構文の結果は偽ではなくNULLになります。 これは、NULL値の論理的な組合せに対するSQLの通常の規則に従うものです。

`EXISTS`と同様、副問い合わせが完全に評価されると前提してはなりません。

    row_constructor operator ANY (subquery)
    row_constructor operator SOME (subquery)

`ANY`のこの形式の左辺は、項4.2.11で説明する行コンストラクタです。 右辺は括弧で括られた副問い合わせで、左辺の行にある式の数と正確に同じ数の列を返さなければなりません。 左辺の式は副問い合わせの結果のそれぞれの行に対し、与えられた`operator`を使用して行に関する評価、比較が行なわれます。 現時点では、行に対する`ANY`構文では`=`と`<>`のみ認められています。 それぞれ等値もしくは非等の行が見つかれば`ANY`の結果は"真"となります。 (副問い合わせが行を返さない特別の場合を含め)そのような行が見つからない場合、結果は"偽"です。

いつもの通り、行にあるNULL値は、SQLの論理式の通常規則で結合されます。 二つの行は対応する全ての構成要素が非NULLかつ等しい場合に等しいと見做されます。 一つでも構成要素が非NULLかつ等しくない場合、2つの行は等しくないと見做されます。 それ以外その行の比較結果は不明(NULL)です。 1つでもNULLの行結果があると、`ANY`は偽にはなることはできず、真かNULLになります。

## 9.16.5. `ALL`

    expression operator ALL (subquery)

右辺は括弧で括られた副問い合わせで、正確に1つの列を返さなければなりません。 左辺の式は副問い合わせの結果行それぞれに対して、指定された`operator`を使用して評価、比較されます。 なお、`operator`は結果として論理値を生成する必要があります。 (副問い合わせが行を返さない特別な場合を含む)全ての行が真になる場合、`ALL`の結果は"真"です。 1つでも偽の結果があると、結果は"偽"です。

`NOT IN`は`<> ALL`と等価です。

失敗したものがなく、右辺の行が演算子の結果として1つでもNULLを生成した場合、`ALL`構文の結果は真ではなくNULLになることに注意してください。 これは、NULL値の論理的な組合せに対するSQLの通常の規則に従うものです。

`EXISTS`と同様、副問い合わせが完全に評価されると前提してはなりません。

    row_constructor operator ALL (subquery)

`ALL`のこの形式の左辺は、項4.2.11で説明する行コンストラクタです。 右辺は括弧で括られた副問い合わせで、左辺の行にある式の数と正確に同じ数の列を返さなければなりません。 左辺の式は副問い合わせの結果のそれぞれの行に対し、与えられた`operator`を使用して行に関する評価、比較が行なわれます。 現時点では、行に対する`ALL`問い合わせでは`=`と`<>`演算子のみ認められています。 (副問い合わせが行を返さない特別の場合を含め)それぞれ全ての副問い合わせの行が等値もしくは非等であれば`ALL`の結果は"真"となります。 それぞれ非等、もしくは等しい行が1つでもあれば、結果は"偽"です。

いつもの通り、行にあるNULL値は、SQLの論理式の通常規則で結合されます。 二つの行は対応する全ての構成要素が非NULLかつ等しい場合に等しいと見做されます。 一つでも構成要素が非NULLかつ等しくない場合、2つの行は等しくないと見做されます。 それ以外その行の比較結果は不明(NULL)です。 1つでもNULL行結果があると、`ALL`は真にはなることはできず、偽かNULLになります。

## 9.16.6. 行に関しての比較

    row_constructor operator (subquery)

左辺は、項4.2.11で説明する行コンストラクタです。 右辺は括弧で括られた副問い合わせで、左辺の行とまったく同じ数の列を返さなければなりません。 更に、副問い合わせは複数行を返すことはできません。 (行をまったく返さない場合、結果はNULLと見なされます。) 左辺は副問い合わせの結果の単一行に対し行全体で評価、比較が行なわれます。 現時点では、行に対する比較において`=`と`<>`のみ認められています。 それぞれ2つの行が等しいもしくは等しくない場合、結果は"真"となります。

いつもの通り、行にあるNULL値は、SQLの論理式の通常規則で結合されます。 二つの行は対応する全ての構成要素が非NULLかつ等しい場合に等しいと見做されます。 一つでも構成要素が非NULLかつ等しくない場合、2つの行は等しくないと見做されます。 それ以外その行の比較結果は不明(NULL)です。

前のページ | ホーム | 次のページ
集約関数 | 上に戻る | 行と配列の比較