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と評価される点を押さえておきましょう。
-
MySQLでWITH ROLLUPを正しく使う方法!GROUP BYと組み合わせた集計テクニックを解説
WITH ROLLUPとは?MySQLのWITH ROLLUPは、GROUP BY句と組み合わせて使用することで、グループごとの集計結果に加えて、全体の合計(総計)行を自動的に追加してくれる便利な機能です。レポート作成やデータ分析の際に、別途合計用のクエリを実行する必要がなくなるため、非常に効率的です。基本構文WITH ROLLUPを使用する際の基本的な構文は以下の通りです。select yourColumnName1,sum(yourColumnName2) from yourTableNamegroup by yourColumnName1 with rollup;サンプルテーブルの作成ま
-
MySQLでCURDATE()とLIKE句を使った部分一致検索の方法
MySQLにはCONTAINS()という名前の関数は存在しません。そのため、現在の日付(CURDATE())に関連する文字列で部分一致検索を行いたい場合は、CONCAT()関数とLIKE句を組み合わせる方法が有効です。本記事では、実際にサンプルテーブルを作成しながら、その手順を順番に解説していきます。現在の日付を確認するまず、CURDATE()関数を使って現在の日付を取得してみましょう。mysql> select curdate();実行結果は以下の通りです。+------------+ | curdate() | +------------+ | 2019-11-28 | +----