HOWTO · MySQL
EXISTS と IF() で MySQL に行が存在するかを確認する
MySQL で EXISTS を使って行が条件に一致するかを確認し、IF() を使って読みやすい結果を返します。
このページの内容
MySQL に行が存在するかを確認するには、サブクエリとともに EXISTS 述語を使用します。これは、サブクエリが少なくとも 1 行を返すときに真になります。これを MySQL の IF() 関数の中に入れると、Yes, exists や No, does not exist のような値を選択できます。このガイドでは EXISTS 述語と IF() 関数を扱います。DDL 文の IF EXISTS は別の構文です。
MySQL の例では、小さな student_details テーブルを使用します。クエリを試す前に、MySQL セッションでこれらのセットアップ文を実行してください。
CREATE TABLE student_details (stu_id INT PRIMARY KEY, stu_firstName VARCHAR(255), stu_lastName VARCHAR(255));
INSERT INTO student_details (stu_id, stu_firstName, stu_lastName) VALUES (1, 'Preet', 'Sanghavi'), (2, 'Rich', 'John'), (3, 'Veron', 'Brow'), (4, 'Geo', 'Jos'), (5, 'Hash', 'Shah'), (6, 'Sachin', 'Parker'), (7, 'David', 'Miller');
この自己完結型の Python の例では、SQLite の組み込みライブラリを使用して ID 4 を確認します。観測された出力は以下に示します。このガイドの MySQL クエリは MySQL で実行してください。
import sqlite3
connection = sqlite3.connect(":memory:")
connection.execute("CREATE TABLE student_details (stu_id INTEGER PRIMARY KEY)")
connection.executemany(
"INSERT INTO student_details (stu_id) VALUES (?)",
[(1,), (2,), (3,), (4,)],
)
result = connection.execute(
"SELECT EXISTS (SELECT 1 FROM student_details WHERE stu_id = ?)", (4,)
).fetchone()[0]
print(result)
connection.close()
1
MySQL における EXISTS 演算子の基本的な使い方
EXISTS は、そのサブクエリが行を返すかどうかをテストします。サブクエリ内で選択された値が結果になるわけではありません。SELECT 1 によってその目的が明確になります。MySQL で ID 4 を確認するには、次のようにします。
SELECT EXISTS (SELECT 1 FROM student_details WHERE stu_id = 4) AS RESULT;
サンプルテーブルには stu_id = 4 が含まれているため、結果は 1 です。条件を stu_id = 11 に変更すると、0 が返されます。これらの想定される MySQL の結果はセットアップデータに基づくものです。上記の Python の例は、MySQL ではなく SQLite で述語を実演しています。
この条件は、名の値に関係なく stu_id を確認します。存在テストが操作に適している場合、同じ述語をより大きな SELECT、UPDATE、DELETE、または INSERT 文の中で使用できます。はい・いいえで答えるクエリ結果については、SELECT EXISTS (...) が MySQL の数値の真または偽の値を返します。
SELECT EXISTS (...) は 1 または 0 を含む 1 行を返します。これは、アプリケーションが単一のはい・いいえの値を必要とする場合に便利です。関連する一致がある別のテーブルの行だけを返すには、外側のクエリの WHERE 句に EXISTS を置きます。たとえば、SELECT c.customer_id FROM customers AS c WHERE EXISTS (SELECT 1 FROM orders AS o WHERE o.customer_id = c.customer_id); は、一致する注文が少なくとも 1 つある顧客を返します。c.customer_id への参照により、サブクエリは候補となる各顧客行と相関します。テーブル名とキー名はご自身のスキーマのものを使用してください。
MySQL で EXISTS とともに IF() を使用する
MySQL の IF(condition, value_if_true, value_if_false) は、2 つの値のうち一方を選択します。その条件として EXISTS を使用すると、ID 4 について読みやすい結果を返せます。IF() は、クエリがラベルやその他の値を直接返すべき場合に便利です。その結果がフィルタ条件に使用されない限り、選択される行は変わりません。2 つの結果引数には、文字列、数値、その他の互換性のある式を使用できます。
SELECT IF(EXISTS (SELECT 1 FROM student_details WHERE stu_id = 4), 'Yes, exists', 'No, does not exist') AS RESULT;
ID 4 のサンプル行がある場合、RESULT は Yes, exists です。11 のような存在しない ID については、条件を stu_id = 11 に変更します。RESULT は No, does not exist です。これらの想定値はサンプル行と MySQL の式のセマンティクスに基づくものです。SQLite の実演では MySQL の IF() 関数は実行されません。
RESULT は、返される値にラベルを付ける列エイリアスです。サブクエリの WHERE 条件を変更して別の ID や基準を確認し、ご自身のテーブルに合った列名を使用してください。より大きなクエリについては、そのプランを確認し、ご自身のデータとインデックスで測定してください。コストはクエリとスキーマに依存するため、EXISTS が常に遅いとか、外側の行ごとに固定された方法で再実行しなければならないといった一般的な規則はありません。