GROUP BY 语句抛出错误教程不是
GROUP BY statement throwing errors tutorial isn't
你好,我正在阅读有关 SQL 联接的教程,下面的语句会抛出“sql_mode=only_full_group_by”错误。我直接从教程中复制了它并为他工作。我只需要在终端中禁用此模式吗?
SELECT *
FROM customers
JOIN orders
ON customers.id = orders.customer_id
GROUP BY orders.customer_id;
如果启用 ONLY_FULL_GROUP_BY
SQL 模式(默认情况下),MySQL 拒绝 select
列表 HAVING
的查询条件或 ORDER BY
列表指的是既未在 GROUP BY
子句中命名也不在功能上依赖于它们的非聚合列。 [1]
您可以禁用它,但启用它确实很有意义。考虑以下情况:
id | type
---|-----
1 | foo
2 | foo
3 | bar
如果您使用与 select * from table group by type
类似的查询,您希望输出结果是什么?也许您希望有两行,foo
和 bar
,但是您希望在 id
列中包含什么,即 foo
记录?我们应该只选择最早的记录吗?最新记录?随机记录?这就是错误告诉您的内容 - 您必须明确说明,而不是让数据库引擎为您选择。
因此,在您的示例中,您需要考虑结果数据的外观。也许你想要 select customers.name, count(*) ...
而不是 select *
,等等
这对您正在学习的教程有效的原因是他们没有启用 only_full_group_by
,或者他们使用的 MySql 版本早于引入此功能的 5.7.5 .在这种情况下,服务器可以自由地从每个组中选择任何值,这可能不是您想要的。
最后,如果您希望控制台的行为方式与教程的行为方式相同,您可以通过以下方式在控制台中禁用 ONLY_FULL_GROUP_BY
:
mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
[1] https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
你好,我正在阅读有关 SQL 联接的教程,下面的语句会抛出“sql_mode=only_full_group_by”错误。我直接从教程中复制了它并为他工作。我只需要在终端中禁用此模式吗?
SELECT *
FROM customers
JOIN orders
ON customers.id = orders.customer_id
GROUP BY orders.customer_id;
如果启用 ONLY_FULL_GROUP_BY
SQL 模式(默认情况下),MySQL 拒绝 select
列表 HAVING
的查询条件或 ORDER BY
列表指的是既未在 GROUP BY
子句中命名也不在功能上依赖于它们的非聚合列。 [1]
您可以禁用它,但启用它确实很有意义。考虑以下情况:
id | type
---|-----
1 | foo
2 | foo
3 | bar
如果您使用与 select * from table group by type
类似的查询,您希望输出结果是什么?也许您希望有两行,foo
和 bar
,但是您希望在 id
列中包含什么,即 foo
记录?我们应该只选择最早的记录吗?最新记录?随机记录?这就是错误告诉您的内容 - 您必须明确说明,而不是让数据库引擎为您选择。
因此,在您的示例中,您需要考虑结果数据的外观。也许你想要 select customers.name, count(*) ...
而不是 select *
,等等
这对您正在学习的教程有效的原因是他们没有启用 only_full_group_by
,或者他们使用的 MySql 版本早于引入此功能的 5.7.5 .在这种情况下,服务器可以自由地从每个组中选择任何值,这可能不是您想要的。
最后,如果您希望控制台的行为方式与教程的行为方式相同,您可以通过以下方式在控制台中禁用 ONLY_FULL_GROUP_BY
:
mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
[1] https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html