select * from Employee group by name这样的语法有什么意义?

itwriter 发布于 2015/03/10 20:54
阅读 1K+
收藏 0

我一般是这么写分组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

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

加载中
1
mark35
mark35
神奇的mysql才会支持select * from Employee group by name 这种反逻辑的SQL(假定该表非仅name一个列)
JeffreyLin
JeffreyLin
mysql 的逻辑是:select 的返回字段,如果不在groupby中,也不是统计函数,那么字段的取值是从匹配的记录中随机取的;在做表关联统计的时候,可以简化 group by 后面的字段,只需要 group by parent.id 就可以了,而不用把 parent 的所有字段都列出来
1
JeffreyLin
JeffreyLin

在表关联统计的时候,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

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

引用来自“幼龙”的评论

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

引用来自“itwriter”的评论

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

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

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

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

0
朱宏青
朱宏青

当数据在一定情况下 我觉得这个sql是会出问题的

排序应该用ORDER BY

0
saintatgod
saintatgod
为什么是group by 呢,会有问题的
0
纠结名字
首先这条SQL要能通过语法校验再说其它的,除非Employee表只有一个name字段。另外,人家可能只是手抖写错了,还没听说过用group by排序的。
0
各种打杂
各种打杂

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

itwriter
itwriter
select position,sum(salary),count(1) from employee group by position 你说这样的写法有问题?
0
itwriter
itwriter
看来可以结贴了,这样的写法并没有特殊的用场,大概只是mysql的蛋疼行为而已。
0
xdev
xdev
我到想知道mysql是如何实现的(如果其他字段不同纪录有不同的值)
0
wharf_zhang
wharf_zhang
还有这种逆天的搞法?反正我是不允许我的数据库这么搞的,讲不通啊,是吧。
返回顶部
顶部