Mysql 使用GROUP\ U BY和ONLY\ U FULL\ U GROUP\ U BY的解释查询
我想了解查询如何仅在启用了_FULL _GROUP _BY的情况下工作 如果我在一列中列出表中的所有列,并在其中添加一个MIN(),则效果良好:Mysql 使用GROUP\ U BY和ONLY\ U FULL\ U GROUP\ U BY的解释查询,mysql,sql,Mysql,Sql,我想了解查询如何仅在启用了_FULL _GROUP _BY的情况下工作 如果我在一列中列出表中的所有列,并在其中添加一个MIN(),则效果良好: $query = "SELECT id, member_id, name, code, MIN(price) AS price, FROM tbl_product GROUP BY code"; 但如果我选择了所有内容,则会出现错误: $query = "SELECT *, MIN(price) AS price FRO
$query = "SELECT id, member_id, name, code, MIN(price) AS price, FROM tbl_product GROUP BY code";
但如果我选择了所有内容,则会出现错误:
$query = "SELECT *, MIN(price) AS price FROM tbl_product GROUP BY code";
你能解释一下两者的区别吗?这是关于MySQL 5.7.5中修复的一个bug。根据手册,MySQL 5.7.5及更新版本可以检测主键和表中其他列之间的函数依赖关系。字面上说: MySQL 5.7.5及以上版本实现了功能依赖性检测。如果启用了“唯一完整”的“按SQL分组”模式(默认情况下),MySQL将拒绝select list、HAVING condition或ORDER BY list引用的未聚合列的查询,这些列既不在GROUP BY子句中命名,也不在功能上依赖于它们
ONLY\u FULL\u GROUP\u BY
现在是默认选项,按照SQL标准的规定工作。这是关于MySQL 5.7.5中修复的一个错误。根据手册,MySQL 5.7.5及更新版本可以检测主键和表中其他列之间的函数依赖关系。字面上说:
MySQL 5.7.5及以上版本实现了功能依赖性检测。如果启用了“唯一完整”的“按SQL分组”模式(默认情况下),MySQL将拒绝select list、HAVING condition或ORDER BY list引用的未聚合列的查询,这些列既不在GROUP BY子句中命名,也不在功能上依赖于它们
ONLY\u FULL\u GROUP\u BY
现在是默认选项,并按照SQL标准的规定工作。问题是,为什么您会认为GROUP BY
可以与select*
一起工作
groupby
所做的是为groupby
键的每个值组合生成一行。这就是定义。多行变成一行
select
中允许的表达式如下:
- 分组依据键或仅包含这些键的表达式
- 其他值的摘要函数
- 摘要函数与分组键的组合
select
中任何不在groupby
中的列在原始行中都可能有多个值。SQL不允许这样做。大多数数据库不允许这样做。默认情况下,MySQL不再允许这样做
曾经有过,但返回的值来自不确定的匹配行。这个“功能”(实际上是一个bug)现在已经修复
注意:有一个例外——标准允许——允许按主键/唯一键进行聚合,然后选择其余列。这是允许的,因为主键唯一地标识了列的其余值。问题是,为什么您会认为
分组依据
可以与选择*
一起使用
groupby
所做的是为groupby
键的每个值组合生成一行。这就是定义。多行变成一行
select
中允许的表达式如下:
- 分组依据键或仅包含这些键的表达式
- 其他值的摘要函数
- 摘要函数与分组键的组合
select
中任何不在groupby
中的列在原始行中都可能有多个值。SQL不允许这样做。大多数数据库不允许这样做。默认情况下,MySQL不再允许这样做
曾经有过,但返回的值来自不确定的匹配行。这个“功能”(实际上是一个bug)现在已经修复
注意:有一个例外——标准允许——允许按主键/唯一键进行聚合,然后选择其余列。这是允许的,因为主键唯一地标识列的其余值。数据库是什么?是MySQL吗?数据库是什么?是MySQL吗?