mysql中select列表可以有group列表中没有的字段,大家不觉得奇怪吗?

fanday 2009-06-17 10:14:54
当然可以有聚合函数中的列就不用说了。
举个例子:(这个例子是我在论坛上看到的,不过不是问这个问题的,拿来用下)
table t:
country province district sex num
CN SD JN M 10
CN SD QD M 20

如果要是做个这样的查询:
select country,province,district,sex,sum(num)
from t
group by country,province,sex

那就会出现这样的结果:
country province district sex num
CN SD JN M 30
或是:
country province district sex num
CN SD QD M 30

大家不觉得这样会很奇怪吗?mysql为什么要这样做呢?
...全文
485 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
trainee 2009-06-19
  • 打赏
  • 举报
回复
这个写法不标准, 因为假如没group的字段如果有多个值, 可能导致这个字段会有不确定的值.
然而,假如可以确定这个字段都是重复的值(譬如多表联接), 那就没有这方面的捆饶,反而会简化SQL语句,也有可能会提高性能.

比如以下语句
select A.id, B.desc, B.XXX, B.YYY SUM(A.AMT)
FROM A
join b on a.id=b.id
where a.id=? and b.xxx=?
group a.id

假如有标准的SQL语句写, 要么要好几个嵌套, 要么group 后面很长
wangchunning 2009-06-19
  • 打赏
  • 举报
回复
写出这个SQL,恐怕也不太了解sql吧
bigfoot001 2009-06-17
  • 打赏
  • 举报
回复
這种用法有時候很方便, 從Trans-SQL轉過一下接受不到.
我也一樣.
fanday 2009-06-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ACMAIN_CHM 的回复:]
我个人,不推荐这种非标SQL语法,如果在你的程序中这么用,将来会导致移植性上的麻烦。或者某个MySQL运行在“ANSI”模式下,程序就会报语法错了。


[/Quote]
严重同意
fanday 2009-06-17
  • 打赏
  • 举报
回复
同志,没看出来吗,故意把district从group中拿出来的,仔细看看,看懂了估计对你有帮助。
ACMAIN_CHM 2009-06-17
  • 打赏
  • 举报
回复

我个人,不推荐这种非标SQL语法,如果在你的程序中这么用,将来会导致移植性上的麻烦。或者某个MySQL运行在“ANSI”模式下,程序就会报语法错了。

yuanyulin2009 2009-06-17
  • 打赏
  • 举报
回复
这个没问题
select country,province,district,sex,sum(num)
from t
group by country,province,district,sex

就可以了 因为你是按 country,province,sex
分组的呀。这三个字段相同就会累加。。
ACMAIN_CHM 2009-06-17
  • 打赏
  • 举报
回复 1

不奇怪,这是MYSQL对标准SQL的扩展,允许在GROUP BY中不必包含所有的非聚合字段。至于是好是坏就看各自观点了。 其实每个数据库都对SQL有些自己的补充。

http://dev.mysql.com/doc/refman/5.1/zh/introduction.html#extensions-to-ansi
1.8.4. MySQL对标准SQL的扩展
MySQL服务器包含一些其他SQL DBMS中不具备的扩展。注意,如果使用了它们,将无法把代码移植到其他SQL服务器。在某些情况下,你可以编写包含MySQL扩展的代码,但仍保持其可移植性,方法是用“/*... */”注释掉这些扩展。

o 不需要在GROUP BY部分命名所有选择的列。对于某些十分特殊但相当正常的查询,它能提供更好的性能。请参见12.10节,“与GROUP BY子句同时使用的函数和修改程序”。

o 可以与GROUP BY一起指定ASC和DESC。



56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧