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 ...
随机推荐
- tp 在Nginx上各种404
对于ThinkPHP的URL访问路劲如:http://域名/index.php/Index/BlogTest/read,原先的Nginx的是不支持的pathinfo路劲的,导致你在thinkPHP5上 ...
- 关于VMNet1、VMNet8、
关于vmnet1~~~~~vmnet8 2008年04月11日 星期五 23:18 先说vmnet0,实际上就是一个虚拟的网桥,这个网桥有很若干个端口,一个端口用于连接你的Host,一个端口用于连接你 ...
- [CSS3] Image Width with sizes (srcset & sizes)
What if the image won't be displayed at the full viewport width? Then you need something more than s ...
- webserver的作用!
常见的webserver:Apache和Nginx(linux平台) IIS(window平台) 非常多小公司小项目眼下不一定使用了webserver,由于流量下,单台应用server能够支撑. 实际 ...
- nyoj--586--疯牛(二分&&枚举)
疯牛 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间 ...
- CxImage的使用及基本用法
基本定义:CxImage类库是一个优秀的图像操作类库.它可以快捷地存取.显示.转换各种图像. 下载地址:http://www.codeproject.com/KB/graphics/cximage.a ...
- BOOL的getter方法
在代码中经常会看到这样的属性声明 @property (nonatomic,assign,getter = isRead)BOOL read; 这行代码的意思就是,声明一个BOOL类型的read,但是 ...
- BZOJ 3339 线段树
思路: 考虑离线处理 显然 l固定时 r越大 ans越大 那我们不妨按照l从小到大排序 l->l+1的时候 l到next[l]这段区间都跟a[l]取min就好了 搞颗线段树维护一下 //By S ...
- 在Jquery里格式化Date日期时间数据
在Jquery里格式化Date日期时间数据: $(function(){ //当前时间格式化yyyy-MM-dd HH:mm:ss alert(timeStamp2String(new Date(). ...
- Android View 上下左右四种间距的设置方法
RecyclerView控件大家肯定不陌生,已经应用有一段时间了,最近在项目中写一个GridLayout样式的RecyclerView时需要设置,item之间左右的间距,下面是我总结的一个设置间距的方 ...