mysql-数据分组
一、创建分组
上面所讲的语句都是建立在表的所有数据或匹配特定的where子句的数据上进行的。是否能够进行分组,在进行汇总计算哪儿?例如:要想返回每个供应商提供的产品数目怎么办?
分组是在select语句的group by子句中建立的,如下:
select vend_id,count(*) as num_prods from products group by vend_id;
上面语句使用group by子句对vend_id排序并分组数据,也就是按供应商编码进行分组,把相同的编码进行合并,并且求出其产品个数。
group by 子句指示mysql分组数据,然后对每个组而不是整个结果集进行聚集。
二、group by 注意事项
1、group by 子句可以包含任意数目的列。
2、如果在该子句中嵌套了分组,指定的所有列都一起进行计算。
3、该子句选中列出的每个列都必须是检索列或者有效的表达式(不能是聚集函数)。如果在select中使用表达式,则必须在group by 子句中指定相同的表达式,不能使用别名。
4、除聚集计算语句外,select语句中的每个列都必须在group by 子句中给出。
5、如果分组列中具有NULL,则NULL将作为一个分组返回。如果列中有多行NULL值,他们将分为一组。
6、group by 必须出现在where子句之后,order by子句之前。
其中rollup关键字的作用很明显,它可以显示出不进行分组所有产品个数(之前没进行分组的不显示)。如下:
select vend_id ,count(*) as num from products group by vend_id with rollup;
三、过滤分组
mysql还可以过滤分组,我们不能使用where子句,它仅仅是对行进行操作,而且在数据分组前进行过滤,不能多分组数据操作。
我们只能使用having子句,他能用来过滤分组。它在数据分组后进行过滤。
having支持所有的where操作符。如下:
select cust_id,count(*) as orders from orders group by cust_id having count(*)>=2;
以上语句描述的是找出两个以上订单的那些分组。
select vend_id,count(*) as num_prods from products where prod_price>=10 group by vend_id having count(*)>=2
以上语句表达的是列出具有2个以上、价格10以上的产品供应商。
*:聚集函数可以在select的检索中,可以在分组之后的having过滤中,但是不可以在where中;
四、分组和排序
group by 和 order by具有不同的用处

group by 每次并不是以分组的顺序输出,而order by却能提供顺序。
select order_num,sum(quantity*item_price) as ordertotal from orderitems group by order_num having sum(qquantity*itemprice)>=50;
以上并不排序,如果需要排序,需要在后面加上order by ordertotal
mysql-数据分组的更多相关文章
- MySQL数据分组Group By 和 Having
现有以下的学生信息表: 若果现在想计算每个班的平均年龄,使用where的操作如下: SELECT Cno AS 班级, AVG(Sage) AS 平均年龄 FROM stu ; 这样的话,有多少个班就 ...
- mysql数据分组
创建分组 分组是在SELECT语句中的GROUP BY 子句中建立的. 例: SELECT vend_id, COUNT(*) AS num_prods FROM products GROUP BY ...
- MySQL数据分组GROUP BY 和HAVING
对于分组的理解,可以这样:对GROUP BY子句后面跟随的列名进行分组,然后对每一个分组而不是整个表进行操作. 举例如下:在产品表中,检索每一个供应商提供的商品的数量. mysql> SELEC ...
- [mysql] Mysql数据分组GROUP BY 和HAVING,与WHERE组合使用
理解分组,可以这样:对GROUP BY子句后面跟随的列名进行分组,然后对每一个分组而不是整个表进行操作. 举例:在产品表中,检索每一个供应商提供的商品的数量. mysql> SELECT ven ...
- Mysql 数据分组取某字段值所有最大的记录行
需求: 表中同一个uid(用户)拥有多条游戏等级记录,现需要取所有用户最高等级(level)的那一条数据,且时间(time)越早排越前.这是典型的排名表 +------+-------+------- ...
- MySQL:基础—数据分组
MySQL:基础-数据分组 1.为什么要分组: 比如一个表中有多条订单记录,如上图,每条记录对应着一个商品,现在我要查询 每个商品被订购的单数 准备出货?也就是找到每个商品被订购的数量. 如果只找一个 ...
- MySQL 对分组后的同类数据进行拼接字符串
MySQL 对分组后的同类数据进行拼接字符串 写后台方法时遇到个问题,需要将表内同一订单号的操作记录流水进行简单拼接输出,不想取出来再操作,找了个mysql的方法直接操作 //group_concat ...
- MySQL聚合函数与数据分组
我们最常需要的是汇总数据而不是把他们实际检索出来 确定表中行数(或满足某个条件或包含某个特定值的行数) 确定表中行组的和 找出表列(或所有行或特定列)的最大值,最小值和平均值 聚集函数是运行在行组上, ...
- mysql 数据操作 单表查询 group by 分组 目录
mysql 数据操作 单表查询 group by 介绍 mysql 数据操作 单表查询 group by 聚合函数 mysql 数据操作 单表查询 group by 聚合函数 没有group by情况 ...
- MySQL 数据表操作
MySQL 数据表操作 创建MySQL数据表需要以下信息: -表名: -表字段名: -定义每个表字段: 一.创建数据表 1)mysql> create table table_name (c ...
随机推荐
- webpack实现模块化打包
webpack打包应用和实现 1)安装webpack $ npm install webpack webpack-cli --save-dev 2)添加配置文件 webpack.config.js 3 ...
- 【codeforces 794B】Cutting Carrot
[题目链接]:http://codeforces.com/contest/794/problem/B [题意] 给你一个等腰三角形; 它的底边为1; 高为h; 要求你把这个等腰三角形分成n份面积相等的 ...
- Nginx 项目部署和配置
nginx 作为代理服务器,需要代理多个项目的话配置如下: server { listen 80; server_name localhost; #charset koi8-r; #ac ...
- OpenCV特征点检測------Surf(特征点篇)
Surf(Speed Up Robust Feature) Surf算法的原理 ...
- Woody的Python学习笔记2
Python多行语句 Python语句中一般以新行作为语句的结束符.但我们能够使用斜杠(\)将一行的语句分为多行显示,例如以下所看到的: total = item_one+\ item_two + \ ...
- bzoj4823: [Cqoi2017]老C的方块(最小割)
4823: [Cqoi2017]老C的方块 题目:传送门 题解: 毒瘤题ORZ.... 太菜了看出来是最小割啥边都不会建...狂%大佬强强强 黑白染色?不!是四个色一起染,四层图跑最小割... 很 ...
- RSA in .net and dotnet core
dotnet RSAParameters Struct https://docs.microsoft.com/zh-cn/dotnet/api/system.security.cryptography ...
- m_Orchestrate learning system---二、如何实现验证码自动点击刷新
m_Orchestrate learning system---二.如何实现验证码自动点击刷新 一.总结 一句话总结:传过去的url带随机数来避免读取缓存 onclick="this.src ...
- DNS Tunnel判定方法
DNS Tunnel判定方法: 1.查询DNS请求的域名是否存在备案: 2.查询DNS请求的域名情报信息(以及域名的alex排名): 3.查看相同主域名下子域名编码格式及长度:(存在Base32和Ba ...
- xxx while the managed IDbConnection interface was being used: Login failed for user xxx
Process cube的时候遇到如下错误. Errors in the high-level relational engine. The following exception occurre ...