MySQL中使用group by 是总是出现1055的错误(推荐)

在MySQL中,使用GROUP BY是将数据集按照一个或多个列分组,计算每个组的总和、平均值、最大值、最小值等的基本方法。在使用GROUP BY的时候,有时会出现1055错误:Expression #L of SELECT list is not in GROUP BY clause and contains nonaggregated column X which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by。这个错误的原因是MySQL只允许在SELECT中出现在GROUP BY子句中的列,或者是使用聚合函数的列。这篇攻略将介绍如何解决这个问题并给出两个示例。

以前的方法

在以前,解决这个问题的方法是将sql_mode设置为非ONLY_FULL_GROUP_BY的模式,例如:

SET sql_mode = ''

这种方法的缺点是它可能会隐藏真正存在的问题,也可能导致错误的结果。因此,这不是一个推荐的方法。

怎么解决

相比之前的方法,推荐的方法是:

  1. 将需要在SELECT中呈现的非聚合列添加到GROUP BY子句中。
  2. 将需要在SELECT中呈现的非聚合列使用聚合函数进行转换。

下面分别介绍这两种方法。

方法1:添加非聚合列到GROUP BY子句中

这是比较常用的方法,直接将需要在SELECT中呈现的非聚合列添加到GROUP BY子句中。

例如,我们有这样一张表user:

user_id name age
1 Tom 20
2 Peter 25
3 Mary 22
4 John 28

如果我们想要按照name字段对数据进行分组:

SELECT name, age FROM user GROUP BY name;

这样会出现1055的错误。因为虽然我们把name列添加到了GROUP BY子句中,但是我们还需要把age列添加上去才可以。正确的SQL语句是:

SELECT name, age FROM user GROUP BY name, age;

方法2:使用聚合函数转换非聚合列

如果你不想使用GROUP BY来分组,而只是想要在SELECT语句中使用非聚合列,则可以使用聚合函数进行转换。

例如,我们仍然有这样一张表user:

user_id name age
1 Tom 20
2 Peter 25
3 Mary 22
4 John 28

如果我们想要输出所有用户的姓名以及他们的年龄的加总:

SELECT name, SUM(age) FROM user;

这样同样会出现1055的错误。因为age列没有被聚合函数包装。我们可以使用SUM函数将age列进行聚合,正确的SQL语句是:

SELECT name, SUM(age) FROM user GROUP BY name;

这样,我们就不会再遇到1055的错误了。

结论

为了解决MySQL中使用GROUP BY是总是出现1055的错误,我们可以使用添加非聚合列到GROUP BY子句中或者使用聚合函数转换非聚合列两种方法。尽管添加非聚合列到GROUP BY子句中更为常见,但是无论哪种方式都可以解决问题。因此,在实际使用中,可以根据需要进行选择。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL中使用group by 是总是出现1055的错误(推荐) - Python技术站

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

相关文章

  • MySQL唯一约束(UNIQUE KEY)详解

    MySQL的唯一约束是一种用于确保表中某一列的每个值都是唯一的约束。它可以应用于单个列或多个列,以确保每个组合值都是唯一的。 在MySQL中,可以使用UNIQUE关键字定义唯一约束。以下是使用唯一约束的语法: CREATE TABLE table_name ( column1 datatype UNIQUE, column2 datatype, … );…

    MySQL 2023年3月9日
    00
  • MySQL缓存的查询和清除命令使用详解

    MySQL缓存的查询和清除命令使用详解 什么是MySQL缓存 MySQL缓存是MySQL自带的一个查询缓存功能,可以缓存查询的语句和结果,提高查询效率。缓存的内容位于MySQL内存中,可以在MySQL服务器重启前一直保存。 查询MySQL缓存状态 可以使用以下命令查询MySQL缓存的状态: SHOW VARIABLES LIKE ‘%query_cache%…

    MySQL 2023年5月19日
    00
  • MySQL查询优化:连接查询排序浅谈

    MySQL查询优化:连接查询排序浅谈 本文将介绍MySQL连接查询和排序的优化方法,帮助读者针对大型数据表进行优化。 连接查询 连接查询是多个表连接起来查询数据的一种方式。但是,对于大型数据表而言,连接查询可能会造成性能问题,因为它需要对多个表进行扫描和匹配操作。以下是优化连接查询性能的一些方法: 1. 确保表都使用索引 在连接查询中,如果涉及到的表没有合适…

    MySQL 2023年5月19日
    00
  • 微信昵称带符号导致插入MySQL数据库时出错的解决方案

    下面是详细讲解“微信昵称带符号导致插入MySQL数据库时出错的解决方案”的完整攻略。 问题描述 当用户在微信中设置昵称时,有可能会使用到一些特殊符号,例如“#”、“@”等。如果这些特殊符号在插入MySQL数据库时没有被转义,就有可能导致SQL语句出错,影响数据的插入或查询。下面我们来看一下具体的情况。 假设我们有一个用户表,其中包含了用户的昵称信息。我们使用…

    MySQL 2023年5月18日
    00
  • 数据库系列:覆盖索引和规避回表

    1 介绍 在MySQL数据库查询过程中,索引覆盖和避免不必要的回表,是减少检索步骤,提高执行效率的有效手段。下面从这两个角度分析如何进行MySQL检索提效。 2 数据准备 模拟一个500w数据容量的部门表 emp,表结构如下,并通过工具模拟500w的数据: CREATE TABLE `emp` ( `id` int unsigned NOT NULL AUT…

    2023年4月8日
    00
  • 解决MySQL 5.7.9版本sql_mode=only_full_group_by问题

    当MySQL的版本为5.7.9及以上时,启动sql_mode为only_full_group_by时,可能会导致部分SQL语句执行异常。本攻略将会介绍如何解决这个问题。 问题描述 在MySQL 5.7.9及以上版本中,启动sql_mode为only_full_group_by时,如果有GROUP BY的SQL语句中包含非GROUP BY中的字段,MySQL会…

    MySQL 2023年5月18日
    00
  • 解决mysql创建数据库后出现:Access denied for user ‘root’@’%’ to database ‘xxx’的问题

    当在mysql中创建新的数据库时,有可能会遇到以下错误提示:Access denied for user ‘root’@’%’ to database ‘xxx’,意思是这个用户没有权限操作这个数据库。 要解决这个问题,可以尝试以下几个步骤: 首先尝试重置root用户的密码: mysql> SET PASSWORD FOR ‘root’@’%’=PAS…

    MySQL 2023年5月18日
    00
  • 通过node-mysql搭建Windows+Node.js+MySQL环境的教程

    以下是通过node-mysql搭建Windows+Node.js+MySQL环境的完整攻略: 准备工作 安装MySQL:首先从官网下载MySQL的安装文件,并根据提示进行安装。 安装Node.js:从Node.js官网下载对应平台的安装文件并安装。 创建示例项目 创建一个新的文件夹,并在此文件夹下创建一个package.json文件,用于记录项目中需要安装的…

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