当前位置: 首页 > 面试题库 >

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

辛盛
2023-03-14
问题内容

有关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

事实

  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


 类似资料:
  • 问题内容: 我可以将数据发送到服务器,但是只有在使用FromBody-Attribute时才可以。 为什么无法使用Post从主体自动读取json数据? 后端Web API 前端angularjs 问题答案: 仅因为某事是POST请求,所以没有明确的规则如何传递参数。POST请求仍可以包含URL中编码的查询参数。方法参数应该是“简单”类型(字符串,整数等)的查询参数。 通常,复杂类型应该是POST表

  • 问题内容: 我正在尝试学习pthread_cond_wait的基础知识。在所有用法中,我都可以看到 要么 我的问题是,我们只想cond_wait因为条件为假。那我为什么要忍受明确地放置一个if / while循环的痛苦。我可以理解,在不进行任何if / while检查的情况下,我们将直接击中它,根本不会返回。条件检查是仅用于解决此目的,还是具有其他意义。如果它用于解决不必要的条件等待,则进行条件检

  • 问题内容: 这是我的代码: 如果删除,该表不会更新。但是对于select语句,我不需要那个。我很好奇为什么? 问题答案: 在DB- API 规范要求连接到数据库开始新的事务,默认情况下。您必须确认所做的任何更改,或放弃它们。 请注意,如果数据库支持自动提交功能,则必须首先将其关闭。 纯语句,因为它们从不对数据库进行任何更改,因此不必提交更改。

  • 问题内容: 说你有这个代码 我的问题是,为什么您需要在此处进行while循环。 pthread_cond_wait* 不会只等到信号线程发出 cam_video_cond 信号吗?好的,我知道您可能会遇到以下情况:调用 pthread_cond_wait 时 cam- > status不等于 WAIT_DISPAY ,但是在那种情况下,您可以通过 if 条件检查它,而不是使用 while 。 *

  • 有人能正确解释事件时间戳和水印吗。我从文件中理解了,但不太清楚。一个真实的例子或外行的定义会有所帮助。此外,如果可能,请给出一个示例(以及一些可以解释它的代码片段)。提前感谢

  • 问题内容: 在下面的代码中,为什么我需要导入但可以不导入就可以使用? 问题答案: 为了方便起见,Java编译器会为每个源文件自动导入两个完整的软件包: java.lang包和 当前包(当前文件的包)。 请参考 oracle.com了解更多信息(http://docs.oracle.com/javase/tutorial/java/package/usepkgs.html)