MySQL の EXISTS / NOT EXISTS

ここでは MySQL の EXISTS と NOT EXISTS についてご説明します。

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

MySQL の EXISTS の使い方

MySQL の EXISTS はサブクエリーと一緒に使って、そのサブクエリーがひとつでも行を返したら 1 (True)、返さなければ 0 (False) を返します。

SELECT 	*
FROM 	テーブル名
WHERE 	EXISTS
        (サブクエリー);

EXISTS の名前の通り、データの存在チェックに使えます。

サブクエリーに行が存在するかがポイントなので、サブクエリーの SELECT 文の SELECT 句には SELECT 1 や SELECT カラム名 としても無視されて同じ結果になりますが、通常は SELECT * が使われます。


それでは、EXISTS を使ってデータを取得してみましょう。

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

MySQL の EXISTS / NOT EXISTS 1

MySQL の EXISTS / NOT EXISTS 2

student_id が students テーブルの主キーカラムで、exam_results の外部キーカラムです。


exam_results テーブルにレコードが存在する students テーブルのレコードを取得するには、次のようにできます。

SELECT 	*
FROM 	students AS s
WHERE 	EXISTS
		(SELECT *
         FROM 	exam_results AS er
         WHERE 	er.student_id = s.student_id);

[実行結果]

MySQL の EXISTS / NOT EXISTS 3

exam_results テーブルには student_id 1 ~ 5 が存在しているので、student_id が 1 ~ 5 の学生のレコードが取得できています。


MySQL の NOT EXISTS の使い方

MySQL の NOT EXISTS もサブクエリーと一緒に使って、EXISTS の反対で、そのサブクエリーがひとつでも行を返したら 0 (False)、返さなければ 1 (True) を返します。

SELECT 	*
FROM 	テーブル名
WHERE 	NOT EXISTS
        (サブクエリー);

サブクエリーにデータが存在していないことを確認するのに使えます。


NOT EXISTS と同じようなことが NOT IN をつかってもできます。

ですが、NOT IN の場合は「NOT IN を使う時は NULL に注意!」でご説明したように、NULL に気をつけないといけません。


NOT IN ではひと工夫が必要だった、exam_results テーブルに student_id が存在しない students テーブルのデータを、NOT EXISTS を使って取得してみます。

SELECT 	*
FROM 	students AS s
WHERE 	NOT EXISTS
		(SELECT *
         FROM 	exam_results AS er
         WHERE 	er.student_id = s.student_id);

[実行結果]

MySQL の EXISTS / NOT EXISTS 4

exam_results テーブルに存在していない student_id = 6 の学生のレコードが取得できています。


以上、MySQL の EXISTS と NOT EXISTS についてご説明しました。

© 2024 MySQL 入門