MySQL の ANY・SOME・ALL

ここでは MySQL の ANY・SOME・ALL 演算子についてご説明します。

サンプルデータベースのテーブルを使いますので、実際にスクリプトを実行してみたい方は、こちら のスクリプトを実行して school_db データベースを作成しておいてください。

MySQL の ANY と SOME 演算子

MySQL の ANY 演算子は、比較演算子とサブクエリーと共に次のような構文で使用し、[A] とサブクエリーの結果を指定した比較演算子で評価して、どれかひとつでも True になる時に True になります。

[A] 比較演算子 ANY (サブクエリー)

ANY と共に指定できる比較演算子は =、>、>=、<、<=、<>、!= のどれかひとつです。

サブクエリーはカラム [A] と比較できる、ひとつのカラムを返すクエリーでなくてはなりません。

SOME は ANY のエイリアスなので、全く同じ方法で使えます。


それでは ANY 演算子を使ってみましょう。

次のような、students テーブルと exam_results テーブルがあります。

MySQL の ANY・SOME・ALL 1

MySQL の ANY・SOME・ALL 2


例えば、ANY 演算子を使って exam_results の score が 90 点以上をとったことがある students の情報を取得するには、次のようにできます。

SELECT 	*
FROM 	students
WHERE 	student_id = ANY
	  (SELECT 	student_id
	   FROM 	exam_results
	   WHERE 	score >= 90);

[実行結果]

MySQL の ANY・SOME・ALL 3

90 点以上をとったことがある student_id が 3 と 4 の学生の情報が取得できていますね。

お気づきかもしれませんが、IN 演算子を使っても同様の結果がえられます。

IN 演算子は = ANY のエイリアスなのです。


MySQL の ALL 演算子

MySQL の ALL 演算子は、比較演算子とサブクエリーと共に次のような構文で使用し、[A] とサブクエリーの結果を指定した比較演算子で評価して、全てが True になる時だけ True を返します。

[A] 比較演算子 ALL (サブクエリー)

ANY と同様に、ALL と共に指定できる比較演算子は =、>、>=、<、<=、<>、!= のどれかひとつです。

サブクエリーも、カラム [A] と比較できる、ひとつのカラムを返すクエリーでなくてはなりません。


サブクエリーが返す値に NULL がひとつでもあると、評価の結果が Unknown になり、全ての評価結果が True になることはないので、結果セットにレコードが返らなくなります。

ALL 演算子を使う場合は、サブクエリーの NULL にご注意ください。


それでは ALL 演算子を使ってみましょう。

例えば、ALL 演算子を使って exam_results に存在しない student_id を持つ students の情報を取得するには、次のようにできます。

SELECT 	*
FROM 	students
WHERE 	student_id <> ALL
	  (SELECT 	student_id
	   FROM 	exam_results
       WHERE 	student_id IS NOT NULL);

[実行結果]

MySQL の ANY・SOME・ALL 4

exam_results に存在しない student_id = 6 を持つ students の情報が取得できました。

exam_results テーブルには student_id が NULL のレコードが存在するので、WHERE student_id IS NOT NULL がないと、結果セットのレコード数は 0 になります。

NOT IN は <> ALL のエイリアスなので、代わりに NOT IN を使っても同様の結果が得られます。


以上、MySQL の ANY・SOME・ALL 演算子についてご説明しました。

© 2024 MySQL 入門