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 テーブルがあります。
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);
[実行結果]
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);
[実行結果]
exam_results テーブルに存在していない student_id = 6 の学生のレコードが取得できています。
以上、MySQL の EXISTS と NOT EXISTS についてご説明しました。