主要学习GROUP BY子句和HAVING子句
1 数据分组
使用分组可以将数据分为多个逻辑组,对每个组进行聚集计算。
2 创建分组
SELECT vend_id , COUNT(*) AS num_prods FROM products GROUP BY vend_id
GROUP BY子句指示DBMS按 vend_id 排序并分组数据。这样就会对每个vend_id而不是整个表计算num_prods一次。
GROUP BY子句指示DBMS分组数据,然后对每个组而不是整个结果集进行聚集。
通过相对位置指定列
SELECT vend_id , COUNT(*) AS num_prods FROM products GROUP BY 1
3 过滤分组
目前为止所学过的所有类型的WHERE子句都可以用HAVING来替代。唯一的差别是,WHERE过滤行,而HAVING过滤分组。HAVING支持所有的WHERE操作符。WHERE在数据分组前进行过滤,HAVING在数据后进行过滤。
SELECT cust_id ,COUNT(*) AS orders FROM orders GROUP BY cust_id HAVING COUNT(*)>=2
例子:列出具有两个以上产品且其价格大于等于4的供应商:
SELECT vend_id,COUNT(*) AS num_prods FROM products WHERE prod_price >= 4 GROUP BY vend_id HAVING COUNT(*) >= 2
说明:使用HAVING和WHERE
HAVING与WHERE非常类似,如果不指定GROUP BY,则大多数DBMS会同等对待它们。不过,使用HAVING时应该结合GROUP BY子句,而WHERE子句用于标准的行级过滤。
4 分组和排序
一般在使用GROUP BY子句时,应该也给出ORDER BY子句。
例子:检索包含3个及以上物品的订单号和订购物品的数目:
SELECT order_num,COUNT(*) AS items FROM orderitems GROUP BY order_num HAVING COUNT(*) >=3
如果按订单物品的数量排序,需要添加ORDER BY子句,如下所示:
SELECT order_num,COUNT(*) AS items FROM orderitems GROUP BY order_num HAVING COUNT(*) >=3 ORDER BY items,order_num
group_order.png
ORDER BY子句还可以写成
ORDER BY COUNT(*),order_num
或者ORDER BY 2,1
分析:使用GROUP BY子句按订单号(order_num列)分组数据,以便COUNT(*)函数能够返回每个订单中的物品数目。HAVING子句过滤数据,使得只返回包含三个或更多物品的订单。最后,用ORDER BY子句排序输出。
5 SELECT子句顺序
列举目前所学的SELECT语句中使用时必须遵循的次序。
子句 | 说明 | 是否必须使用 |
---|---|---|
SELECT | 要返回的列或表达式 | 是 |
FROM | 从中检索数据的表 | 仅在从表选择数据时使用 |
WHERE | 行级过滤 | 否 |
GROUP BY | 分组说明 | 仅在按组计算聚集时使用 |
HAVING | 组级过滤 | 否 |
ORDER BY | 输出排序顺序 | 否 |
网友评论