解决大于5.7版本mysql的分组报错Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated

这个报错是由于MySQL 5.7版本以后对于分组查询的规则进行了更改导致的。现在要求分组查询中选择的列必须要么出现在GROUP BY子句中,要么是聚合函数,否则会报错。如果数据表中存在要查询的字段中有出现在GROUP BY子句中的列之外的字段时,就会出现“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated”的错误提示。

解决这个问题的方法有两个:一个是在MySQL配置文件中修改相关参数,另一个是修改查询语句。

方法1:修改MySQL配置文件

  1. 打开MySQL配置文件my.cnf,可以通过如下命令定位到配置文件路径:
# Ubuntu系统:
sudo vim /etc/mysql/my.cnf

# CentOS系统:
sudo vim /etc/my.cnf
  1. 在[mysqld]节下添加如下语句:
sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
  1. 修改完成后保存并退出配置文件,然后重启MySQL服务,使配置文件生效:
# Ubuntu系统:
sudo systemctl restart mysql

# CentOS系统:
sudo systemctl restart mariadb

方法2:修改查询语句

修改查询语句分两种情况:要么将查询语句中除了分组字段外的字段放入聚合函数中,要么将查询语句中多余的字段删掉。

情况一:将查询语句中除了分组字段外的字段放入聚合函数中。举例如下:

# 查询每个班级的平均成绩和学生总数,但是要求按照学生姓名的首字母排序,并且要显示班级名称以及学生姓名:
SELECT class_name, SUBSTRING(student_name, 1, 1) AS first_letter, AVG(score) AS avg_score, COUNT(*) AS count
FROM score INNER JOIN student ON score.student_id = student.id
GROUP BY class_name, first_letter
ORDER BY first_letter;

运行以上查询会出现错误提示“Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated,因为查询语句中的first_letter列既不是分组字段,也不是聚合函数。

正确的写法是将first_letter字段放到聚合函数中:

SELECT class_name, SUBSTRING(student_name, 1, 1) AS first_letter, AVG(score) AS avg_score, COUNT(*) AS count
FROM score INNER JOIN student ON score.student_id = student.id
GROUP BY class_name, SUBSTRING(student_name, 1, 1)
ORDER BY SUBSTRING(student_name, 1, 1);

情况二:将查询语句中多余的字段删掉。举例如下:

# 查询每个班级的平均成绩和学生总数,不需要显示班级名称和学生姓名:
SELECT AVG(score) AS avg_score, COUNT(*) AS count
FROM score INNER JOIN student ON score.student_id = student.id
GROUP BY class_name;

以上查询语句中的class_name字段是无关的,出现了错误提示“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated”。正确的写法是将查询语句中不需要的class_name字段删掉:

SELECT AVG(score) AS avg_score, COUNT(*) AS count
FROM score INNER JOIN student ON score.student_id = student.id
GROUP BY class_name;

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解决大于5.7版本mysql的分组报错Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated - Python技术站

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

相关文章

  • 三、ADO.Net基础【02】ADO.Net连接MySQL

    1.MySQL连接 准备工作   安装MySQL的.Net驱动mysql-connector-net-***.msi添加到项目的库中。新建项目,添加引用→“扩展”,添加Mysql.Data;如果是直接解压版,然后直接添加对MySql.Data.dll文件的引用;(安装后,每次连接mysql数据 库时都要添加Mysql.Data.dll程序集的引用。) 附:驱…

    MySQL 2023年4月13日
    00
  • my.cnf参数配置实现InnoDB引擎性能优化

    InnoDB引擎是MySQL数据库中默认的事务性存储引擎,它的性能优化对于MySQL数据库的整体性能提升至关重要。本文将介绍如何通过my.cnf参数配置实现InnoDB引擎性能优化。 步骤一:备份原有my.cnf文件 在修改my.cnf文件前,我们应该先备份原有的my.cnf文件,以便在修改出现问题时可以恢复到原有配置。 cp /etc/mysql/my.c…

    MySQL 2023年5月19日
    00
  • mysql执行sql文件报错Error: Unknown storage engine‘InnoDB’的解决方法

    当我们使用MySQL执行SQL文件时,可能会遇到“Error: Unknown storage engine ‘InnoDB’”的报错,这是因为MySQL没有正确地识别InnoDB存储引擎导致的。下面是解决这个问题的步骤和方法。 步骤 查看当前MySQL版本是否支持InnoDB存储引擎。可以通过以下命令查看: SHOW ENGINES; 查看结果中是否包含I…

    MySQL 2023年5月18日
    00
  • MySQL 配置文件my.cnf 例子最详细翻译

    MySQL 是一款广泛用于数据库开发的软件,而对于其配置文件 my.cnf 的配置,则是保证 MySQL 运行正常且高效的关键所在。下面,我们就来详细讲解一下如何进行 my.cnf 文件的配置。 1. 确定 my.cnf 的位置 在讲述如何配置 my.cnf 文件之前,我们需要先确定 my.cnf 的位置,因为它在不同系统上可能有不同的位置。在 Linux …

    MySQL 2023年5月19日
    00
  • 总结MySQL建表、查询优化的一些实用小技巧

    总结MySQL建表、查询优化的一些实用小技巧 MySQL建表和查询优化是数据库开发中非常重要的一部分,正确的建表和优化方式可以有效地提升系统性能和稳定性。本文总结了一些实用的小技巧,希望能够对MySQL的开发者有所帮助。 1. 建表技巧 1.1 使用自增主键 在MySQL中,使用自增主键是创建表时建议的最佳实践之一。自增主键是一种非常方便的方式,可以为每一条…

    MySQL 2023年5月19日
    00
  • Mysql 错误问题汇总(不断更新中)

    首先,你需要了解这篇文章的主要内容,即 MySQL 常见的错误问题和解决办法的总结,可以帮助开发者更好地排查 MySQL 相关的问题。在这篇文章中,作者结合实际开发中遇到的问题,对错误进行了分类,并分别给出了相应的解决办法。 文章的开头部分通过标题将常见的 MySQL 错误问题进行了归类,包括数据操作错误、连接错误、权限问题、性能问题等等。每一个分类下,作者…

    MySQL 2023年5月18日
    00
  • Oracle或者MySQL字符串列拆分成行(列转行)的几种方式

    Oracle或者MySQL字符串列拆分成行(列转行)的几种方式 本文连接:https://www.cnblogs.com/muphy/p/10781505.html Oracle字符串拆分成行(列转行)的三种方式 –muphy 开发过程中经常会遇到将前台多个值用逗号连接一同传递到后台查询,这个用逗号连接的字符串分隔的每个字符串分别对应Oracle数据库表的…

    MySQL 2023年4月13日
    00
  • MySQL适用于哪些应用场景?

    MySQL是一个开源的关系型数据库管理系统。它的可靠性、性能、灵活性和易用性使得它成为了最受欢迎的数据库之一。 MySQL适用于很多不同的应用场景,下面列出了其中的5个: 1、Web应用程序:MySQL可与Web编程语言如PHP、Python和Java结合使用,为网站提供持久的数据存储解决方案。由于其高度可靠性和短学习曲线,MySQL已成为最受欢迎的Web开…

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