Mysql only_full_group_by 有啥用

什么是 only_full_group_by

在 Mysql 数据库中,only_full_group_by 是一个 SQL 模式的选项,它要求在使用 GROUP BY 进行查询时,SELECT 语句中的字段必须是 GROUP BY 字段或者是被聚合函数处理的字段。这个选项的作用是为了避免在 GROUP BY 查询中出现数据不一致或不确定的情况。

为什么需要 only_full_group_by

在 MySQL 之前的版本中,如果在一个 GROUP BY 查询中,SELECT 语句中出现了未被聚合函数处理的字段,MySQL 会随机选择一个值进行返回,这可能导致数据不一致的问题。而通过开启 only_full_group_by 选项,可以强制要求所有字段都必须在 GROUP BY 中出现或者被聚合函数处理,从而避免这种问题的发生。

如何开启 only_full_group_by

要开启 only_full_group_by 选项,可以通过以下方式之一:

  1. 在启动 MySQL 服务器时,使用 --sql_mode=ONLY_FULL_GROUP_BY 参数;
  2. 在 MySQL 配置文件中指定 sql_mode=ONLY_FULL_GROUP_BY
  3. 在数据库连接后,执行 SET sql_mode='ONLY_FULL_GROUP_BY'; 命令。

代码示例

以下是一个简单的示例来说明 only_full_group_by 的用法:

-- 创建一个示例表
CREATE TABLE orders (
    order_id INT,
    customer_id INT,
    total_amount DECIMAL(10, 2)
);

-- 插入一些测试数据
INSERT INTO orders (order_id, customer_id, total_amount) VALUES
(1, 1, 100.00),
(2, 1, 50.00),
(3, 2, 200.00),
(4, 2, 150.00);

-- 查询每个客户的订单总金额
SELECT customer_id, SUM(total_amount)
FROM orders
GROUP BY customer_id;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

如果没有开启 only_full_group_by,上面的查询会正常执行并返回结果。但如果开启了 only_full_group_by,则会报错,提示必须将 customer_id 字段也包含在 GROUP BY 中或者使用 SUM 函数进行处理。

流程图

开始 创建示例表orders 插入测试数据 查询每个客户的订单总金额 是否开启only_full_group_by 查询成功 报错

类图

包含 属于 Orders OrderDetails Customers

总结

only_full_group_by 是一个很有用的 SQL 模式选项,在进行 GROUP BY 查询时,可以帮助我们避免数据不一致或不确定的问题。通过充分了解并正确使用这个选项,我们可以写出更加健壮和符合标准的 SQL 查询语句,提高数据处理的准确性和可靠性。希望本文对您有所帮助!