Mysql语法之分组数据
如何分组数据,以便能汇总表内容的子集。这涉及两个新SELECT语句子句,分别是GROUP BY子句和HAVING子句。
一、数据分组
分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算。
二、创建分组
分组是在SELECT语句的GROUP BY 子句中建立的。
来看例子理解:
mysql>select vend_id,COUNT(*) AS num_prods from products group by vend_id;
也就是不同的Id的商品总数都能分别查出来。
三、过滤分组
除了能用GROUP BY分组数据外,Mysql还允许过滤分组,规定包括哪些分组,排除哪些分组。
也就是HAVING子句。
HAVING非常类似于WHERE。事实上,目前为止所学过的所有类型的WHERE子句都可以用HAVING来替代。<u>唯一的差别是WHERE过滤行,而HAVING过滤分组。</u>
mysql>select cust_id,COUNT(/) AS orders from orders <u>GROUP BY</u> cust_id <u>HAVING</u> COUNT(/) >=2;
注意:这里HAVING换成WHERE是不管用的。HAVING针对于分组。
WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。
那么咱么看看怎么混合WHERE和HAVING。
mysql>select vend_id, COUNT(/) AS num_prods from products <u>where prod_price>=10 group by</u> vend_id HAVING COUNT(/) >=2;
四、分组和排序
不要忘记ORDER BY ,一般在使用GROUP BY 子句时,应该也给出ORDER BY 子句。这是保证数据正确排序的唯一方法。千万不要仅依赖GROUP BY排序数据。
mysql>select order_num,SUM(quantity*item_price) AS ordertotal
from orderitems
GROUP BY order_num
HAVING SUM(quantity*item_price) >=50
order by ordertotal;
五、SELECT子句顺序
子句 | 说明 | 是否必须使用 |
---|---|---|
SELECT | 要返回的列或表达式 | 是 |
FROM | 从中检索数据的表 | 仅在从表选择数据时使用 |
WHERE | 行级过滤 | 否 |
GROUP BY | 分组说明 | 仅在按组计算聚集时使用 |
HAVING | 组级过滤 | 否 |
ORDER BY | 输出排序顺序 | 否 |
LIMIT | 要检索的行数 | 否 |