結論
これを理解するためには、count
がどのような振る舞いをするのかを理解する必要があります。
count
は、取得した行に含まれる expr の非NULL値の数を返します。ちなみに、expr
は整数や文字列などの数式を評価するコマンドのことを指していて、評価が真の場合は1
が、偽の場合は0
が出力されます。
つまり、下記のようにcount
を使った場合は、name
カラムがyamato
ではない場合expr
によって0
が出力されます。
count(name = 'yamato')
0
という値はnull
ではないので、name
に値が入っているものは全てカウントされてしまうということですね🤮
そこで登場するのが or null
です。
SQLのor
は、null
オペランドが含まれている場合、真
以外の値はnull
になるという性質があります。
mysql> SELECT 1 || 1; -> 1 mysql> SELECT 1 || 0; -> 1 mysql> SELECT 0 || 0; -> 0 mysql> SELECT 0 || NULL; -> NULL mysql> SELECT 1 || NULL; -> 1
参照: https://dev.mysql.com/doc/refman/5.6/ja/logical-operators.html#operator_or
ですので、name = 'yamato'
で当てはまらない値は全てnull
になります。count
は、取得した行に含まれる expr の非NULL値の数を返すので、これで正しい結果が取得できるという仕組みですね✍️
count(name = 'yamato' or null)
てな感じで本日も以上となります🍺
参考
- https://qiita.com/shinkuFencer/items/eef08353b43f3512da7d
- https://dev.mysql.com/doc/refman/5.6/ja/logical-operators.html#operator_or
- https://dev.mysql.com/doc/refman/5.6/ja/group-by-functions.html#function_count