在实际中我们可能只是需要汇总数据而不是将它们检索出来,SQL
提供了专门的函数来使用。聚合函数aggregate function
具有特定的使用场景
max、min、mean、sum
等select
子句在是用的时候必须遵循的顺序是
包含空行
忽略空行
最后一行
第一行
聚合函数使用的格式为
select AVG/MIN/MAX(字段名) as other_name from table_name -- as后面表示用于显示的别名
select AVG(prod_price) as avg_price from Products where vend_id = 'DDL01'; -- 返回的是指定行DDL01的平均值
select count(cust_email) as num_cust from customers; -- 指定列cust_email
select max(prod_price) as max_price from Products;
select min(prod_price) as max_price from Products;
-- 顺序:select--->from--->order by--->where
select sum(item_price * quantity) as total_price -- 用于合计计算
from OrderItems
where order_num = 20005;
上面5个聚合函数的参数
all
,默认行为distinct
,必须指定列名select avg(distinct prod_price) as avg_price -- 将属性prod_price中相同的值去掉
from prorducts
where vend_id = 'DLL01';
as
后面跟的列名最好不是原表中已经存在的列名,避免歧义select count(*) as num_items, -- 同时使用多个聚合函数
min(prod_price) as price_min,
max(prod_price) as price_max,
avg(prod_price) as avg_price
from Products
where vend_id = 'DLL01';
使用分组可以将数据多个逻辑组,对每个组进行聚集计算。分组中使用最多的是group by
和having
看一个group by
的栗子
select vend_id, coutn(*) as num_prods -- 指定两个列
from Products
group by vend_id; -- 指定分组的字段:对每个vend_id进行计算
规定:
group by
中可以包含任意数目的列,可以进行嵌套group by
子句中列出的每一列都是检索列或者有效的表达式group by
在where
之后,order by
之前group by 2, 1
NULL
的行,将它们作为一个组返回除了能够
group by
进行分组,还可以进行过滤分组。规定包含哪些分组,排除哪些分组。having
应该结合group by
子句一起使用。
几乎所有的where
语句都可以用having
语句来代替。二者区别:
where
过滤的是行,在数据分组之前
进行过滤having
过滤的是分组,在数组分组之后
进行过滤select cust_id, count(*) as orders
from Orders
group by cust_id -- 先实现行分组
having count(*) >= 2; --在上面的结果基础上选取大于等于2的行
where和having同时使用
select vend_id, count(*) as num_prods -- 选择供应商,产品总数
from Products
where prod_price >= 4 -- 产品价格的条件
group by vend_id -- 通过供应商id来分组
having count(*) >= 2; -- 选择总数大于等于2
/*result
1. 显示的字段是select语句后面指定的
2. num_prods >= 2
3. 通过vend_id进行分组
*/
ven_id num_prods
------ --------
BRS01 3
FNG02 2
order by | group by |
---|---|
对产生的输出排序 | 对行进行分组,输出可能不是分组的顺序 |
任意列均可使用 | 只可能使用选择列或者列表达式,而且必须使用每个选择列表达式 |
句中未必需要 | 如果有聚集函数,必须使用 |
select order_num, count(*) as items
from OrderItems
group by order_num
having count(*) >= 3;
-- 按照订购物品的数目进行排序输出
select order_num, count(*) as items
from OrderItems
group by order_num
having count(*) >= 3 -- 过滤数据
order by items, order_num; -- 作用:对上面的结果按items(商品数目)排序输出;若数目相同,再按照order_num