COUNT语句问题--COUNT数与实际不符

COUNT语句问题--COUNT数与实际行数不符


Oracle与SQL server均是该种情况。


发现问题

工作时,在生产环境中检查供应商、客户数据时,发现使用GROUP BY查询后的数量和COUNT(字段名称)查询的数量不一致:

--视图如下
CREATE OR REPLACE VIEW FSSCGYS1 AS
SELECT
MAX(ID) AS ID, MAX(SUPID) AS SUPID, MAX(SUPIS) AS SUPIS, MAX(SUPISDEC) AS SUPISDEC,
MAX(SUPNAME) AS SUPNAME, OWNCODE
FROM FSSCGYSZSJ1 GROUP BY OWNCODE;

--查询结果
SELECT COUNT(*) FROM FSSCGYSZSJ1 --2833  不过滤重复行2833

SELECT COUNT(*) FROM FSSCGYS1;--2823
SELECT COUNT(DISTINCT OWNCODE) FROM FSSCGYSZSJ1;--2822

寻找原因

后根据查询资料和进一步测试,发现是由于COUNT()中的字段导致的,如果小括号里写的列,值有NULL就会这样,值为NULL不统计行数。

--生产环境中的表查询值为NULL的行数
SELECT COUNT(OWNCODE) FROM FSSCGYSZSJ1 WHERE OWNCODE IS NULL;--0
--测试表
CREATE TABLE TEST
(	
	ID VARCHAR(50) NOT NULL,
	NAME VARCHAR(50) NULL
);
INSERT INTO TEST (ID) VALUES('001');

分别在 Oracle 与 SQL server 中查询,结果均一致

SELECT COUNT(*) FROM TEST;--1
SELECT COUNT(NAME) FROM TEST;--0

总结

1、COUNT(1)和COUNT(*)结果一致,包含NULL值的行;
2、COUNT(字段)结果不计算NULL值;
3、COUNT(NULL)结果恒为0;
4、GROUP BY(字段) 过滤后的数据包含该字段为NULL的行。

问题环境

--Oracle
SELECT * FROM V$VERSION;

	   	BANNER	CON_ID
	1	Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production	0
	2	PL/SQL Release 12.2.0.1.0 - Production	0
	3	"CORE	12.2.0.1.0	Production"	0
	4	TNS for 64-bit Windows: Version 12.2.0.1.0 - Production	0
	5	NLSRTL Version 12.2.0.1.0 - Production	0

--SQL server
SELECT @@VERSION;

	Microsoft SQL Server 2014 - 12.0.2269.0 (Intel X86) 
		Jun 10 2015 03:19:53 
		Copyright (c) Microsoft Corporation
		Enterprise Edition on Windows NT 6.3 <X64> (Build 17134: ) (WOW64)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis-Plus提供了一个Page对象用于分页查询,其中包括当前页码、每页显示量、总记录等信息。在进行分页查询时,我们需要先查询总记录,然后再查询对应的据页。 Mybatis-Plus已经为我们提供了方便的方法来进行分页查询,我们只需要在mapper接口中定义一个带有Page参的查询方法即可。例如: ```java List<User> selectUserList(Page<User> page); ``` 在查询中,我们需要使用Mybatis-Plus提供的Page对象来进行分页查询。在查询之前,我们需要先设置Page对象的当前页码和每页显示量: ```java Page<User> page = new Page<>(1, 10); // 查询第1页,每页显示10条记录 ``` 接下来,我们需要在查询之前先查询出总记录,这个过程可以使用Mybatis-Plus提供的selectCount方法: ```java long total = userMapper.selectCount(null); // 查询总记录 page.setTotal(total); // 设置总记录 ``` 然后,我们就可以使用Page对象进行分页查询了: ```java List<User> userList = userMapper.selectUserList(page); page.setRecords(userList); // 设置据页 ``` 在进行分页查询时,Mybatis-Plus会自动拼接分页SQL语句,并将分页参传递给SQL语句。例如,在MySQL中,分页SQL语句可以如下所示: ```sql SELECT * FROM user LIMIT 0, 10; ``` 其中,0表示起始记录,10表示每页显示量。Mybatis-Plus会根据当前页码和每页显示量自动计算出起始记录

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值