有关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才能获得正确的结果?
这应该揭示所有
SELECT 4=4, 3=4, 1 or null, 0 or null
输出量
1 | 0 | 1 | NULL
事实
COUNT加起来计算结果为NOT NULL的列/表达式。只要不为空,任何东西都将增加1。例外是COUNT(DISTINCT),仅当尚未计数时才递增。
单独使用BOOLEAN表达式时,它将返回1或0。
当布尔值OR-ed为NULL时,仅当它为0时才为NULL(假)
OR
给别人
是的,如果该计数是所需的“唯一”列,则可以使用,WHERE value=4但如果该查询希望对4进行计数 并 检索其他计数/聚合,则该过滤器将不起作用。另一种本来SUM(value=4),如
WHERE value=4
SUM(value=4)
SELECT sum(value=4) FROM test