MySQL如何启用ONLY_FULL_GROUP_BY

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),并且选择idage,如果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命令来启用它。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程