📌  相关文章
📜  GROUP BY 子句;这与 sql_mode=only_full_group_by 不兼容 - SQL (1)

📅  最后修改于: 2023-12-03 15:31:04.683000             🧑  作者: Mango

GROUP BY 子句;这与 sql_mode=only_full_group_by 不兼容 - SQL

在使用MySQL进行数据库查询时,我们经常会用到GROUP BY子句用于对查询结果进行分组,并进行聚合计算。但是在MySQL 5.7和更高版本中引入了一个新特性——sql_mode=only_full_group_by,用于确保GROUP BY子句的正确性。如果开启了此特性,那么对于SELECT语句的列必须全部在GROUP BY子句中出现,否则将报错。

例如,假设我们有一个数据表orders,包括以下字段:

  • order_id:订单号
  • customer_id:客户ID
  • order_date:订单日期
  • total_amount:订单总金额

如果我们想按照customer_id分组,计算每个客户的订单总金额,可以使用以下SQL语句:

SELECT customer_id, SUM(total_amount)
FROM orders
GROUP BY customer_id;

但是如果我们忘记在SELECT子句中包括customer_id,那么在开启sql_mode=only_full_group_by的情况下,会出现如下错误:

ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'orders.customer_id'

这是因为SQL语句中的SELECT子句中包含了一个未在GROUP BY子句中出现的列customer_id,该列不属于聚合计算的一部分。

为了避免这种错误,我们应该始终保证SELECT子句中所有列都在GROUP BY子句中出现,或者使用聚合函数将它们包含在内。

同时,我们也可以关闭sql_mode=only_full_group_by特性来允许不严谨的GROUP BY查询,使用以下SQL语句即可:

SET sql_mode='';

但这样做可能会导致不正确的查询结果。

在实际应用中,我们应该根据具体情况来确定是否需要开启sql_mode=only_full_group_by,以确保查询结果的正确性和可靠性。