Group by函数
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_BY
SQL模式使用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函数相关推荐
- mysql+concat函数问题_Mysql5.7中使用group concat函数数据被截断的问题完美解决方法...
前天在生产环境中遇到一个问题:使用 GROUP_CONCAT函数select出来的数据被截断了,最长长度不超过1024字节,开始还以为是navicat客户端自身对字段长度做了限制的问题.后面故意重新I ...
- mysql 聚集函数与group by,聚集函数可以和where一起用吗 聚合函数如何与group by函数一起使用...
SQL中where语句能用聚合函数吗?聚合函数应该用在having子句中. 聚合函数如果想用在where中的话,应该只能用子查询来实现(在子查询中进行聚合函数计算,然后在主查询中进行where判断). ...
- max等聚合函数和group by搭配使用的注意事项
1 group by的特点 1.1 定义 group_by的意思是根据by对数据按照哪个字段进行分组,或者是哪几个字段进行分组. 如果不在group by 后的分组中使用聚合函数,一般只会返回各个分组 ...
- powerquery分组_Power Query中的Table.Group函数详细分析
在我们操作过程中,使用分组依据进行汇总计算的操作应该是非常的多的,我们对于这个函数还是非常有必要深入了解下. Table.Group 按为每行指定的列 key 中的值对 table 的行进行分组. 对 ...
- Oracle 聚合函数(Aggregate Functions)说明
Oracle Aggregate Functions用过很多,官网的说明如下: Aggregate Functions http://docs.oracle.com/cd/E11882_01/serv ...
- SQL: ORA-00979 不是 GROUP BY 表达式 及 Group by 的用法说明
参看资源: [1]https://www.cnblogs.com/vigarbuaa/archive/2012/06/25/2561225.html [2]关于group by的用法 原理 - 码农之 ...
- 《APUE》中的函数整理
第1章 unix基础知识 1. char *strerror(int errnum) 该函数将errnum(就是errno值)映射为一个出错信息字符串,返回该字符串指针.声明在string.h文件中. ...
- mysql_group by与聚合函数、order by联合使用
最近测试项目数据统计模块,发现自己对group by函数以及联合使用聚合函数的使用其实根本没理解透彻. 前半部分算自己对项目遇到情况的总结,大家可忽略,直接看后半部分关于group by的使用即可!! ...
- oracle 分析函数、GROUPING函数
分析函数 over(Partition by...) 一个超级牛皮的ORACLE特有函数.天天都用ORACLE,用了快2年了.最近才接触到这个功能强大而灵活的函数.真实惭愧啊!oracle的分析函数o ...
最新文章
- 前端学习(2461):打包发布
- 2020年CSDN最后一波上车机会,快来~~
- cisco交换机命令大全(11)
- java上传音频的方法_将音频文件从文档目录上传到 iCloud
- GCC vector 叠加示例
- 汇编语言典型例子详解_单片机汇编语言经典一百例
- 最好用的UltraISO 9.5.3.2901中文完美注册破解版
- 哈理工OJ 1184 早起一水(水题)
- 找出01二维矩阵中只包含 1 的最大正方形,并输出其面积_java
- metrics类型 普罗米修斯_普罗米修斯 -- 快速构建你的业务监控平台
- Centos 7 内网安装 DzzOffice
- 什么是迭代计算机编程,什么是递归?什么是迭代?
- 基于单片机的四层电梯仿真设计(#0012)
- Java处理多个List集合中对象数据合并处理数据后为同一个List集合对象
- 波许教授的《最后一课》有感
- 浅谈幼儿园计算机论文,浅谈幼儿园科学教育活动中,计算机的辅助教学
- JavaScript 中 innerHTML 属性
- 小指数rsa 多线程版writeup
- 【单片机基础】C51语言基础
- 家用路由器AP模式设置