MySql ifnull和count bug?

MySql ifnull和count bug?,mysql,ifnull,Mysql,Ifnull,MySql版本:5.7.18-15-log 我的同学问了一个问题: SELECT COUNT(1) Counts, IFNULL((SELECT SUM(c.RealMoney) FROM PayRecord c WHERE a.id=c.orderid), 0) money FROM `Order` a WHERE a.UserId ='not exists user id'; 返回 计数:1货币:8622 返回 计数:0货币:8622 似乎第一个sql将被缓存, 第二个sql将使

MySql版本:5.7.18-15-log

我的同学问了一个问题:

SELECT COUNT(1) Counts, IFNULL((SELECT SUM(c.RealMoney) FROM PayRecord c WHERE a.id=c.orderid), 0) money FROM `Order` a WHERE a.UserId ='not exists user id'; 返回

计数:1货币:8622

返回

计数:0货币:8622

似乎第一个sql将被缓存, 第二个sql将使用此缓存

类似DDL的:

CREATE TABLE `Order` ( `Id` char(36) NOT NULL , `UserId` char(36) NOT NULL , ......, PRIMARY KEY (`Id`,`CreateTime`), KEY `idx_RestId` (`RestId`), KEY `idx_CreateTime` (`CreateTime`), KEY `idx_UserId` (`UserId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 /*!50500 PARTITION BY RANGE COLUMNS(CreateTime) ( PARTITION p201712 VALUES LESS THAN ('2018-01-01') ENGINE = InnoDB, PARTITION p201801 VALUES LESS THAN ('2018-02-01') ENGINE = InnoDB) */ CREATE TABLE `PayRecord` ( `Id` char(36) NOT NULL , `OrderId` char(36) NOT NULL , `RealMoney` int(11) NOT NULL , ....... PRIMARY KEY (`Id`,`CreateTime`), KEY `idx_OrderId` (`OrderId`), KEY `idx_PayId` (`PayId`), KEY `idx_CreateTime` (`CreateTime`), KEY `idx_BrandId_RestId` (`BrandId`,`RestId`), KEY `idx_RestId` (`RestId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 /*!50500 PARTITION BY RANGE COLUMNS(CreateTime) ( PARTITION p201712 VALUES LESS THAN ('2018-01-01') ENGINE = InnoDB, PARTITION p201801 VALUES LESS THAN ('2018-02-01') ENGINE = InnoDB) */ 我的问题是: 为什么Count不返回任何记录,
但是IFNULL有值吗?

为什么你会看到你观察到的东西,逻辑是COUNT是一个聚合函数。如果不使用GROUP BY,它将返回整个表的计数。同样重要的是,它将始终返回一条记录,即使实际表中没有记录。在select子句中使用COUNT还意味着只能显示其他聚合函数或标量常量。您看到一笔钱的原因是它来自生成单个标量值的子查询


虽然这可能很难区分,但它肯定不是MySQL中的一个bug。

为什么您会看到您所观察到的逻辑是COUNT是一个聚合函数。如果不使用GROUP BY,它将返回整个表的计数。同样重要的是,它将始终返回一条记录,即使实际表中没有记录。在select子句中使用COUNT还意味着只能显示其他聚合函数或标量常量。您看到一笔钱的原因是它来自生成单个标量值的子查询



虽然这可能很难区分,但它肯定不是MySQL中的错误。

那么你的问题是什么?不,它不是错误。Count返回No record,为什么ifnull返回值?表中有null值吗?另外,请向我们提供示例数据。那么您的问题是什么?不,这不是一个bug。Count返回无记录,为什么ifnull返回值?表中是否有null值?另外,请提供示例数据。我告诉我的同伴使用标准SQL,但我仍然不明白为什么mysql支持:从tb GROUP BY field1中选择field1、field2、sumnum GROUP BY没有field2您编写的查询可能无效,如果field1不是主键列。不,不,此SQL有效,可以在mysql中执行,但在MSSQL中无效。谢谢你的回答,我的问题被修改了,COUNT+SUM,问题仍然存在exists@youbl不,它不是有效的SQL,尽管它可能在MySQL的某些配置上执行,但结果将是不确定的。我已经回答了你的问题,请不要改变,否则可能会导致选票下降。是的,结果将是不确定的。非常感谢。我告诉我的同伴使用标准SQL,但我仍然不明白为什么mysql支持:按字段选择tb GROUP BY field1、field2、sumnum GROUP BY没有字段2您编写的查询可能无效,如果field1不是主键列。不不,不,此SQL有效,可以在mysql中执行,但在MSSQL中无效。谢谢你的回答,我的问题被修改了,COUNT+SUM,问题仍然存在exists@youbl不,它不是有效的SQL,尽管它可能在MySQL的某些配置上执行,但结果将是不确定的。我已经回答了你的问题,请不要改变,否则可能会导致选票下降。是的,结果将是不确定的。谢谢。 SELECT COUNT(1) Counts, IFNULL((SELECT SUM(c.RealMoney) FROM PayRecord c WHERE a.id=c.orderid), 0) money FROM `Order` a WHERE a.UserId ='not exists user id'; CREATE TABLE `Order` ( `Id` char(36) NOT NULL , `UserId` char(36) NOT NULL , ......, PRIMARY KEY (`Id`,`CreateTime`), KEY `idx_RestId` (`RestId`), KEY `idx_CreateTime` (`CreateTime`), KEY `idx_UserId` (`UserId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 /*!50500 PARTITION BY RANGE COLUMNS(CreateTime) ( PARTITION p201712 VALUES LESS THAN ('2018-01-01') ENGINE = InnoDB, PARTITION p201801 VALUES LESS THAN ('2018-02-01') ENGINE = InnoDB) */ CREATE TABLE `PayRecord` ( `Id` char(36) NOT NULL , `OrderId` char(36) NOT NULL , `RealMoney` int(11) NOT NULL , ....... PRIMARY KEY (`Id`,`CreateTime`), KEY `idx_OrderId` (`OrderId`), KEY `idx_PayId` (`PayId`), KEY `idx_CreateTime` (`CreateTime`), KEY `idx_BrandId_RestId` (`BrandId`,`RestId`), KEY `idx_RestId` (`RestId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 /*!50500 PARTITION BY RANGE COLUMNS(CreateTime) ( PARTITION p201712 VALUES LESS THAN ('2018-01-01') ENGINE = InnoDB, PARTITION p201801 VALUES LESS THAN ('2018-02-01') ENGINE = InnoDB) */