作者:俊达
设置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