where与group by同时存在时数据差异原因分析

where和group by同时使用是出现数据差异具体如下:

我们使用where 判断 .financingProductId = ‘11111111111111111’
其中部分有同一个enterpriseInfoId有不同的的数据,不同的financingProductId (点题)
两种实现方式

一、在where和group by同时使用来查询数据

SELECT 
c.enterpriseInfoId,c.financingProductId
FROM 
c_cooperative_organization c 
WHERE 
  c.financingProductId = '11111111111111111'
GROUP BY c.enterpriseInfoId

二、group by得到的结果集作为再进行where判断
SELECT *  FROM(
SELECT 
c.enterpriseInfoId,c.financingProductId
FROM 
c_cooperative_organization c 

GROUP BY c.enterpriseInfoId
) d where d.financingProductId = '11111111111111111';

结论:第一种方式的结果会比第二种方式大
等价于用having

SELECT 
c.enterpriseInfoId,c.financingProductId
FROM 
c_cooperative_organization c 
GROUP BY c.enterpriseInfoId HAVING financingProductId = '11111111111111111'

分析

我们先看sql执行顺序,

第一种方式的执行顺序

先进行条件判断再进行分组

第二种方式的执行顺序

先进行分组再进行条件判断

咋眼一看只是顺序调换,如同乘除顺序不会影响,其实不然

通过求数据集的差集来判断有哪些数据数多出来的
where xxx in not(效率低,生成环境不建议使用)


SELECT b.enterpriseInfoId FROM (
SELECT 
c.enterpriseInfoId,c.financingProductId
FROM 
c_cooperative_organization c 
WHERE 
c.isOldVersion = '0'  and  c.financingProductId = '11111111111111111'
GROUP BY c.enterpriseInfoId
) b
where b.enterpriseInfoId not in
(SELECT d.enterpriseInfoId  FROM(
SELECT 
c.enterpriseInfoId,c.financingProductId
FROM 
c_cooperative_organization c 
WHERE 
c.isOldVersion = '0' 
GROUP BY c.enterpriseInfoId
) d where d.financingProductId = '11111111111111111'
)

得到4条
在这里插入图片描述
在看看其中一条的情况
在这里插入图片描述
出现了如上上点题的情况,不同的financingProductId (点题)

细细分析

第一种方式为什么多,是因为在分组之前我们拿到了一条数据如下,再分组也有这数据了
在这里插入图片描述
第二种方式,它先分组,它取的可能就不是上面数据,可能是下面数据,这里就少了这数据了。
在这里插入图片描述
所以造成了,数据差异。

建议使用Having

我们如果就是想查询分组时,想要直接显示某个值,该值通过参数传进来。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值