解决大于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日

相关文章

  • MySQL ERROR 1045 (28000) 错误的解决办法

    MySQL ERROR 1045 (28000)是一个非常常见的MySQL访问控制错误。这个错误通常意味着MySQL服务器在接受连接请求时,拒绝了连接请求。下面我们来详细讲解关于这个错误的解决办法。 内容 原因分析 导致MySQL ERROR 1045 (28000)的最常见原因是因为: 输入的用户名或密码不正确。 没有为MySQL中的用户授予足够的权限。 …

    MySQL 2023年5月18日
    00
  • mysql:Can’t start server: can’t create PID file: No space left on device

    当在启动MySQL服务器时,可能会遇到错误消息“Can’t start server: can’t create PID file: No space left on device”。该错误消息表示MySQL试图创建一个PID文件,但由于磁盘空间不足,无法完成该操作。我们可以采取以下几步来解决这个问题: 检查磁盘空间 在终端输入以下命令:df -h。这将显示…

    MySQL 2023年5月18日
    00
  • Mysql ERROR 1577错误解决方法

    Mysql ERROR 1577错误是由于MySQL限制了查询结果集的最大大小。如果查询结果集的大小大于MySQL所允许的最大值,那么就会出现该错误。 解决方法如下: 1. 修改Mysql的配置文件 编辑MySQL的配置文件 /etc/my.cnf 或者 /etc/mysql/my.cnf,在 [mysqld] 下增加: max_allowed_packet…

    MySQL 2023年5月18日
    00
  • MySQL — 练习题

      一. 表关系 1. 创建如下表,并创建相关约束.   # 创建班级表 create table class ( cid int primary key not null auto_increment, caption varchar(20) not null ); # 创建老师表 create table teacher ( tid int primar…

    MySQL 2023年4月13日
    00
  • 碰到MySQL无法启动1067错误问题解决方法

    下面就是关于MySQL无法启动出现1067错误的解决方法的完整攻略: 1. 前置条件 在解决这个问题之前,请确保你已经完成以下前置条件: 确认正在使用的MySQL版本是5.7及以上版本。 确认你的操作系统是Windows。 2. 错误信息分析 MySQL无法启动出现1067错误,一般是由以下两种原因导致的: MySQL配置文件(config file)中的路…

    MySQL 2023年5月18日
    00
  • 详解MySQL的5种数据类型

    MySQL是一种开源的关系型数据库管理系统,数据库中的数据必须使用固定的数据类型进行定义和存储。MySQL中的数据类型主要可以分为数值型、日期型、字符串型、二进制型和空类型。 数值型 数值型是MySQL中最常用的数据类型,包括整型和浮点型两种,整型又分为TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT五种,浮点型包括FLOAT、DO…

    MySQL 2023年3月9日
    00
  • MySQL性能优化之table_cache配置参数浅析

    MySQL性能优化之table_cache配置参数浅析 什么是table_cache table_cache是MySQL配置文件中的一个参数,用于指定MySQL服务器缓存表定义对象(table definition object, TDO)的数量。TDO是一个表的元数据信息,例如表结构、索引等。MySQL服务器在访问一张表时会首先检查TDO是否已经被缓存,如…

    MySQL 2023年5月19日
    00
  • MySQL查看事件状态信息

    MySQL中的事件是一种与时间相关的对象,包括存储程序、存储函数和一些特殊事件,用于执行预定义的任务或策略。 在MySQL中查看事件状态信息,可以通过以下步骤实现: 1. 登录MySQL数据库: $ mysql -u root -p 2. 进入要查看状态信息的数据库: mysql> use yourdatabase; 3. 查看事件的状态信息: mys…

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