MySQL运维实战(4.3) SQL_MODE之ONLY_FULL_GROUP_BY

发布时间:2024年01月16日

作者:俊达

ONLY_FULL_GROUP_BY

设置ONLY_FULL_GROUP_BY时,对有GROUP BY子句SQL,SELECT的字段要么是GROUP BY中的字段,要么对字段进行聚合运算(如 SUM、COUNT 等),否则SQL执行报错。
不设置ONLY_FULL_GROUP_BY则允许更宽松的行为,即使查询违反了这一规则,MySQL 也会接受,即对于不在GROUP BY字段,不使用聚合函数也不会报错,MySQL会随便选取数据返回。
准备测试数据:

mysql> create table t_group(a int, b int);
Query OK, 0 rows affected (0.02 sec)

mysql> insert into t_group values(1,1),(1,2),(2,2),(2,1);
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from t_group;
+------+------+
| a    | b    |
+------+------+
|    1 |    1 |
|    1 |    2 |
|    2 |    2 |
|    2 |    1 |

设置ONLY_FULL_GROUP_BY

mysql> set sql_mode='ONLY_FULL_GROUP_BY';
Query OK, 0 rows affected (0.00 sec)

mysql> select a, b from t_group group by a;
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test_sqlmode.t_group.b' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

不设置SQL_MODE:

mysql> set sql_mode='';
Query OK, 0 rows affected (0.00 sec)

mysql> select a, b from t_group group by a;
+------+------+
| a    | b    |
+------+------+
|    1 |    1 |
|    2 |    2 |
+------+------+
2 rows in set (0.00 sec)

上面的SQL虽然能执行,但是并不符合SQL标准。

总结

我们的建议是设置ONLY_FULL_GROUP_BY,这有助于确保查询的严格性和一致性,符合 SQL 标准。此外,在生产环境中更改SQL_MODE 可能会影响现有的查询和应用程序,因此在做任何更改之前需要先进行兼容性测试。

更多技术信息请查看云掣官网https://yunche.pro/?t=yrgw

文章来源:https://blog.csdn.net/weixin_43756308/article/details/135616980
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。