Mysql升级到5.7后遇到的group by查询问题解决

当将MySQL数据库升级到5.7版本后,可能会出现一些与group by查询相关的问题,这是因为MySQL 5.7的group by语句在某些情况下会产生与之前版本不同的结果。

为了解决这些问题,可以采用以下步骤:

1.启用SQL_MODE

MySQL 5.7具有更严格的SQL_MODE,以提高数据的一致性和准确性。可以通过修改/etc/mysql/mysql.conf.d/mysql.cnf文件(具体路径可能会有所不同)以启用SQL_MODE。

在文件的[mysqld]部分添加如下行(如果已有其他SQL_MODE,请在末尾添加):

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

重启MySQL服务以使更改生效。

2.使用ONLY_FULL_GROUP_BY选项进行group by查询

MySQL 5.7的group by语句默认启用ONLY_FULL_GROUP_BY选项,这意味着在进行group by查询时,查询的列必须要出现在SELECT语句中,否则会产生错误。可以使用以下语句关闭ONLY_FULL_GROUP_BY选项:

SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

可以将以上命令添加到连接数据库之前的脚本中,以确保每次连接时都会关闭ONLY_FULL_GROUP_BY选项。

示例1:group by查询中的错误

假设我们有以下两个表:

CREATE TABLE orders (
  id INT PRIMARY KEY,
  customer_id INT,
  total INT
);

CREATE TABLE customers (
  id INT PRIMARY KEY,
  name VARCHAR(50),
  age INT
);

orders表中存储了每个客户的订单信息,customers表中存储了客户的基本信息。现在我们想获取每个客户的名字和订单的平均总价。可以使用以下查询语句:

SELECT 
  customers.name, 
  AVG(orders.total) 
FROM 
  orders 
  INNER JOIN customers 
    ON orders.customer_id = customers.id 
GROUP BY 
  customers.id;

在MySQL 5.6及更早版本中,以上查询是有效的,可以返回正确的结果。但是,在MySQL 5.7中,执行以上查询会产生以下错误:

ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.customers.name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

这是因为MySQL 5.7默认启用了ONLY_FULL_GROUP_BY选项,查询语句中的customers.name列未在GROUP BY语句中出现。修复该错误的方法是将customers.name列添加到GROUP BY语句中:

SELECT 
  customers.name, 
  AVG(orders.total) 
FROM 
  orders 
  INNER JOIN customers 
    ON orders.customer_id = customers.id 
GROUP BY 
  customers.id, 
  customers.name;

示例2:使用ONLY_FULL_GROUP_BY选项进行group by查询

现在我们想获取每个客户的名字和订单的平均总价,但是只想返回有订单的客户。可以使用以下查询语句:

SELECT 
  customers.name, 
  AVG(orders.total) 
FROM 
  orders 
  RIGHT JOIN customers 
    ON orders.customer_id = customers.id 
GROUP BY 
  customers.id 
HAVING 
  COUNT(orders.total) > 0;

在MySQL 5.6及更早版本中,以上查询是有效的,可以返回正确的结果(对于没有订单的客户,AVG(orders.total)返回NULL)。但是,在MySQL 5.7中,执行以上查询会产生以下错误:

ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.customers.name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

这是因为查询语句中使用了RIGHT JOIN,有些客户可能没有订单,AVG(orders.total)会返回NULL。为了修复该错误,可以使用以下查询语句:

SELECT 
  customers.name, 
  AVG(IFNULL(orders.total, 0)) 
FROM 
  orders 
  RIGHT JOIN customers 
    ON orders.customer_id = customers.id 
GROUP BY 
  customers.id 
HAVING 
  COUNT(IFNULL(orders.total, 0)) > 0;

以上查询使用了IFNULL函数将NULL值替换为0,从而使AVG函数返回正确的值。同时,在COUNT函数中也使用了IFNULL函数,以便正确计算客户的订单数。

通过以上步骤和示例,我们可以正确地使用MySQL 5.7进行group by查询。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Mysql升级到5.7后遇到的group by查询问题解决 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • mysql 查询重复的数据的SQL优化方案

    当我们需要查询数据库中重复的数据时,在传统的方法中,我们可以使用GROUP BY函数或者DISTINCT函数进行实现,但是这种方式的缺点在于运行效率低下,特别是对于大数据量的查询。因此,我们需要一些更加高效的SQL优化方案。 下面是mysql查询重复数据的SQL优化方案的完整攻略: 1. 通过使用HAVING子句和COUNT函数来查询 第一种方法是使用HAV…

    MySQL 2023年5月19日
    00
  • mysql优化之慢查询分析+explain命令分析+优化技巧总结

    下面是 “mysql优化之慢查询分析+explain命令分析+优化技巧总结” 的详细攻略。 什么是慢查询? 慢查询指的是在执行SQL语句时,执行时间超过了预期的时间范围,一般来说大于0.1秒的SQL可以看作是慢查询。 如何进行慢查询分析? 在MySQL中,可以通过设置参数 slow_query_log 来开启慢查询记录功能。开启该功能后,所有执行时间超过设置…

    MySQL 2023年5月19日
    00
  • MySQL生成千万测试数据以及遇到的问题

    下面是关于“MySQL生成千万测试数据以及遇到的问题”的完整攻略。 一、背景介绍 在进行数据分析、测试或性能优化等操作时,通常需要使用一定量的测试数据来模拟真实场景。但手动添加大量数据很费时费力,因此本文介绍一种可以自动生成千万级别测试数据的方法。 二、使用工具 本文使用Faker库生成随机数据,并通过Python语言代码将随机数据导入到MySQL数据库中。…

    MySQL 2023年5月18日
    00
  • MySQL UPDATE:修改数据(更新数据)详解

    MySQL UPDATE语句用于更新表中的现有数据。它允许您修改现有行,而不是添加新行。 语法: UPDATE table_name SET column1 = value1, column2 = value2, … WHERE condition; 参数说明: table_name:要更新数据的表名。 SET:指定要更改的列和它们新值的列表。 WHER…

    MySQL 2023年3月9日
    00
  • MySQL数据库INNODB表损坏修复处理过程分享

    MySQL数据库INNODB表损坏修复处理过程分享 背景 MySQL数据库中使用INNODB存储引擎的表,可能会因为各种原因出现损坏导致无法正常访问,这会给网站运营和管理带来很大影响,因此需要快速处理。下面分享一下INNODB表损坏修复的过程。 前置条件 在开始修复INNODB表之前,需要准备以下工具和环境: MySQL数据库客户端 确认INNODB存储引擎…

    MySQL 2023年5月18日
    00
  • 30种SQL语句优化的方法汇总

    为了更好地讲解“30种SQL语句优化的方法汇总”的完整攻略,我们可以分为以下几个步骤: 步骤一:收集SQL执行计划 收集SQL执行计划可以让我们更直观地了解SQL在数据库中的执行情况,从而找到优化SQL的方法。有以下两种方法可以收集SQL执行计划: 1.1 通过EXPLAIN命令收集执行计划 EXPLAIN命令可以显示SQL语句的执行计划,包括表的读取顺序、…

    MySQL 2023年5月19日
    00
  • MYSQL设置触发器权限问题的解决方法

    针对MYSQL设置触发器权限问题的解决方法,可以参考以下攻略: 1. 背景描述 在MYSQL数据库中,触发器(trigger)是一种特殊的存储过程,可以在表中的数据发生变化时自动执行某些操作。但是,在设置触发器时若用户没有设置好相应的权限,可能会因权限不足而导致触发器无法正常使用。 2. 解决方案 为了解决MYSQL设置触发器权限问题,可以采取以下步骤: 确…

    MySQL 2023年5月18日
    00
  • MySQL——排序和分页

    1、排序(ORDER BY) 升序 :ASC 降序 :DESC ORDER BY: 通过那个字段排序,怎么排 — 查询的结果根据 成绩升序 排序 SELECT s.`StudentNo`,`StudentName`,`SubjectName`,`StudentResult` FROM student s INNER JOIN `result` r ON s…

    2023年4月12日
    00
合作推广
合作推广
分享本页
返回顶部