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日

相关文章

  • phpMyAdmin链接MySql错误 个人解决方案

    针对“phpMyAdmin链接MySql错误”的问题,我会提供以下攻略: 问题描述 在使用phpMyAdmin链接MySql时,可能会出现链接错误的问题,例如: Cannot connect: Invalid settings – 配置无效 #2003 – Can’t connect to MySQL server on ‘localhost’ (10061…

    MySQL 2023年5月18日
    00
  • 面试题锦集:1、数据库三大范式,2、mysql索引类型及作用,3、事务的特性和隔离级别

    目录 面试题集锦 一、数据库三大范式 二、mysql有哪些索引类型及作用 三、事务的特性和隔离级别 1、事务的四大特性 2、事务的隔离级别 3、什么是脏读、不可重复度、幻读 4、解决办法 面试题集锦 一、数据库三大范式 第一范式(1NF): 指数据库中表的每一列都是不可分割的最小单位 # 分割前: 地址 安徽省合肥市蜀山区 # 分割后: 省 | 市 | 区 …

    MySQL 2023年4月8日
    00
  • 【原创】并发数优化–java+ssh+c3p0+tomcat+mysql+windows2008-64位

    新项目开发完毕,到了项目部署,没得选也是我来弄了! 最主要的问题:并发数!   这个所有客户数量较大的服务器都会遇到的问题。 虽然现在还没有解决,哈哈哈哈哈哈哈哈哈哈哈哈哈,但是记录下我现在所做的工作吧!   一、数据库 1,数据库:       数据库选择的是MySql 5.1,正常安装,未做优化,只是调整了最大连接数“max_connections=10…

    MySQL 2023年4月13日
    00
  • mysql大数据查询优化经验分享(推荐)

    MySQL大数据查询优化经验分享 MySQL作为一款常见的关系型数据库,在处理大数据的情况下常常会出现性能问题。本文将为您介绍一些针对MySQL大数据查询的优化经验,以提高查询效率和性能。 1. 数据库设计 在大数据场景下,数据库设计是非常重要的一个步骤。合理的数据库设计可以减少冗余数据,提高数据存储和查询效率。以下是一些数据库设计的建议: 1.1. 建立索…

    MySQL 2023年5月19日
    00
  • mysql 主从数据不一致,提示: Slave_SQL_Running: No 的解决方法

    MySQL 主从复制是实现 MySQL 集群高可用性的常用方式之一,其中主库将更新同步到从库,保持数据的一致性。但是,在实际应用中,由于网络、服务器故障或配置错误等原因,可能会导致主从数据不一致的问题,Slave_SQL_Running: No 是其中比较常见的错误提示。 下面是解决该问题的具体攻略: 1. 查看错误日志 在主从数据库服务器上查看错误日志,快…

    MySQL 2023年5月18日
    00
  • MySQL高级学习笔记(三):Mysql逻辑架构介绍、mysql存储引擎详解

    MySQL高级学习笔记(三)包含了Mysql逻辑架构介绍和MySQL存储引擎详解两个部分,其中分别讲解了MySQL的重要特性和基础知识以及如何进行存储引擎的选择和操作。 Mysql逻辑架构介绍 MySQL的逻辑架构分为三层:连接层、服务层和存储引擎层。其中连接层负责处理客户端与服务器之间的连接和通信,服务层负责解析和执行SQL语句,存储引擎层负责数据存储和管…

    MySQL 2023年5月19日
    00
  • mysql中的7种日志小结

    当我们使用MySQL时,我们可能会遇到各种问题,比如数据丢失、故障恢复等。为了解决这些问题,MySQL提供了一组非常有用的日志。 MySQL中有7种主要的日志,它们是: 错误日志 (error log) 查询日志 (query log) 二进制日志 (binary log) 慢查询日志 (slow query log) 中继日志 (relay log) 事务…

    MySQL 2023年5月18日
    00
  • MySQL查询语句过程和EXPLAIN语句基本概念及其优化

    MySQL是一种常用的关系型数据库管理系统。在使用MySQL进行数据操作时,查询语句是经常使用的操作之一。在进行MySQL查询时,需要了解查询语句的过程和优化方法,以达到更好的性能和效率。 查询语句过程 MySQL查询语句的执行过程大概可分为下面几个步骤: 语法解析在语法解析阶段,MySQL会对查询语句进行语法分析,判断查询语句是否符合MySQL语法规范。如…

    MySQL 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部