MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLのEXISTS演算子:サブクエリが1行も返さない場合はどう評価される?

EXISTS演算子と空のサブクエリの評価方法

MySQLにおいて、EXISTS演算子と組み合わせて使用されるサブクエリが1行も結果を返さなかった場合、そのEXISTS式はFALSEと評価されます。その結果、MySQLは最終的な出力として空のセット(Empty set)を返します。

この動作は、以下のようなシンプルな例で確認できます。まず、サンプルデータとして「Customers」テーブルと「Reservations」テーブルの中身を見てみましょう。

サンプルデータの確認

mysql> Select * from Customers;
+-------------+----------+
| Customer_Id | Name     |
+-------------+----------+
|           1 | Rahul    |
|           2 | Yashpal  |
|           3 | Gaurav   |
|           4 | Virender |
+-------------+----------+
4 rows in set (0.00 sec)

mysql> Select * from Reservations;
+------+-------------+------------+
| ID   | Customer_id | Day        |
+------+-------------+------------+
|    1 |           1 | 2017-12-30 |
|    2 |           2 | 2017-12-28 |
|    3 |           2 | 2017-12-29 |
|    4 |           1 | 2017-12-25 |
|    5 |           3 | 2017-12-26 |
+------+-------------+------------+
5 rows in set (0.00 sec)

上記のデータを見ると、「Reservations」テーブルにはCustomer_idが1〜3の予約履歴しか存在せず、Customer_id = 4(Virender)の予約データはありません。

実行例:サブクエリが行を返さないケース

次のクエリでは、EXISTS演算子と共に使用したサブクエリが該当する行を1件も返しません。この場合、EXISTS式はFALSEと評価されるため、結果セットは空になります。

mysql> Select Name from Customers WHERE EXISTS (SELECT * FROM Reservations WHERE customer_id = 4);
Empty set (0.00 sec)

まとめ

EXISTS演算子は「サブクエリが少なくとも1行でも結果を返すかどうか」のみを判定するため、サブクエリの結果が0行であればFALSEとなり、メインクエリのWHERE句の条件を満たさなくなります。そのため、上記のように出力としては空のセットが返される点を押さえておきましょう。

  1. MySQLで行の一意性を保証する方法|UNIQUE制約の使い方を解説

    MySQLでテーブル内の行が重複しないようにするには、UNIQUE制約(一意制約)を使用します。UNIQUEインデックスを設定すると、指定したカラムの組み合わせが完全に一致する行の挿入が拒否され、データの整合性を保つことができます。サンプルテーブルの作成まず、動作確認用のテーブルを作成しましょう。mysql> create table DemoTable1580 -> ( -> id int, -> Name varchar(20), -> Age int -> );Query OK, 0 rows affected (0.73

  2. MySQLでCURDATE()とLIKE句を使った部分一致検索の方法

    MySQLにはCONTAINS()という名前の関数は存在しません。そのため、現在の日付(CURDATE())に関連する文字列で部分一致検索を行いたい場合は、CONCAT()関数とLIKE句を組み合わせる方法が有効です。本記事では、実際にサンプルテーブルを作成しながら、その手順を順番に解説していきます。現在の日付を確認するまず、CURDATE()関数を使って現在の日付を取得してみましょう。mysql> select curdate();実行結果は以下の通りです。+------------+ | curdate() | +------------+ | 2019-11-28 | +----