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

SELECT子句中不存在聚合函数时的GROUP BY行为

元俊雅
2023-03-14
问题内容

我有一个emp具有以下结构和数据的表:

name   dept    salary
-----  -----   -----
Jack   a       2
Jill   a       1
Tom    b       2
Fred   b       1

当我执行以下SQL:

SELECT * FROM emp GROUP BY dept

我得到以下结果:

name   dept    salary
-----  -----   -----
Jill   a       1
Fred   b       1

服务器是基于什么决定决定返回吉尔和弗雷德,并排除杰克和汤姆?

我在MySQL中运行此查询。

注意1:我知道查询本身没有任何意义。我正在尝试调试“ GROUP BY”方案的问题。我试图了解用于此目的的默认行为。

注2:我习惯于编写与GROUP
BY子句相同的SELECT子句(减去聚合字段)。当我遇到上述行为时,我开始怀疑我是否可以在以下情况下依赖此行为:从emp表中选择薪水在部门中最低/最高的行。例如:这样的SQL语句可在MySQL上运行:

SELECT A.*, MIN(A.salary) AS min_salary FROM emp AS A GROUP BY A.dept

我找不到任何描述这种SQL为何起作用的材料,更重要的是,如果我能够始终如一地依靠这种行为的话。如果这是可靠的行为,那么我可以避免类似以下的查询:

SELECT A.* FROM emp AS A WHERE A.salary = ( 
            SELECT MAX(B.salary) FROM emp B WHERE B.dept = A.dept)

问题答案:

在这一点上阅读 MySQL文档

简而言之,MySQL出于性能考虑,允许从GROUP BY中 _ 删除 某些列,但是, _只有 在被省略的列都具有相同值
(在分组内)的情况下, 此方法才有效 ,否则, 查询返回的值的确是不确定的 ,例如在这篇文章中被其他人正确猜到了。确保添加ORDER
BY子句不会重新引入任何形式的确定性行为。

尽管不是问题的核心,但本示例说明如何使用*而不是对所需列进行显式枚举通常是一个坏主意。

摘自MySQL 5.0文档:

使用此功能时,每个组中的所有行应具有相同的值
对于GROUP BY部分中省略的列。服务器是免费的
从组中返回任何值,因此结果是不确定的,除非
所有值都相同。


 类似资料:
  • 问题内容: 简而言之,我有一个表格,其中除其他外,还包含一个用于时间戳记的列。我想获得具有最新(即最大价值)时间戳的行。目前,我正在这样做: 但是我宁愿做这样的事情: 但是,SQLite拒绝此查询: 该文件证实了这一行为(页面底部): 聚合函数只能在SELECT语句中使用。 我的问题是:是否可以编写查询以获取具有最大时间戳的行,而无需对select进行排序并将返回的行数限制为1?这似乎应该有可能,

  • 我试图提供一个实用程序,在该实用程序中,我可以获得表中每列的最大数据长度。 > 我在列表中有列的列表。 我查看每个列表。 执行下面准备好的语句。 带有max函数的prepared语句似乎不能使用动态列。它给出的值不正确。 准备好的语句是否可以与select子句中的动态列一起工作。

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

  • 我们有一个表,它将捕获每个的刷卡记录。我正在尝试编写一个查询,以获取今天第一次刷取的非重复员工记录列表。 我们正在列中保存刷卡日期信息。下面是我的查询,它抛出异常。 获取错误: 列“interface.dbo.vwempSwipeDetail.Employee First Name”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。 有什么需要帮忙的吗? 提前道谢。

  • 我有一个如下所示的查询 但当我执行上面的sql时,出现了一个错误: 预期结果: 上面的SQL有什么问题?

  • 问题内容: 我在SO上找到了一些主题,但是仍然找不到适合我的查询的设置。 这是查询,在本地主机上运行得很好: 但是在Heroku上,我 遇到了-GROUP BY子句 上面的错误, 或者在聚合函数中使用 。 然后,我在某处读到,我应该指定表中的所有列,因此我尝试了以下操作: 但这在本地主机上不起作用,在Heroku上也不行… 什么是查询的正确配置? 问题答案: 我认为您正在尝试在同一列上进行汇总和分