サブクエリー④(EXISTS、ANY、ALL)



サブクエリー④(EXISTS、ANY、ALL)

EXISTS、ANY、ALLの3つのキーワードは、いずれもサブクエリーを引数に取り、その結果を調べてTRUE(真)、FALSE(偽)を返します。通常本体のクエリのWHERE句に指定し、サブクエリーの結果を評価するために使います。

1.EXISTS

EXISTSは、サブクエリの結果セットが存在するかどうかを調べます。サブクエリが何らかの結果を返せばTRUEとなり、なければFALSEとなります。
例を見てみましょう。

SELECT * FROM 受注 WHERE EXISTS
(SELECT * FROM 受注 WHERE 得意先名 = ‘レストランABC’);

結果は以下のとおりとなります。

これは、サブクエリの中で、’レストランABC’のレコードを抽出を試行しています。そして該当するレコードがあるので、EXISTSの結果としてはTRUEを返します。なのでその上の受注表のレコードが全件抽出されることになります。

SELECT * FROM 受注 WHERE EXISTS
(SELECT * FROM 受注 WHERE 得意先名 = ‘レストランABCD’);

結果は、0件で終了します。これは、’レストランABC’のレコードが存在しない為、上のSQLは実行されない為この結果になります。

2.ANY

ANYは、結果セットのいずれかの値が条件を満たすことにTRUEとなります。つまり、結果セットの中の値を対象とする条件を、OR条件で結んだものと考えることができます。例を見てみましょう。

SELECT * FROM 受注 WHERE 受注日 = ANY
(SELECT 受注日 FROM 受注 WHERE 得意先名 = ‘新宿レストラン’);

結果は以下のとおりとなります。

これは、まずサブクエリのSQLでの実行結果が10/1、10/4、10/8、10/12、の4件を返します。そしてその上のSQLはこの4つの日付をレコードを抽出させるSQLですので、10/12は’新宿レストラン’以外にも2件レコードが抽出されるので合計6レコード抽出されます。
このANYの機能は、IN述語の機能に似ています。IN述語を使ってこのクエリを記述すると以下のとおりとなります。

SELECT * FROM 受注 WHERE 受注日 IN
(SELECT 受注日 FROM 受注 WHERE 得意先名 = ‘新宿レストラン’);

結果はANYと使用した際の結果と同じになります。

3.ALL

ALLは、結果セットの中の全ての値が条件を満たすときにTRUEを返します。つまり、結果セットの中の値を対象とする条件を、AND条件で結んだものと考えることができます。例を見てみましょう。

結果は以下のとおりとなります。

これは、まず、サブクエリの結果は、10/2、10/5、10/10、の3件が返されます。本体のクエリでは、この値のどれよりも小さい日付のレコードを抽出する条件となっていますので、この3件の内一番小さい値の10/2より小さいレコードが抽出対象となりますので、結果としては10/1のレコードのみ対象となります。

サブクエリの説明は今回で以上となります。次回はSQL実行の際に発生しやすいエラーについて説明したいと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です