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

yizhihongxing

这个报错是由于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常见的错误提示问题处理小结

    MySQL常见错误提示问题处理小结 在使用MySQL数据库时,我们可能会遇到以下几种常见的错误提示: Access denied for user ‘root’@’localhost’ (using password: YES) Table ‘mydatabase.mytable’ doesn’t exist 下面分别对这两个错误进行详细讲解和处理方法。 A…

    MySQL 2023年5月18日
    00
  • 如何使用myisamchk和mysqlcheck工具快速修复损坏的MySQL数据库文件

    修复MySQL数据库文件是数据库维护的一个重要工作,常用的修复工具包括myisamchk和mysqlcheck。本文将介绍如何使用这两款工具操作MySQL数据库文件的修复过程。 1. 使用myisamchk修复MySQL数据库文件 myisamchk是一个MySQL的命令行工具,用于修复和检查MyISAM表。该工具可以删除损坏的记录、重建索引、删除没用的索引…

    MySQL 2023年5月18日
    00
  • mysql中,创建包含json数据类型的表?创建json表时候的注意事项?查询json字段中某个key的值?

    需求描述:   在mysql数据库中,创建包含json数据类型的表.记录下,在创建的过程中,需要注意的问题. 操作过程: 1.通过以下的语句,创建包含json数据类型的表 mysql> create table tab_json(id bigint not null auto_increment,data json,primary key(id)); …

    MySQL 2023年4月13日
    00
  • 2023云数据库技术沙龙MySQL x ClickHouse专场成功举办

    4月22日,2023首届云数据库技术沙龙 MySQL x ClickHouse 专场,在杭州市海智中心成功举办。本次沙龙由玖章算术、菜根发展、良仓太炎共创联合主办。围绕“技术进化,让数据更智能”为主题,汇聚字节跳动、阿里云、玖章算术、华为云、腾讯云、百度的6位数据库领域专家,深入 MySQL x ClickHouse 的实践经验和技术趋势,结合企业级的真实场…

    MySQL 2023年4月25日
    00
  • Mysql 存储过程

    MySQL 存储过程是从 MySQL 5.0 开始逐渐增加新的功能。存储过程在实际应用中也是优点大于缺点。不过最主要的还是执行效率和SQL 代码封装。特别是 SQL 代码封装功能,如果没有存储过程。 在外部程序访问数据库时(例如 PHP),要组织很多 SQL 语句。 特别是业务逻辑复杂的时候,一大堆的 SQL 和条件夹杂在 PHP 代码中,让人不寒而栗。现在…

    MySQL 2023年4月16日
    00
  • MySQL怎么过滤重复数据

    本篇内容主要讲解“MySQL怎么过滤重复数据”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL怎么过滤重复数据”吧! 方法1:加关键字 DISTINCT 在mysql中,可以利用“SELECT”语句和“DISTINCT”关键字来进行去重查询,过滤掉重复的数据,语法“SELECT DISTINCT 字段名 F…

    MySQL 2023年4月16日
    00
  • 解析mysql 5.5字符集问题

    解析 MySQL 5.5 字符集问题的攻略包含以下步骤: 步骤一:确认 MySQL 5.5 字符集问题存在 在使用 MySQL 5.5 版本时,有时候会遇到字符集的问题,例如在插入中文到数据表中时,可能会出现乱码或者指定字符集无效等情况。因此,首先需要确认是否存在字符集问题。 可以通过以下命令来查看 MySQL 编码设置: show variables li…

    MySQL 2023年5月18日
    00
  • MySQL深分页问题解决的实战记录

    MySQL深分页问题解决的实战记录 问题描述 MySQL在处理大量数据时,可能会遇到深分页问题。深分页指的是,当使用LIMIT进行分页时,如果要访问的数据量较大(如上百万条记录),这将会导致MySQL需要扫描大量的记录,从而导致查询速度变慢,更容易造成内存和CPU的浪费。在此情况下,需要解决MySQL的深分页问题。 问题解决方案 方案1:使用游标(curso…

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