低版本的Mysql,group by限制性比较小,在进行group by时,select的对象可包含多个,但是换成高版本5.6以上好像,使用group by 以后,select的对象必须也已经被聚合,否则查询不出来数据,经百度资源,纳入解决方案如下:

查看sql_mode的值:

show variables like "sql_mode";

5.6版本的value值可能为:

value='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

修改value值:

set sql_mode='NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES';

相似文章,掘金:MySQL:为什么查询列表中多了它,GROUP BY语句就会报错呢?

Mysql数据库版本高低引起的group by问题

  • 事前准备(原文地址:https://juejin.im/post/5d64d704e51d45620b21c3f4)
  • GROUP BY是在干什么?
  • 报错

事前准备(原文地址:https://juejin.im/post/5d64d704e51d45620b21c3f4)

先得建一个表:

CREATE TABLE student_score (number INT(11) NOT NULL,name VARCHAR(30) NOT NULL,subject VARCHAR(30) NOT NULL,score TINYINT(4) DEFAULT NULL,PRIMARY KEY (number,subject)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

student_score,填充一些数据:

mysql> SELECT * FROM student_score;
+----------+-----------+-----------------------------+-------+
| number   | name      | subject                     | score |
+----------+-----------+-----------------------------+-------+
| 20180101 | 杜子腾    | 母猪的产后护理              |    78 |
| 20180101 | 杜子腾    | 论萨达姆的战争准备          |    88 |
| 20180102 | 杜琦燕    | 母猪的产后护理              |   100 |
| 20180102 | 杜琦燕    | 论萨达姆的战争准备          |    98 |
| 20180103 | 范统      | 母猪的产后护理              |    59 |
| 20180103 | 范统      | 论萨达姆的战争准备          |    61 |
| 20180104 | 史珍香    | 母猪的产后护理              |    55 |
| 20180104 | 史珍香    | 论萨达姆的战争准备          |    46 |
+----------+-----------+-----------------------------+-------+
8 rows in set (0.00 sec)

GROUP BY是在干什么?

MySQL提供了一系列的聚集函数,诸如:

  • COUNT:统计记录数。
  • MAX:查询某列的最大值。
  • MIN:查询某列的最小值。
  • SUM:某列数据的累加总和。
  • AVG:某列数据的平均数。

查看student_score表中所有人成绩的平均数:

mysql> SELECT AVG(score) FROM student_score;
+------------+
| AVG(score) |
+------------+
|    73.1250 |
+------------+
1 row in set (0.00 sec)

查看《母猪的产后护理》这个科目的平均成绩,加个WHERE:

mysql> SELECT AVG(score) FROM student_score WHERE subject = '母猪的产后护理';
+------------+
| AVG(score) |
+------------+
|    73.0000 |
+------------+
1 row in set (0.00 sec)

单独查看《论萨达姆的战争准备》这门课程的平均成绩:

mysql> SELECT AVG(score) FROM student_score WHERE subject = '论萨达姆的战争准备';
+------------+
| AVG(score) |
+------------+
|    73.2500 |
+------------+
1 row in set (0.00 sec)

这时候问题来了,如果这个student_score表中存储了20门科目的成绩信息,那我们怎么单独的得到这20门课程的平均成绩呢?单独写20个查询语句?那要是有100门课呢?
很显然,不能傻兮兮的写一百个语句,设计MySQL的大叔给我们提供了分组的概念。我们可以按照某个列将表中的数据进行分组,比方说我们现在按照subject列对表中数据进行分组,那么所有的记录就会被分成2组,如图所示:


让MySQL产生这样子的分组的语句就是GROUP BY子句,我们只要在GROUP BY后边把需要分组的列写上就好,然后在查询列表处就可以针对每一个分组来写相应的聚集函数去统计该分组,就像这样:

mysql> SELECT subject, AVG(score) FROM student_score GROUP BY subject;
+-----------------------------+------------+
| subject                     | AVG(score) |
+-----------------------------+------------+
| 母猪的产后护理              |    73.0000 |
| 论萨达姆的战争准备          |    73.2500 |
+-----------------------------+------------+
2 rows in set (0.00 sec)

报错

可以从上边带有GROUP BY子句的查询语句中看出来,我们只在查询列表处放了分组列subject以及对该分组中的记录调用的聚集函数AVG,那如果我们把不是分组列的字段也放到查询列表中会出现啥情况:

mysql> SELECT subject, name, AVG(score) FROM student_score GROUP BY subject;ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'dahaizi.student_score.name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_bymysql>

为啥会报错呢?回想一下我们使用GROUP BY子句的初衷,我们只是想把记录分为若干组,然后再对各个组分别调用聚集函数去做一些统计工作。本例中的查询列表处放置了既非分组列、又非聚集函数的name列,那我们想表达啥意思呢?从各个分组中的记录中取一个记录的name列?该取哪条记录为好呢?比方说对于’母猪的产后护理’这个分组中的记录来说,name列的值应该取杜子腾,还是杜琦燕,还是范统,还是史珍香呢?这个我们也不知道,所以把非分组列放到查询列表中会引起争议,导致结果不确定,所以设计MySQL的大叔才会为上述语句报错。
不过有的同学会说,假如分组后的某个分组的某个非分组列的值都一样,那我把该非分组列加入到查询列表中也没啥问题呀。比方说按照subject列进行分组后,假如在’母猪的产后护理’的分组中各条记录的name列的值都相同,在’论萨达姆的战争准备’的分组中各条记录的name列的值也都相同,那么我们把name列放在查询列表中也没啥问题。可能设计MySQL的大叔觉得这种说法也有点儿道理,他们竟然同意在一些情况下把非分组列也放到查询列表中,这就设计到一个称之为sql_mode的系统变量,我们先看一下在我的电脑上这个系统变量的值:

mysql> SHOW VARIABLES LIKE 'sql_mode';
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                                                                     |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| sql_mode      | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.02 sec)

只关心其中一个称之为ONLY_FULL_GROUP_BY的家伙。只要sql_mode的值里边有这个东东,MySQL服务器就“比较正常”(也就是不允许非分组列放到查询列表中),但是如果我们把这个东东从sql_mode系统变量中移除(移除这个东东只要重新设置一下这个系统变量,把这个东东从值里边去除掉就好):

mysql> set sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';Query OK, 0 rows affected (0.00 sec)

然后再执行上边那个曾经报错的语句:

mysql> SELECT subject, name, AVG(score) FROM student_score GROUP BY subject;
+-----------------------------+-----------+------------+
| subject                     | name      | AVG(score) |
+-----------------------------+-----------+------------+
| 母猪的产后护理              | 杜子腾    |    73.0000 |
| 论萨达姆的战争准备          | 杜子腾    |    73.2500 |
+-----------------------------+-----------+------------+
2 rows in set (0.00 sec)

这回就不会报错了。

小贴士:

不同MySQL版本中sql_mode的值可能默认包含ONLY_FULL_GROUP_BY这个家伙,也可能不包含ONLY_FULL_GROUP_BY这个家伙,也就是说不同MySQL版本中可能默认不支持查询列表中包含非分组列,也可能默认支持查询列表中包含非分组列。

Mysql数据库版本高低引起的group by问题相关推荐

  1. centos6.8自带mysql_CentOS6.8下MySQL数据库版本信息查看

    方法1:使用mysql -v命令查看: [root@yeebian mysql]# mysql -V mysql Ver 14.14 Distrib 5.1.73, for redhat-linux- ...

  2. 升级mysql数据库版本时,对应配置文件的一些变化

    之前一直使用mysql5.7版本进行项目数据库的链接使用,最近看一些了很多开源项目,发现很多项目的数据库都使用了mysql的最新版本,所以,这次对mysql版本进行升级,目前升级完的数据库版本为mys ...

  3. mysql @@version_查看mysql数据库版本方法总结

    当你接手某个mysql数据库管理时,首先你需要查看维护的mysql数据库版本:当开发人员问你mysql数据库版本时,而恰好你又遗忘了,那么此时也需要去查看mysql数据库的版本............ ...

  4. MySQL JDBC驱动版本与MySQL数据库版本对应关系

    前言:前段时间发现在家使用和公司一样的mysql jdbc驱动版本发生了异常,原因:家里mysql数据库版本与公司不一致导致.查询了相关资料,发现mysql jdbc驱动版本与mysql数据库版本有一 ...

  5. 怎么查mysql数据库版本信息查询_mysql 查询版本(mysql查询数据库版本信息)

    mysql 查询版本(mysql查询数据库版本信息) 2020-07-24 11:32:43 共10个回答 1.通过mysql的-V参数查询版本信息mysql-V2.登录mysql时可以查询版本信息m ...

  6. 查看mysql数据库版本_MySQL数据库之查看MySQL版本的四种方法

    本文主要向大家介绍了MySQL数据库之查看MySQL版本的四种方法 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 1.终端下直接使用mysql命令 [root@localhos ...

  7. mysql数据库版本不同_MySQL不同版本数据同步

    1.环境准备: 系统环境:CentOS Linux release 7.7.1908 (Core) MySQL环境: 172.16.6.140: Ver 5.0.96-community-log fo ...

  8. mysql数据库版本常用_推荐:经典版本常用MySQL的命令集锦_MySQL

    本文概括了网络上众多常用MySQL命令,讲述过程详细明了. 一.连接MySQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL. 首先在打开DOS窗口, ...

  9. 三种查看MySQL数据库版本的方法

    1.使用-V参数 首先我们想到的肯定就是查看版本号的参数命令,参数为-V(大写字母)或者--version 使用方法: D:\xampp\mysql\bin>mysql -V 或者 D:\xam ...

  10. 下载MySQL数据库版本对应的jar包

    ** MySQL数据库的官方网址 ** https://dev.mysql.com/downloads/ MySQL官方网址 选择Java的ODBC 选择MySQL的版本 platform indep ...

最新文章

  1. Python Module_oslo.vmware_连接 vCenter
  2. jquery实现加载更多效果
  3. vc2019切分位图图像带动态创建工具条
  4. Hadoop 2.x 完全分布式HA集群环境搭建
  5. 【Matlab】山地建模?立体热度?怎么绘制三维曲面图?
  6. [缓存]迅雷下载原理
  7. 方幂序列 c+~+_C ++编程中的Trigraph序列
  8. 在线考试系统需求分析
  9. python自定义事件event的含义_pyqt自定义事件学习出现问题
  10. 贝叶斯统计:概率思维的魔法
  11. 台式机连接蓝牙音响没声音 以及 声音延迟 问题解决
  12. 程序“媛”公号,越来越少了,这次推荐俩,轻拍!
  13. 用秩讨论线性方程组的解/三个平面的位置关系
  14. 全国计算机等级考试监考培训,全国计算机等级考试 (NCRE) 监考培训
  15. word2010中奇偶页不同页眉页脚设置
  16. 质量指标——什么是增量覆盖率?它有啥用途?
  17. 银行业务名词释义(未完善)
  18. 初识Node使用模板引擎实现Apach
  19. ug8.0更改计算机名,Ug8.0电脑名改了怎么处理
  20. vm进入bios设置的方法

热门文章

  1. python中面向对象编程简称为_Python-面向对象编程
  2. 国内手机市场寒风持续,华为与OV竞争将更激烈
  3. LeetCode.No5——最长回文子串
  4. 微软黑客马拉松@您,低代码风云再赛
  5. Unable to import maven project: See logs for details
  6. Java实训——学生信息管理系统
  7. Spring AOP中Introduction的使用
  8. Install Mysql MMM On Redhat6.3
  9. 有了这些好看的流程图模板,你也可以画出漂亮的流程图
  10. Google 开源项目风格指南学习笔记——C++篇