欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

mysql数据分组:过滤分组

程序员文章站 2022-05-17 13:04:34
...
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;

输出:

mysql数据分组:过滤分组

分析:这条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;

输出:

mysql数据分组:过滤分组

分析:这条语句中,第一行是使用了聚集函数的基本 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数据分组:过滤分组

【相关推荐】

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

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

以上就是mysql数据分组:过滤分组的详细内容,更多请关注其它相关文章!