サブクエリをWhere句で使用する際に使える述語があります。
EXISTS述語
述語とは結果が真理値になる関数のことです。
EXISTS述語はサブクエリのデータ区切り範囲毎に条件判定を行い、真理値を返します。
EXISTS述語の構文は以下のとおりです。
select 列名 from テーブル名 as A where exists (select 1 from テーブル名 as B where 条件式)
EXISTS以外の述語はだいたい述語の左辺と右辺を比較して真理値を返します。
例えばIN述語は「列名 IN 条件」と列名の値と条件の値を比較します。
ところがEXISTS述語は右辺のサブクエリのみが真理値の対象になります。
EXISTS述語は右辺のサブクエリのWHERE句の結果(真理値)のみで真理値判定を行います。
EXISTS述語においてはサブクエリからは真理値以外の値は返ってきません。
そのためサブクエリのSELECT文は何を記載しても影響ありません。
(何でも良いので今回は「1」を指定しました)
EXISTS述語使用例
例としてはとても簡単なものです。
点数が60点以上の行を抽出しています。
ここで気をつけたいのはサブクエリ内のWhere句です。
ここは「B.点数 >= 60」と書きたくなるところですが、
そうすると元データが全て表示されてしまいます。
(※以下多分に予想を含む)
「B.点数」としてしまうと点数一行毎のデータ区切りが発生せず、「点数」という列全体で真理値判定を行うようになります。
EXISTS述語は判定対象に1つでもTRUEがあるとTRUEを返す性質があります。
結果、SQL文が以下のようになり元データを全て返してしまいます。
そこで条件を「A.点数 >= 60」とすることで相関サブクエリを発生させ、データに区切りを入れます。
そうするとEXISTSの真偽値判定が行ごとになるため、60点以上の点数を正しく算出できるようになります。
(※以上多分に予想を含む)