10 分组数据

10.1 创建分组

分组是在SELECT语句的GROUP BY子句中建立的。
例如:

SELECT vend_id, COUNT(*) AS num_prods
FROM Products
GROUP BY vend_id;

输出结果是这个样子:

上面的SELECT语句指定了两个列, vend_id包含产品供应商的ID, num_prods为计算字段(用COUNT(*)函数建立)。 GROUP BY子句指示MySQL按vend_id排序并分组数据。这导致对每个vend_id而不是整个表 计算num_prods一次。从输出中可以看到,供应商1001有3个产品,供应商 1002有2个产品,供应商1003有7个产品,而供应商1005有2个产品。
GROUP BY子句指示MySQL分组数据,然后对每个组而不是 整个结果集进行聚集。
注意:GROUP BY子句必须出现在WHERE子句之后, ORDER BY子句之前。

10.2 过滤分组

HAVING非常类似于WHERE。事实上,目前为止所学过的所有类型的WHERE子句都可以用HAVING来替代。唯一的差别是 WHERE过滤行,而HAVING过滤分组。

例如:

SELECT cust_id, count(*) AS orders
FROM Orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;

输出结果是:

这条SELECT语句的前3行类似于上面的语句。最后一行增加了 HAVING子句,它过滤COUNT(*) >=2(两个以上的订单)的那些分组。

HAVING和WHERE的差别 :
WHERE在数据分组前进行过滤, HAVING在数据分组后进行过滤。

看下面的例子:

SELECT cust_id, COUNT(*) AS num_prods
FROM Products
WHERE prod_price >= 10
GROUP BY vend_id
HAVING COUNT(*) >= 2;

输出结果:

WHERE子句过滤所有prod_price至少为10的 行。然后按vend_id分组数据, HAVING子句过滤计数为2或2以上的分组。如果没有WHERE子句,将会多检索出两行(供应商1002,销售的所有产品价格都在10以下;供应商1001,销售3个产品,但只有一个产品的价格大于等于10


10.3 分组和排序

一般在使用GROUP BY子句时,应该也给 ORDER BY子句。这是保证数据正确排序的唯一方法。千万不要仅依赖GROUP BY排序数据。
例如:

SELECT order_num, SUM(quantity * item_price ) AS ordertotal
FROM Ordertimes
GROUP BY order_num
HAVING SUM(quantity * item_price ) >= 50;

结果是:

为按总计订单价格排序输出,需要添加ORDER BY子句,如下所示:

SELECT order_num, SUM(quantity * item_price ) AS ordertotal
FROM Ordertimes
GROUP BY order_num
HAVING SUM(quantity * item_price ) >= 50
ORDER BY ordertotal;

输出结果是:

GROUP BY子句用来按订单号(order_num列) 分组数据,以便SUM(*)函数能够返回总计订单价格。 HAVING子句过滤数据,使得只返回总计订单价格大于等于50的订单。最后, 用ORDERBY子句排序输出。

 

10.4 SELECT子句顺序


下面回顾一下SELECT中子句的顺序:


SELECT子句及其顺序

 





 

posted @ 2018-12-21 10:05  小林子奋斗的点滴  阅读(248)  评论(0编辑  收藏  举报