一尘不染

为什么在对带有条件的行进行计数时,为什么在MySQL中需要“ OR NULL”

mysql

有关MySQL的COUNT()聚合函数的问题一直不时出现。我想对为什么它按原样工作有一些解释。

当我开始使用MySQL时,我很快了解到,如果条件最后还包含OR
NULL,则它的COUNT(condition)似乎只能正常工作。在更复杂的COUNT条件的情况下,找出确切的位置是一个经验过程。在MSSQL中,不需要此OR
NULL即可获得正确的结果,因此我想了解其解释。所以,这是一个例子。

让我们有一个非常基本的表,其中包含以下结构和数据:

CREATE TABLE test (
  `value` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO test (value) VALUES(1);
INSERT INTO test (value) VALUES(4);
INSERT INTO test (value) VALUES(5);
INSERT INTO test (value) VALUES(6);
INSERT INTO test (value) VALUES(4);
INSERT INTO test (value) VALUES(4);
INSERT INTO test (value) VALUES(5);
INSERT INTO test (value) VALUES(2);
INSERT INTO test (value) VALUES(8);
INSERT INTO test (value) VALUES(1);

场景:我想计算值=
4时我有多少行。一个明显的解决方案是使用WHERE过滤并执行COUNT(*),但我对基于COUNT(condition)的解决方案感兴趣。

因此,我想到的解决方案是:

SELECT COUNT(value=4) 
  FROM test

结果是10。这显然是错误的。

使用OR NULL的第二次尝试:

SELECT COUNT(value=4 OR NULL) 
  FROM test

结果为3。这是正确的。

有人可以解释其背后的逻辑吗?这是MySQL中的某个错误,还是逻辑上的解释,为什么我需要在COUNT条件的末尾添加看起来很奇怪的OR
NULL才能获得正确的结果?


阅读 288

收藏
2020-05-17

共1个答案

一尘不染

这应该揭示所有

SELECT 4=4, 3=4, 1 or null, 0 or null

输出量

1   |   0   |   1   |   NULL

事实

  1. COUNT加起来计算结果为NOT NULL的列/表达式。只要不为空,任何东西都将增加1。例外是COUNT(DISTINCT),仅当尚未计数时才递增。

  2. 单独使用BOOLEAN表达式时,它将返回1或0。

  3. 当布尔值OR-ed为NULL时,仅当它为0时才为NULL(假)

给别人

是的,如果该计数是所需的“唯一”列,则可以使用,WHERE value=4但如果该查询希望对4进行计数
检索其他计数/聚合,则该过滤器将不起作用。另一种本来SUM(value=4),如

SELECT sum(value=4)
  FROM test
2020-05-17