当前位置:首页 > 数据库 > 关于mysql group by 用法总结

关于mysql group by 用法总结

2022年09月17日 13:36:08数据库10

group by 用法

select 聚合函数(分组字段) from table group by table.id having ……

当sql语句中包含group by 时,select后的字段只能是聚合函数或者group by 后面的分组字段。如果需要条件筛选,则写在having 后面。

聚合函数: sql语言中一种特殊的函数,包括SUM, COUNT, MAX, MIN, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。

问题描述

笔者为java后台开发人员,项目中使用springboot+mybatis,在接口和mapper开发结束后,项目能够正常运行。这时候需要将项目部署到linux服务器上。于是利用docker启动了mysql服务,然后在前后台项目都部署结束后,发现前端请求后台时报500错误。然后切换到本地环境又一切正常,于是就进入了懵逼状态。

问题分析

将本地项目的数据库修改为远程数据库后,打出报错信息,是一句sql语句执行报错。

而报错信息就是在select中使用了非聚合函数。于是猜想,是不是本地mysql版本过低,验证不严格。

于是查看mysql 版本信息 :
select version();

本地mysql 与远程mysql同为mysql5.7的不同子版本,相差不大。

查询资料发现,两种数据库的验证规则不一样。

但是如果现在把sql语句的所有查询字段,全部加上max()聚合函数又觉得太麻烦。于是采用了修改验证规则的方式。

解决措施

关于mysql的group by 必须使用聚合函数是数据库的一种验证方式,可以进行设置。

select @@global.sql_mode;

通过上面语句可以查出所有验证规则。具体参见链接

  • ONLY_FULL_GROUP_BY
    对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中。

  • NO_AUTO_VALUE_ON_ZERO
    该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户希望插入的值为0,该列又是自增长的,那么这个选项就有用了。

  • STRICT_TRANS_TABLES
    在该模式下,如果一个值不能插入到一个事物表中,则中断当前的操作,对非事物表不做限制

  • NO_ZERO_IN_DATE
    在严格模式下,不允许日期和月份为零

  • NO_ZERO_DATE
    设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告。

  • ERROR_FOR_DIVISION_BY_ZERO
    在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如 果未给出该模式,那么数据被零除时MySQL返回NULL

  • NO_AUTO_CREATE_USER
    禁止GRANT创建密码为空的用户

  • NO_ENGINE_SUBSTITUTION
    如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常

  • PIPES_AS_CONCAT
    将”||”视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似

  • ANSI_QUOTES
    启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符


所以只需要取消掉ONLY_FULL_GROUP_BY 设置即可。

set @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

sql_mode有全局与会话之分:

  全局:

  select|set @@GLOBAL.sql_mode;

  会话:

  select|set @@SESSION.sql_mode;

作者:Jaylen_liu
来源链接:https://blog.csdn.net/qq_25610165/article/details/81390716

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/database/42625.html

标签: group by
分享给朋友:

“关于mysql group by 用法总结” 的相关文章

mysql查询语句 groupby后取组内时间最近的一条数据时间

mysql查询语句 groupby后取组内时间最近的一条数据时间

在mysql中使用group by进行分组后取时间最近的一条数据,我们可以直接使用MAX()函数来实现 SELECT T2.nick_name as nickName, count(T1.shared_user_id) AS...

MySQL中 (GROUP BY 用法)和(ORDER BY用法)

MySQL中 (GROUP BY 用法)和(ORDER BY用法)

一、GROUP BY(分组) 例子: SELECT sum(id) as aa_id, max(id) as m_id, message FROM device_shadow_log GROUP BY message ORDER BY aa_id DESC 1...

mysql group by 用法解析(详细) + mysql distinct 去重

这篇文章写的很好。 转自:http://blog.tianya.cn/blogger/post_read.asp?BlogID=4221189&PostID=47881614   在使用mysql时,有时需要查询出某个字段不重复的记录,虽然my...

group by分组筛选

我们在MySQL做查询时,经常需要用到 group by 分组来筛选查询 相信做后端的朋友应该遇到过,有时候需要对分组的结果再进行过滤,这时候where用不了,那么该如何解决呢? 解决方法: 用 having 处理,即having后面接筛选的条件,写法的wher...

mysql group by 用法解析(详细)

group by 用法解析 group by语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。 SELECT子句中的列名必须为分组列或列函数。列函数对于GROUP BY子句定义的每个组各返回一个结果。 某个员工信息表结构和数据如下:   i...

oracle group by执行慢,一次对group by时间导致的慢查询的优化

oracle group by执行慢,一次对group by时间导致的慢查询的优化

前言: 最近在测试环境中点击一个图表展示页面时,半天才得到后台响应的数据进行页面渲染展示,后台的响应很慢,这样极大的降低了用户的体验; 发现这个问题后马上进行了排查 ,通过排查发现是由一个查询很慢的 group by 语句导致的; 本文...

MySQL5.7.5及以上执行group by报错

MySQL5.7.5及以上执行group by报错

MySQL执行报错: [Err] 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'cerebrum_sit.s.id' wh...

MySQL GROUP BY 语句使用总结

MySQL GROUP BY 语句使用总结

MySQL GROUP BY 语句使用总结 大家好,我是Yangrl. 总结一下MySQL中查询记录操作中的GROUP BY语句,查遗补漏。 表名:testusers,字段记录如图,以前create的直接拿来用,将就一下。(懒即生产力)...

mysql8.0遇到的一个坑(group by 分组 sql语句的用法)

使用 sql 查询时 mysql 报如下错误, 完整报错如下: ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated col...

mysql通过group by分组取最大时间对应的数据,提供两种有效方法。

mysql通过group by分组取最大时间对应的数据,提供两种有效方法。

1、项目记录表project_record的结构和数据如下: 以下为项目记录表project_record的所有数据。project_id为项目Id,on_project_time为上项目时间。(每一条数据代表着上某个项目(project_id)的时间(on_pro...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。