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

yizhihongxing

在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日

相关文章

  • tp框架报“mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead” 警告信息

    警告信息是“mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead……\ThinkPHP\Library\Think\Db\Driver\Mysql.class.php 第 52 行.”   …

    MySQL 2023年4月12日
    00
  • Mysql Row_Format 参数讲解

    今天更改数据引擎的时候,突然出现了 Table storage engine for ‘#sql-3e9_132’ doesn’t have this option 这样的提示: 通过搜索,发现了一些端倪,下面是对于Row_Format参数的讲解: 在MYSQL中, 若一张表里面不存在varchar、text以及其变形、blob以及其变形的字段的话,那么张这…

    MySQL 2023年4月16日
    00
  • Windows MySQL8.0安装出错解决方案(Start Server 失败)

    1、先删除之前安装出错的MySQL cmd—->切换到C:\Program Files\MySQL\MySQL Server 8.0\bin(mysql默认安装路径) 输入命令:mysqld –remove mysql 再输入命令:mysqld –remove mysql80   2、初始化设置 输入:mysqld –initialize-i…

    MySQL 2023年4月12日
    00
  • mysql 索引使用及优化详情

    MySQL 索引使用及优化详情 索引的作用 索引是一种数据结构,它可以帮助数据库系统快速地定位到需要的数据,从而提高查询性能。在 MySQL 中,索引主要分为以下两种: B-Tree 索引:基于 B-Tree 数据结构的索引,默认提供的索引类型,可以满足大部分查询需求。 Hash 索引:基于哈希表的索引,适用于相等比较查询,不支持部分匹配查询。 在实际应用中…

    MySQL 2023年5月19日
    00
  • 中国省市区数据mysql脚本

    2.查市 3.查区 4.Mysql脚本 /* Navicat MySQL Data Transfer Source Server : MySQL Source Server Version : 50022 Source Host : 127.0.0.1:3306 Source Database : xlj Target Server Type : MYSQL…

    MySQL 2023年4月13日
    00
  • 详解MySQL WHERE:条件查询数据

    MySQL WHERE模块用来筛选满足特定条件的数据。该模块常用于查询数据表中的数据,其中条件是用来限制要返回的数据的范围。 语法: SELECT column_name(s) FROM table_name WHERE condition; 其中,column_name(s) 是要查询的列名,可以使用 * 代替。table_name 是要查询的数据表名。c…

    MySQL 2023年3月10日
    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利用procedure analyse()函数优化表结构

    MySQL提供了procedure analyse()函数,可以用于优化表结构。它可以将表的数据类型、字符集、NULL值、默认值、注释等信息进行统计,帮助开发者了解表的特点以及基于这些信息优化表结构。 下面介绍如何利用procedure analyse()函数优化表结构,具体步骤如下: 执行procedure analyse()函数 SELECT * FRO…

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