MySQL入门-9:分组数据

时间:2014-07-08 09:42:22   收藏:0   阅读:351

大纲

1、创建分组

2、过滤分组

3、SELECT 子句顺序


分组允许把数据分为多个逻辑组,以便能对每个分组进行聚集计算。

1、创建分组

mysql> SELECT vend_id, COUNT(*) AS num_prods
    -> FROM products
    -> GROUP BY vend_id;
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
|    1001 |         3 |
|    1002 |         2 |
|    1003 |         7 |
|    1005 |         2 |
+---------+-----------+

GROUP BY子句指示MySQL分组数据,然后对每个分组而不是整个结果集进行聚集

 

在具体使用GROUP BY 子句前,需要知道一些重要的规定。

 

    构建查询时,Projection 子句的投影列表中的所有非聚集列还必须包含在 GROUP BY 子句中。具有 GROUP BY 子句的 SELECT 语句必须针对每一组返回一行。列示在 GROUP BY 后面的列能够在一组中只反映一个特异值,并且可以返回该值。但是,未列示在 GROUP BY 后面的列可在包含在组中的行中包含不同的值。

 

2、过滤分组 HAVING

    除了能用GROUP BY分组数据外,MySQL还允许过滤分组,规定包括哪些分组,排除哪些分组。基于完整的分组而不是个别的行进行过滤

    提到过滤,肯定想到WHERE子句。不过WHERE过滤指定的是"行"而不是"分组"。事实上,WHERE没有分组的概念。

    为此MySQL提供了另外一个子句,HAVING。HAVING 非常类似于WHERE 。唯一的差别是WHERE 过滤“行”,而HAVING 过滤“分组”。所有关于WHERE 的技术和选项都适用于HAVING,它们的句法是相同的,只是关键字不同而已。

HAVING支持所有WHERE操作符。


HAVING 和 WHERE 区别:

    WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。这是一个重要的区别,WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。WHERE是过滤行,而HAVING必须基于完整的分组过滤。(其他用法都相同) 

3、SELECT 子句顺序

SELECT
FROM
WHERE      -- 行级过滤
GROUP BY
HAVING     -- 组级过滤
ORDER BY
LIMIT


本文出自 “Share your knowledge” 博客,请务必保留此出处http://skypegnu1.blog.51cto.com/8991766/1435512

MySQL入门-9:分组数据,布布扣,bubuko.com

原文:http://skypegnu1.blog.51cto.com/8991766/1435512

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!