文章目录
本文还是函数,但是聚集函数很幸运,所有主要的SQL实现都给出了相当一致的支持,没有各自盛放。
聚集函数
强调的关键是:不用把实际数据返回,只需要汇总,统计出一些很关键的信息就行。
AVG():只用于单个列;忽略值为null的行
为null的行不参与计算,也不算到行数里
示例
所有产品的平均价格(prod_price的所有行都参与计算)
select avg(prod_price) as avg_price
from products;
avg_price是计算字段的别名
只计算供应商编号为DLL01的产品的平均价格,用where过滤出vend_id为DLL01的产品
select avg(prod_price) as avg_price
from products
where vend_id = "DLL01";
注意我专门尝试了一下双引号是否可以,答案是可以的
count()
示例
计算顾客表的行数,即顾客总数,包含有null值的行哦
select count(*) as num_cust
from customers;
select cust_email
from customers;
select count(cust_email) as num_cast
from customers;
max()
数值
select max(prod_price) as max_price
from products;
用于文本
select max(prod_name) as max_price
from products;
select prod_name
from products
order by prod_name;
min()
示例
数值
select min(prod_price) as min_price
from products;
select prod_price
from products
order by 1;
用于文本
select prod_name
from products
order by 1;
select min(prod_name) as min_name
from products;
sum()
示例
订单编号为20005的订单中数量列的总和,即求出这个订单总的物品数量之和
select sum(quantity) as items_ordered
from OrderItems
where order_num = 20005;
合计,计算订单中所有物品的总价
select sum(item_price*quantity) as total_price
from OrderItems
where order_num = 20005;
聚集不同值(DISTINCT参数,all参数)
之前用过distinct的,即如果所有行中有重复数值,比如有两个3,那计算的时候就只考虑一个
select avg(distinct prod_price) as avg_price
from products
where vend_id = 'DLL01';
下面两段代码等价,因为all是默认参数
select avg(all prod_price) as avg_price
from products
where vend_id = 'DLL01';
select avg(prod_price) as avg_price
from products
where vend_id = 'DLL01';
- 对max,min函数使用聚集参数distinct没有意义
- count(*)是计数所有行,当然不能用distinct,那就不是所有行了
- 其他情况只要指定列名就可以在count()中用distinct参数
组合聚集函数(更有用):select语句包含多个聚集函数
一条select语句执行了4个聚集计算
注意指定别名不要用表中的实际列名
select count(*) as num_items,
min(prod_price) as price_min,
max(prod_price) as price_max,
avg(prod_price) as price_avg
from products;
总结
- 可以用双引号
- 指定别名不要用表中的实际列名,可能导致错误
- SQL共支持五个聚集函数,他们很高效,比自己在客户端应用程序计算快得多。
- 聚集函数可以汇总数据,这样可以使我们不检索数据就获得最大值和最小值。