mysql数据分组:过滤分组
除了能用group by分组数据外,MySQL还允许过滤分组,规定包括哪些分组,排除哪些分组。例如,可能想要列出至少有两个订单的所有顾客。为得出这种数据,必须基于完整的分组而不是个别的进行过滤。
我们已经看到了where子句的作用。但是,在这个例子中where不能完成任务,因为where过滤指定的是行而不是分组。事实上,where没有分组概念。
那么,不使用where使用什么呢?MySQL为此目的提供了另外的子句,那就是having子句。having非常类似于where。事实上,目前为止所学过的所有类型的where子句都可以用having来替代。唯一的差别是where过滤行,而having过滤分组。
注意:having支持所有的where操作符。
那么,怎么过滤分组呢?请看下面的例子:
输入:
select cust_id,count(*) as orders from orders group by cust_id having count(*) >= 2;
输出:
分析:这条select语句的前3行类似于上面的语句。最后一行增加了having子句,它过滤count(*>)>=2(两个以上的订单)的那些分组。
正如所见,这里where子句不起作用,因为过滤是基于分组聚集值而不是特定行值的。
having和where的差别:这里有另一种理解方法,where在数据分组前进行过滤,having在数据分组后进行过滤。这是一个重要的区别,where排除的行不包括在分组中。这可能会改变计算值,从而影响having子句中基于这些值过滤掉的分组。
那么,有没有在一条语句中同时使用where和having子句的需要呢?事实上,确实有。假如想进一步过滤上面的语句,使它返回过去12个月内具有两个以上的顾客。为达到这一点,可增加一条where子句,过滤出去12个月内下过的订单。然后再增加having子句过滤出具有两个以上订单的分组。
为更好的理解,请看下面的例子,它列出具有2个(含)以上、价格为10(含)以上的产品供应商:
输入:
select vend_id,count(*) as num_prods from products where prod_price >= 10 group by vend_id having count(*) >=2;
输出:
分析:这条语句中,第一行是使用了聚集函数的基本 SELECT ,它与前面的例子很相像。 WHERE 子句过滤所有 prod_price 至少为 10 的行。然后按 vend_id 分组数据, HAVING 子句过滤计数为 2 或 2 以上的分组。
如果没有 WHERE 子句,将会多检索出两行(供应商 1002 ,销售的所有产品价格都在 10 以下;供应商 1001 ,销售3个产品,但只有一个产品的价格大于等于 10 ):
输入:select vend_id,count(*) as num_prods from products group by vend_id having count(*) >=2;
输出:
【相关推荐】
以上就是mysql数据分组:过滤分组的详细内容,更多请关注其它相关文章!
上一篇: PHP读取txt文件的内容并赋值给数组的代码_php技巧
下一篇: PHP 类属性问题
推荐阅读
-
sql获取分组排序后数据的脚本
-
mysql下按某一字段分组取最大(小)值所在行的数据的技巧分享
-
MySQL单表查询操作实例详解【语法、约束、分组、聚合、过滤、排序等】
-
MySQL group by对单字分组序和多字段分组的方法讲解
-
tp框架如何处理mysql先排序在分组
-
Mysql数据库实现多字段过滤的方法
-
MySQL数据库Group by分组之后再统计数目Count(*)与不分组直接统计数目的区别
-
解决大于5.7版本mysql的分组报错Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated
-
数据库SQL实战:从titles表获取按照title进行分组,注意对于重复的emp_no进行忽略(题解)
-
大数据-Hadoop生态(18)-MapReduce框架原理-WritableComparable排序和GroupingComparator分组