视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
mysql数据分组:过滤分组
2020-11-09 09:01:03 责编:小采
文档
 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;

输出:

【相关推荐】

  1. mysql数据分组和排序及SELECT子句顺序

  2. mysql数据分组:创建分组

下载本文
显示全文
专题