gpt4 book ai didi

sql - MySQL GROUP BY 行为

转载 作者:IT老高 更新时间:2023-10-29 00:02:50 24 4
gpt4 key购买 nike

给定下表 'foo'

ID | First Name | Last Name
----------------------------
67 John Smith
----------------------------
67 Bill Jacobs

以下查询将返回什么first_namelast_name,为什么?

SELECT * FROM foo WHERE ID = 67 GROUP BY ID

最佳答案

MySQL 任意选择一行。在实践中,常用的 MySQL 存储引擎返回组中第一行的值,与物理存储相关。

create table foo (id serial primary key, category varchar(10));

insert into foo (category) values
('foo'), ('foo'), ('foo'), ('bar'), ('bar'), ('bar');

select * from foo group by category;

+----+----------+
| id | category |
+----+----------+
| 4 | bar |
| 1 | foo |
+----+----------+

其他人是正确的,MySQL 允许您运行此查询,即使它具有任意且可能具有误导性的结果。 SQL 标准和大多数其他 RDBMS 供应商不允许这种不明确的 GROUP BY 查询。这称为单值规则:选择列表中的所有列都必须明确属于 GROUP BY 条件的一部分,或者位于聚合函数内,例如COUNT()MAX()

MySQL支持SQL模式ONLY_FULL_GROUP_BY如果您尝试运行违反 SQL 标准语义的查询,这会使 MySQL 返回错误。

据我所知,SQLite 是唯一允许分组查询中有歧义列的其他 RDBMS。 SQLite 从组中的最后 行返回值:

select * from foo group by category;

6|bar
3|foo

我们可以想象没有歧义但仍然违反 SQL 标准语义的查询。

SELECT foo.*, parent_of_foo.* 
FROM foo JOIN parent_of_foo
ON (foo.parent_id = parent_of_foo.parent_id)
GROUP BY foo_id;

这不可能产生模棱两可的结果。如果我们 GROUP BY foo 的主键,foo 中的每一行都有自己的组。所以来自 foo 的任何列在组中只能有一个值。如果组是由 foo 的主键定义的,即使连接到由 foo 中的外键引用的另一个表,每个组也只能有一个值。

MySQL 和 SQLite 相信您可以设计逻辑明确的查询。形式上,选择列表中的每一列都必须是 GROUP BY 条件中列的功能依赖。如果你不遵守这一点,那是你的错。 :-)

标准 SQL 更加严格,并且不允许某些可能明确的查询——可能是因为它对于 RDBMS 来说太复杂了,通常无法确定。

关于sql - MySQL GROUP BY 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1645921/

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