当前位置: 首页 > 面试题库 >

为什么MySQL允许没有聚合功能的“分组”查询?

黄锋
2023-03-14
问题内容

惊喜-这是MySQL中完全有效的查询:

select X, Y from someTable group by X

如果您在Oracle或SQL Server中尝试了此查询,则会收到自然错误消息:

Column 'Y' is invalid in the select list because it is not contained in 
either an aggregate function or the GROUP BY clause.

那么MySQL如何确定每个X显示哪个Y?它只是选择一个。据我所知,它只是选择找到的第一个Y。理由是,如果Y既不是聚合函数也不在group
by子句中,则在查询中指定“选择Y”是没有道理的。因此,作为数据库引擎的我将返回我想要的任何东西,而您会喜欢它。

甚至还有一个MySQL配置参数来关闭这种“松散性”。 http://dev.mysql.com/doc/refman/5.7/zh-CN/sql-
mode.html#sqlmode_only_full_group_by

这篇文章甚至提到MySQL在这方面被批评为不符合ANSI-SQL。
http://www.oreillynet.com/databases/blog/2007/05/debunking_group_by_myths.html

我的问题是: 为什么 MySQL以这种方式设计?他们打破ANSI-SQL的理由是什么?


问题答案:

我认为这是要处理按一个字段分组意味着其他字段也要分组的情况:

SELECT user.id, user.name, COUNT(post.*) AS posts 
FROM user 
  LEFT OUTER JOIN post ON post.owner_id=user.id 
GROUP BY user.id

在这种情况下,user.name对于每个user.id始终是唯一的,因此在GROUP BY子句中不需要user.name是很方便的(尽管正如您所说,存在一定的问题范围)



 类似资料:
  • 问题内容: 我(彻底)目前正在学习SQL,并遇到了该子句。 根据您提供的参数对结果集进行汇总或分组。如果在查询中使用此子句,则可以在结果集上执行聚合函数以查找结果集的统计信息,例如查找平均值或频率。 我的问题是:没有随附的聚合函数,GROUP BY语句是否有任何用处? 更新 使用的同义词是(可能)是一个坏主意,因为我怀疑它是慢。 问题答案: 没有随附的汇总功能,GROUP BY语句有什么用吗? 在

  • 问题内容: 我有这样的表… 我想要这个… 使用PIVOT可以做到吗? 问题答案: 您可以使用MAX聚合,它将仍然有效。一个值的最大值=该值。 在这种情况下,您还可以在customerid上自我连接5次,并按每个表引用按dbColumnName进行过滤。它可能会更好。

  • 问题内容: 我正在读一本有关SQL的书(《山姆在10分钟内自学SQL》),尽管书名很不错。但是关于分组依据的一章使我感到困惑 “对数据进行分组是一个简单的过程。选定的列(查询中SELECT关键字后的列列表)是可以在GROUP BY子句中引用的列。如果在SELECT语句中找不到列,则不能考虑到这是合乎逻辑的,如果不显示数据,可以将数据分组到报表上吗?” 当我在MySQL中运行此语句时,为什么会起作用

  • 我们有一个员工姓名表,其中列有ID、name、salary 查询1不起作用,但查询2起作用。从我的开发经验来看,我觉得对此可能的解释是: sum()处理参数中指定的一组值。这里传递了'salary'列,因此它必须将此列的所有值相加。但是在where子句中,记录是一个接一个地检查的,就像第一条记录1是为了测试而检查的,等等。因此,不会计算sum(工资),因为它需要访问所有列的值,然后只有它返回一个值

  • 问题内容: 我不明白为什么Python没有功能。它有一个内置的(我认为是姐姐),但没有。 在python 2.6中甚至有一个函数(在math中),但是没有符号。当您可以只写一个然后直接从中获取时,为什么还要写一个?后者会更清楚:x带有y的符号,而带copysign的则必须记住它是x带有y的符号还是y带有x的符号! 显然,除了,它不提供任何其他功能,但是它也将更具可读性(对于像python这样的高度

  • 问题内容: Java中的数组的长度是固定的。Java为什么要允许大小为0的数组呢? 问题答案: 它表示它为空。即您可以遍历它,就好像它有项目并且没有结果发生一样: 从而避免了检查的需要。如果所讨论的数组为,则会发生异常,但是在这种情况下,它什么也不做,这可能是适当的。