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的事务和视图

                    事务 1.概念 一条或者多条sql语句的集合! 事务:就是一堆操作的集合,他们同生共死。要么都执行成功,要么都执行失败2.事务的特性  ACID  A:原子性  完整的,不可分割的   原子性 (Atomicity):在事务中的操作,要么都执行,要么都不执行!   C: 一致性  事务执行完毕后,数据的状态是一致的()   一…

    MySQL 2023年4月12日
    00
  • Mysql/MariaDB启动时处于进度条状态导致启动失败的原因及解决办法

    Mysql/MariaDB启动时,经常会发生进度条卡顿或进度条停滞的情况,导致启动失败。造成这种情况的原因有很多,但是最常见的原因是数据库在启动时需要执行一些复杂的恢复操作或者清理操作,这些操作可能需要很长时间才能完成。下面是一些原因及其解决方法: 原因一:数据库日志文件过大 如果你的数据库日志文件过大,并且在你之前的一次关闭时没有被删除或清除,那么在启动时…

    MySQL 2023年5月18日
    00
  • Linux(CentOS7)安装与卸载MySQL8.0图文详解

    Mysql数据库的安装对于开发者来说,是我们必然会面对的问题,它的安装过程其实并不复杂,并且网络上的安装教程也非常多,但是对于新手来说,各种不同形式的安装教程,又给新手们带来了要选择哪种方式进行安装的难题,而且很多时候按照教程也没有能够安装成功,安装过程出现各种各样的错误。 下面记录了我在Linux(Centos 7)环境下安装Mysql的完整过程,实操记录…

    MySQL 2023年4月25日
    00
  • 分布式编译系统的搭建

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。 作者:dan 文章来源:GreatSQL社区原创 由于MySQL 源码编译单机耗费的时间过于长,最近MySQL 变成8.0.27 以后编译时间明显更耗时了,并且办公室内有多余的空闲机器。 使用分布式编译,可以在不…

    MySQL 2023年4月27日
    00
  • Centos5.5中安装Mysql5.5过程分享

    下面是“Centos5.5中安装Mysql5.5过程分享”的完整攻略: 1. 准备工作 在安装Mysql5.5之前,需要做以下准备工作: 确认Centos5.5系统已经安装并且运行正常; 确认系统已经安装了GCC和相关的库文件; 确认系统已经安装了Perl和相关的模块; 2. 安装MySQL 首先下载MySQL安装包,并将其解压: wget http://d…

    MySQL 2023年5月18日
    00
  • MySQL数据库:聚合函数的使用

    聚合函数 max() 最大值min() 最小值avg() 平均值sum() 求和count() 符合条件数据的数目 聚合函数不能嵌套使用 # 在统计时字段内没有满足条件的数值只有count返回数值0或者其他,而其余四个聚合函数返回null; # 对于聚合函数的参数,很多时候使用字段名来表示,那么这个时候,该字段内的null值不参与统计 count(*) 显示…

    MySQL 2023年4月13日
    00
  • Mysql中行转列和列转行

    一、行转列 即将原本同一列下多行的不同内容作为多个字段,输出对应内容。 建表语句 DROP TABLE IF EXISTS tb_score; CREATE TABLE tb_score(    id INT(11) NOT NULL auto_increment,    userid VARCHAR(20) NOT NULL COMMENT ‘用户id’,…

    MySQL 2023年4月13日
    00
  • mysql插入记录INSERT与多表更新

    1、第一种:INSERT [INTO] tbl_name[ (col_name, … ) ]  {VALUES | VALUE}({expr |default}, … ), (…), … 如果为自动编号的字段赋值的话,可以采用NULL或者DEFAULT让其采用默认的递增的形式来实现。 INSERT users VALUES(DEFAULT, …

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