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子句及其顺序
来源:https://www.cnblogs.com/xlzfdddd/p/10154041.html