mysql中这句select为什么查询出的是空数据?

SELECT name FROM ceshi GROUP BY nameHAVING name< AVG(name)
图片描述

图片描述

阅读 3.4k
3 个回答

因为 name === AVG(name) ,你group by nameAVG(name)又不是所有的均值。

SELECT name FROM ceshi GROUP BY name HAVING name < 2;

我测试能取出来,name HAVING 他们之间缺少空格?

SELECT `name`, AVG(`name`) FROM ceshi
GROUP BY `name` 

跑一下这条sql你就知道了。这里的AVG(name)并不是所有name的平均值,而是group by后的name的平均值,所以name<avg(name)恒为false。

解决方法:
1、在程序里先跑一边统计平均值的sql,然后把计算好的统计值填入该sql;
2、(不推荐在生产环境使用)having里面使用子查询,

SELECT `name` FROM ceshi
GROUP BY `name` 
HAVING `name` < (SELECT AVG(`name`) FROM ceshi);

3、使用变量(本质上就是1),

SET @name_avg = (SELECT AVG(`name`) FROM ceshi);

SELECT `name` FROM ceshi
GROUP BY `name`
HAVING `name` < @name_avg;
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题