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

MySQLのEXISTS演算子:サブクエリがNULLを返す場合はどう評価される?

EXISTS演算子とNULLを返すサブクエリの挙動

MySQLでは、EXISTS演算子と組み合わせて使用するサブクエリがNULLを返した場合でも、「EXISTS NULL」という式はTRUEと評価されます。これは、EXISTSがサブクエリの戻り値そのものではなく、「サブクエリが1行以上の行を返すかどうか」だけを判定する演算子だからです。そのため、結果セットは外側のクエリ(メインクエリ)の条件に基づいて返されます。

検証に使用するサンプルデータ

以下のテーブル「Customers」のデータを使って、実際の挙動を確認してみましょう。

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

NULLを返すサブクエリを指定した実行例

次のクエリでは、EXISTS演算子の中で「Select NULL」、つまり必ずNULLを返すサブクエリを指定しています。一見すると条件が成立しないように思えますが、実際には全行が返されます。

mysql> SELECT Name from Customers Where EXISTS(Select NULL);
+----------+
| Name     |
+----------+
| Rahul    |
| Yashpal  |
| Gaurav   |
| Virender |
+----------+
4 rows in set (0.00 sec)

なぜ全行が返されるのか?

この結果からわかるのは、以下の仕組みです。

  • サブクエリ「Select NULL」は、たとえ値がNULLであっても1行の結果を返す
  • EXISTSは戻り値の内容ではなく行の存在のみを評価するため、「EXISTS NULL」はTRUEとなる。
  • WHERE句の条件がTRUEになるため、外側のクエリである「SELECT Name from Customers」がそのまま実行され、テーブル内の全行が結果として返される。

つまり、EXISTS演算子においてNULLは「行が存在しない」ことを意味しません。サブクエリが1行でも結果を返せば、その値がNULLであってもEXISTSはTRUEと評価される点を押さえておきましょう。

  1. MySQLでWITH ROLLUPを正しく使う方法!GROUP BYと組み合わせた集計テクニックを解説

    WITH ROLLUPとは?MySQLのWITH ROLLUPは、GROUP BY句と組み合わせて使用することで、グループごとの集計結果に加えて、全体の合計(総計)行を自動的に追加してくれる便利な機能です。レポート作成やデータ分析の際に、別途合計用のクエリを実行する必要がなくなるため、非常に効率的です。基本構文WITH ROLLUPを使用する際の基本的な構文は以下の通りです。select yourColumnName1,sum(yourColumnName2) from yourTableNamegroup by yourColumnName1 with rollup;サンプルテーブルの作成ま

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

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