Group by函数

1.前言

在数据库操作中分组操作经常用到。本文就来聊一聊,数据库中分组函数GROUP BY ;

2.创建测试表

示例表

CREATE TABLE `group_by_test` (`id` INT ( 10 ) NOT NULL AUTO_INCREMENT COMMENT '自增ID',`field_one` VARCHAR ( 64 ) NOT NULL DEFAULT '' COMMENT '字段1',`field_two` VARCHAR ( 64 ) NOT NULL DEFAULT '' COMMENT '字段2',`field_three` VARCHAR ( 64 ) NOT NULL DEFAULT '' COMMENT '字段3',
PRIMARY KEY ( `id` ) USING BTREE
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = 'group by 函数测试表';

3.SELECT后允许跟非分组字段吗?

问题:这个SQL可以执行吗?

SELECTfield_one,field_two,field_three
FROMgroup_by_test
GROUP BY field_one

答案:执行以上SQL是需要有条件的 ;

mysql数据库的中有一个环境变量sql_mode,定义了mysql应该支持的sql语法,数据校验等!
如果ONLY_FULL_GROUP_BY启用了 SQL模式(默认情况下为SQL模式),则MySQL拒绝查询

MySQL官网中是这样介绍的:

简译:

  • 不允许选择列表,HAVING条件或ORDER BY列表引用未在GROUP BY子句中命名的未聚合列的查询;

综上所述:
如果在SELECT中的列,没有在GROUP BY中出现,若ONLY_FULL_GROUP_BY启用了 SQL模式那么将认为这个SQL是不合法的,

查看

查看当前连接会话的sql模式:
mysql> select @@session.sql_mode;
或者从环境变量里取
mysql> show variables like "sql_mode";
查看全局sql_mode设置:
mysql> select @@global.sql_mode;
只设置global,需要重新连接进来才会生效

**

sql_mode值与含义

ONLY_FULL_GROUP_BY 对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么将认为这个SQL是不合法的,因为列不在GROUP BY从句中
STRICT_TRANS_TABLES 在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做任何限制
NO_ZERO_IN_DATE 在严格模式,不接受月或日部分为0的日期。如果使用IGNORE选项,我们为类似的日期插入’0000-00-00’。在非严格模式,可以接受该日期,但会生成警告。
NO_ZERO_DATE 在严格模式,不要将 '0000-00-00’做为合法日期。你仍然可以用IGNORE选项插入零日期。在非严格模式,可以接受该日期,但会生成警告
ERROR_FOR_DIVISION_BY_ZERO 在严格模式,在INSERT或UPDATE过程中,如果被零除(或MOD(X,0)),则产生错误(否则为警告)。如果未给出该模式,被零除时MySQL返回NULL。如果用到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操作结果为NULL。
NO_AUTO_CREATE_USER 防止GRANT自动创建新用户,除非还指定了密码。
NO_ENGINE_SUBSTITUTION 如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常。

设置

形式如
mysql> set sql_mode='';
mysql> set global.sql_mode='NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES';
或者替换ONLY_FULL_GROUP_BY为''
set @@session.sql_mode=(select replace(@@session.sql_mode,'ONLY_FULL_GROUP_BY',''));

不启用ONLY_FULL_GROUP_BYSQL模式使用Group_by 数据是怎么获取的?

官方是这样解释的

简翻重点:服务器可以从每个组中自由选择任何值 ;

自己试验一下
模拟数据

INSERT INTO `group_by_test`
(`id`, `field_one`, `field_two`, `field_three`)
VALUES
(1, '1', '', '3-1'),
(2, '1', '2-2', '3-2'),
(3, '1', '2-3', '3-3'),
(4, '1', '', '3-4'),
(5, '1', '2-5', '');

模拟结果:非GROUP BY 子句列,默认取的第一行数据填充

关注程序员小强公众号更多编程趣事,知识心得与您分享

Group by函数相关推荐

  1. mysql+concat函数问题_Mysql5.7中使用group concat函数数据被截断的问题完美解决方法...

    前天在生产环境中遇到一个问题:使用 GROUP_CONCAT函数select出来的数据被截断了,最长长度不超过1024字节,开始还以为是navicat客户端自身对字段长度做了限制的问题.后面故意重新I ...

  2. mysql 聚集函数与group by,聚集函数可以和where一起用吗 聚合函数如何与group by函数一起使用...

    SQL中where语句能用聚合函数吗?聚合函数应该用在having子句中. 聚合函数如果想用在where中的话,应该只能用子查询来实现(在子查询中进行聚合函数计算,然后在主查询中进行where判断). ...

  3. max等聚合函数和group by搭配使用的注意事项

    1 group by的特点 1.1 定义 group_by的意思是根据by对数据按照哪个字段进行分组,或者是哪几个字段进行分组. 如果不在group by 后的分组中使用聚合函数,一般只会返回各个分组 ...

  4. powerquery分组_Power Query中的Table.Group函数详细分析

    在我们操作过程中,使用分组依据进行汇总计算的操作应该是非常的多的,我们对于这个函数还是非常有必要深入了解下. Table.Group 按为每行指定的列 key 中的值对 table 的行进行分组. 对 ...

  5. Oracle 聚合函数(Aggregate Functions)说明

    Oracle Aggregate Functions用过很多,官网的说明如下: Aggregate Functions http://docs.oracle.com/cd/E11882_01/serv ...

  6. SQL: ORA-00979 不是 GROUP BY 表达式 及 Group by 的用法说明

    参看资源: [1]https://www.cnblogs.com/vigarbuaa/archive/2012/06/25/2561225.html [2]关于group by的用法 原理 - 码农之 ...

  7. 《APUE》中的函数整理

    第1章 unix基础知识 1. char *strerror(int errnum) 该函数将errnum(就是errno值)映射为一个出错信息字符串,返回该字符串指针.声明在string.h文件中. ...

  8. mysql_group by与聚合函数、order by联合使用

    最近测试项目数据统计模块,发现自己对group by函数以及联合使用聚合函数的使用其实根本没理解透彻. 前半部分算自己对项目遇到情况的总结,大家可忽略,直接看后半部分关于group by的使用即可!! ...

  9. oracle 分析函数、GROUPING函数

    分析函数 over(Partition by...) 一个超级牛皮的ORACLE特有函数.天天都用ORACLE,用了快2年了.最近才接触到这个功能强大而灵活的函数.真实惭愧啊!oracle的分析函数o ...

最新文章

  1. 前端学习(2461):打包发布
  2. 2020年CSDN最后一波上车机会,快来~~
  3. cisco交换机命令大全(11)
  4. java上传音频的方法_将音频文件从文档目录上传到 iCloud
  5. GCC vector 叠加示例
  6. 汇编语言典型例子详解_单片机汇编语言经典一百例
  7. 最好用的UltraISO 9.5.3.2901中文完美注册破解版
  8. 哈理工OJ 1184 早起一水(水题)
  9. 找出01二维矩阵中只包含 1 的最大正方形,并输出其面积_java
  10. metrics类型 普罗米修斯_普罗米修斯 -- 快速构建你的业务监控平台
  11. Centos 7 内网安装 DzzOffice
  12. 什么是迭代计算机编程,什么是递归?什么是迭代?
  13. 基于单片机的四层电梯仿真设计(#0012)
  14. Java处理多个List集合中对象数据合并处理数据后为同一个List集合对象
  15. 波许教授的《最后一课》有感
  16. 浅谈幼儿园计算机论文,浅谈幼儿园科学教育活动中,计算机的辅助教学
  17. JavaScript 中 innerHTML 属性
  18. 小指数rsa 多线程版writeup
  19. 【单片机基础】C51语言基础
  20. 家用路由器AP模式设置

热门文章

  1. Cell 重磅丨不依赖泛素蛋白酶降解途径的新型 PROTAC - MedChemExpress
  2. 心胸有多大,成就有多大
  3. 2010 01 13 开博
  4. 基于Python的招聘信息的大数据可视化分析系统
  5. 第一篇博客(关于IT学习的初步想法)
  6. Backtrader系列教程③:指标篇
  7. [ CTF ] WriteUp- 20221003 CTFShow新(脑洞)手(套路)杯
  8. 孔子曰,中午不睡,下午崩溃;孟子曰,孔子说得对!
  9. Task 05 Python 爬虫入门
  10. 联通定制无线猫管理员账户密码(大连测试好用)