1、创建分组
输入:
SELECT vend_id , COUNT(*) AS num_prods
FROM products
GROUP BY vend_id;
输出:
vend_id num_prods
1001 3
1002 7
分析:选定要显示的列:vend_id和num_prods(行数统计列的新建的别名),选定来源表:products,分组依据:根据vend_id进行排序并进行数据分组统计。GROUP BY子句必须出现在WHERE子句之前,ORDER BY子句之后。
2、过滤分组
使用HAVING关键字,语法和WHERE一致,只是过滤对象不同,一个是行,一个是组。值得注意的是,同时使用WHERE和HAVING关键字,WHERE关键字过滤掉的行,不会在HAVING关键字里进行统计分组。
输入:
SELECT cust_id,COUNT (*) AS orders
FROM orders
GROUP BY cust_id
HAVING COUNT(*) >=2;
输出:
cust_id orders
1001 2
分析:
输出两列:cust_is和orders(新建列的别名,所有行的数目,包括null行);
表源:cust_id;
分组过滤依据:按照cust_id列的每一行进行数据统计,并形成 cust_id-行数 的映射键值对,然后在根据cust_id列的顺序排序映射键值对;
过滤分组: cust_id-行数 映射对中 行数 大于等于2的映射对可以保留。
3、分组和排序区别
ORDER BY:
a、排序产生的输出。
b、任意列都可以使用(甚至非选择的列也可以使用)
c、非必须的。
GROUP BY:
a、对行进行分组,但输出可能不是分组的顺序。
b、只能使用选择列或表达式列,而且必须使用每个选择列表达式。
c、如果与聚集函数一起使用列(或表达式),则必须使用。
注:要保证排序一定要使用ORDER BY子句,不要依赖GROUP BY子句。
输入:
SELECT order_num,SUM(quantity*item_price) AS ordertotal
FROM orderitems
GROUP BY order_num
HAVING SUM(quantity*item_price)>=10;
输出:
order_num ordertotal
201 33.00
205 11.00
206 77.00
输入:
SELECT order_num,SUM(quantity*item_price) AS ordertotal
FROM orderitems
GROUP BY order_num
HAVING SUM(quantity*item_price)>=10
ORDER BY ordertotal;
输出:
order_num ordertotal
205 11.00
201 33.00
206 77.00
分析:上述演示了使用ORDER BY子句的差别。
4、SELECT语句中子句的顺序
子句 说明 是否必须使用
SELECT 要返回的列或表达式 是
FROM 从中检索数据的表 仅在从表选择数据时使用
WHERE 行级过滤 否
GROUP BY 分组说明 仅在按组计算聚集时使用
HAVING 组级过滤 否
ORDER BY 输出的排序顺序 否
LIMIT 要检索的行数 否