MySQL如何启用ONLY_FULL_GROUP_BY
在本文中,我们将介绍如何在MySQL中启用ONLY_FULL_GROUP_BY。
阅读更多:MySQL 教程
ONLY_FULL_GROUP_BY是什么
ONLY_FULL_GROUP_BY是一个MySQL SQL_MODE选项。启用它可以强制从GROUP BY语句中选择的列必须出现在SELECT语句中,或者是聚合函数(如SUM,COUNT等)的参数。
这就是说,如果你有一个表,如下所示:
id | name | age |
---|---|---|
1 | Alice | 20 |
2 | Bob | 25 |
3 | Alice | 30 |
如果只按照name
分组(GROUP BY name
),并且选择id
和age
,如果ONLY_FULL_GROUP_BY被启用,将会出现以下错误信息:
ERROR 1055 (42000): ‘test_table.id’ isn't in GROUP BY
这是因为id
列未出现在SELECT语句中,也不是一个聚合函数的参数。
如何启用ONLY_FULL_GROUP_BY
你可以通过两种方式来启用ONLY_FULL_GROUP_BY:
1. 配置MySQL
你可以在MySQL的my.cnf或my.ini文件中设置sql_mode参数,如下所示:
[mysqld]
sql_mode = "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
在上面的例子中,我们只设置了sql_mode参数,且包含ONLY_FULL_GROUP_BY选项和其他选项。
2. 通过SET命令
你也可以通过MySQL的SET命令来设置SQL_MODE。可以按照以下步骤设置:
- 使用以下命令检查当前的SQL_MODE:
SELECT @@global.sql_mode;
- 设置新的SQL_MODE选项:
SET GLOBAL sql_mode = "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION";
示例
为了演示ONLY_FULL_GROUP_BY的效果,以下是一些示例。假设我们有以下订单表:
order_no | total | customer |
---|---|---|
0001 | 10 | Alice |
0002 | 20 | Bob |
0003 | 10 | Charlie |
0004 | 40 | Alice |
如果我们选择按照customer
进行分组,如下所示:
SELECT customer, SUM(total) as total FROM orders GROUP BY customer;
如果ONLY_FULL_GROUP_BY被启用,该查询将会执行成功,并产生以下结果:
customer | total |
---|---|
Alice | 50 |
Bob | 20 |
Charlie | 10 |
但是如果我们使用以下查询,如果ONLY_FULL_GROUP_BY被启用,将会出现错误:
SELECT customer, order_no, SUM(total) as total FROM orders GROUP BY customer;
这是因为order_no
列未出现在SELECT语句中,并且不是SUM函数的参数。这将导致ONLY_FULL_GROUP_BY错误。
总结
只有在GROUP BY语句中选择的列出现在SELECT语句中或者是聚合函数参数的情况下,MySQL的ONLY_FULL_GROUP_BY才会允许你的查询执行成功。您可以通过配置MySQL或通过SET命令来启用它。