16
回答
select * from Employee group by name这样的语法有什么意义?
【腾讯云】校园拼团福利,1核2G服务器10元/月!>>>   

我一般是这么写分组sql的:select name,count(1) from Employee group by name

但今天跟同事交流发现,mysql中居然可以这么写:select * from Employee group by name

但我听过他的说法后,他想要实现的效果其实是排序:select * from Employee order by name既可实现

那么问题来了,mysql中,这样神奇的语法有什么存在的意义?“select * from Employee group by name

小弟孤陋寡闻,恳求大神回答

举报
itwriter
发帖于3年前 16回/1K+阅
共有16个答案 最后回答: 3年前
神奇的mysql才会支持select * from Employee group by name 这种反逻辑的SQL(假定该表非仅name一个列)
--- 共有 1 条评论 ---
JeffreyLinmysql 的逻辑是:select 的返回字段,如果不在groupby中,也不是统计函数,那么字段的取值是从匹配的记录中随机取的;在做表关联统计的时候,可以简化 group by 后面的字段,只需要 group by parent.id 就可以了,而不用把 parent 的所有字段都列出来 3年前 回复

在表关联统计的时候,mysql这种特性可以简化 group by 后面的字段,但跟排序没太大关系
例如,订单表inv和明细表item,如果想返回inv的所有字段和item的个数,可以这样写:
select inv.*, count(itme.id) item_count
from inv left join item on inv.id=item.inv_id
group by inv.id

--- 共有 1 条评论 ---
mark35是的,discuz中也常用。这种写法可以让SQL书写简化,其他标准数据库如果要实现同样的功能就必须用嵌套来实现:内部SQL用GROUP BY来返回id字段,然后用返回的id字段去关联表实现其他详细字段的输出。当时我在做更换dz数据为pgsql时修改这种SQL实在是烦死了。虽然方便,但违反了SQL约定的逻辑:有GROUP BY的输出字段要么是聚集函数,要么是在GROUP BY中 3年前 回复

引用来自“幼龙”的评论

这样做在效率高,尤其是在数据量很大的情况下,比如我现在工作每天至少或产生数万条数据,如果全查所耗时间就远远比指定某个字段查要慢很多,所以我一般都是指定某个字段,这样能节省不少时间,还能提高工作效率

引用来自“itwriter”的评论

这么说,这是mysql为了效率优化所开发的一种写法?

不知这种写法可有名词?确实稍微有点想了解一下。

mysql的高效率基本是以牺牲安全性,反逻辑等方式来实现的。看mysql更新日志,如果某次更新是提高某方面的稳定性(比如事务方面),那么性能必然会有下降的。

其实,数据量大了,我觉得mysql也不怎么高效。filesort频繁出现性能就急剧下降

首先这条SQL要能通过语法校验再说其它的,除非Employee表只有一个name字段。另外,人家可能只是手抖写错了,还没听说过用group by排序的。

group by 分组,一般用作 sum。楼主高大上。

--- 共有 1 条评论 ---
itwriterselect position,sum(salary),count(1) from employee group by position 你说这样的写法有问题? 3年前 回复
顶部