gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:00:04 26 4
gpt4 key购买 nike

我有一个表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

服务器根据什么决定返回 Jill 和 Fred 并排除 Jack 和 Tom?

我正在 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 为何有效的 Material ,更重要的是,如果我能始终如一地依赖这种行为。如果这是一个可靠的行为,那么我可以避免这样的查询:

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

最佳答案

阅读 MySQL documentation在这一点上。

简而言之,MySQL 允许从 GROUP BY 中省略一些列,以提高性能,但是这仅在 如果省略的列都具有相同的值(在分组),否则,查询返回的值确实是不确定的,正如本文中其他人正确猜测的那样。为确保添加 ORDER BY 子句不会重新引入任何形式的确定性行为。

虽然不是问题的核心,但此示例显示了使用 * 而不是显式枚举所需列通常是一个坏主意。

摘自 MySQL 5.0 文档:

When using this feature, all rows in each group should have the same valuesfor the columns that are omitted from the GROUP BY part. The server is freeto return any value from the group, so the results are indeterminate unlessall values are the same. 

关于sql - SELECT 子句中不存在聚合函数时的 GROUP BY 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1591909/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com