当前位置: 代码网 > it编程>数据库>Mysql > MySQL报错Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre

MySQL报错Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre

2024年09月04日 Mysql 我要评论
解决mysql5.7版本之后使用group by语句时报错今天使用mysql简单的一句分组查询语句(group by)报错了。mysql> select * from tb group by e

解决mysql5.7版本之后使用group by语句时报错

今天使用mysql简单的一句分组查询语句(group by)报错了。

mysql> select * from tb group by empid;
error 1055 (42000): expression #2 of select list is not in group by clause and contains nonaggregated column 'db1.tb.sales' which is not functionally dependent on columns in group by clause; this is incompatible with sql_mode=only_full_group_by

查了问题原因和解决方法,成功解决。

问题原因

原因:

  • 使用group by 语句违背了sql_mode=only_full_group_by。
  • 因为mysql版本5.7之后默认的模式是only_full_group_by。

官网文档的原话:

说人话,大概意思就是说(使用google翻译):

拒绝选择列表、having 条件或 order by 列表引用非聚合列的查询,这些列既不在 group by 子句中命名,也不在功能上依赖于(唯一确定的)group by 列。

从 mysql 5.7.5 开始,默认 sql 模式包括 only_full_group_by。(在 5.7.5 之前,mysql 不检测函数依赖,并且默认不启用 only_full_group_by。有关 5.7.5 之前的行为的描述,请参阅 mysql 5.6 参考手册。)

标准 sql 的 mysql 扩展允许在 having 子句中引用选择列表中的别名表达式。 在 mysql 5.7.5 之前,启用 only_full_group_by 会禁用此扩展,因此需要使用非别名表达式编写 having 子句。 从 mysql 5.7.5 开始,此限制被取消,因此 having 子句可以引用别名,无论是否启用了 only_full_group_by。

解决方法

1、先使用sql查询sql_mode

select @@global.sql_mode

2、重新设置sql_mode,删除only_full_group_by

set @@global.sql_mode ='strict_trans_tables,no_zero_in_date,no_zero_date,error_for_division_by_zero,no_engine_substitution'

3、退出重进

# 退出
quit
# 再次登录(命令行模式)
mysql -u root -p

再次执行查询语句,

select * from tb group by empid;

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

  • nginx: [emerg] unknown directive报错误的问题

    前言今天修改nginx中的conf配置文件,由于自己没有备份,导致出问题,解决了两个小时都没有解决掉。不过遇到问题是好事,可以解决,如果有备份遇到问题也许不会一直去解决吧。但是,如…

    2024年09月04日 数据库
  • MySQL Prepared语句的具体使用

    在数据库应用中,很多sql语句都会重复执行很多次,每次执行可能只是where条件中的变量值不同,但mysql依然会解析sql语法并生成执行计划。对于这类情况,可以利用prepare…

    2024年09月04日 数据库
  • MySQL加减间隔时间函数DATE_ADD和DATE_SUB的实现

    MySQL加减间隔时间函数DATE_ADD和DATE_SUB的实现

    前言mysql中内置函数date_add 和 date_sub能对指定的时间进行增加或减少一个指定的时间间隔,返回的是一个日期。语法添加时间间隔date_add... [阅读全文]
  • MySQL虚拟列的具体使用

    MySQL虚拟列的具体使用

    在mysql中,虚拟列(也称为生成列)是一种特殊类型的表列,它不像普通列直接存储数据,而是根据其他列中的数据动态生成。虚拟列可以基于一个或多个其他列的值进行计算... [阅读全文]
  • mysql查询锁表的实现方法

    mysql查询锁表的实现方法

    今天在做数据更新的时候,发现表中数据量不大,但是更新语句执行很久都没成功,经过查询后发现是表锁死导致的,本文记录一下锁表解决步骤:1.查看表是否被锁(1)直接在... [阅读全文]
  • MySQL自连接与子查询方式

    MySQL自连接与子查询方式

    1. 自连接自连接是表自身与自身做笛卡尔积,在sql中进行条件查询,都是指定某一列或多个列之间进行关系运算,无法进行行与行之间的运算,在某些情况下需要对行与行之... [阅读全文]

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com