サブクエリー④(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実行の際に発生しやすいエラーについて説明したいと思います。
コメントを残す