SQL | 汇总数据

9-汇总数据

9.1-聚集函数

在实际开发过程中,可能会遇到下面这些情况:

  • 确定大于某个值的有多少行数据,比如游戏排行榜,查询玩家排行多少名。

  • 获取表中某些行的和,比如双十一当天,某个用户总订单价格是多少元。

  • 获取表中最大值,最小值,平均值。

上述这些例子只需要返回统计后的数值,而不需要返回所有数值,然后在进行统计,这么做节省了时间,提高了效率。

为了方便做类似上述例子的操作,SQL给出了五个函数。

 

9.1.1 avg()函数

avg()函数的执行过程:先对表中行数进行计算,然后求得某列的和,最后求取平均值。

例如:返回products表中的平均价格

select avg(prod_price) as avg_price
from products;

avg()也可以结合WHERE子句来确定特定的列或者行的平均值。

select avg(prod_price) as avg_price
from products
where vend_id = 'DLL01';

 

上述SQL语句是仅过滤供应商为‘DLL01’的产品的价格的平均值。

只用于单个列 AVG()只能用来确定特定数值列的平均值,而且列名必须作为函数参数给出。为了获得多个列的平均值,必须使用多个AVG()函数。

注意:avg函数会忽略列值为NULL的行。

9.1.2 count()函数

count()函数是用来计数的。可利用count()确定表中行的数目或者符合规定的行的数目。

  • 使用count(*) 对表中行的数目进行计数,不管表列中包含的是空值NULL还是非空值。

  • 使用count(column)对特定列中具有值的行进行计数。忽略NULL值。

select count(*) as num_cust
from customers;

 

上述SQL语句查询customers表中的顾客总数。count(*)对所有具有值的行进行计数,计算得到的值在num_cust中返回。

select count(cust_email) as num_cust
from customers;

 

上述SQL语句用于统计顾客表中拥有邮箱的顾客有多少,主动忽略了NULL值。

NULL值 如果指定列名,则COUNT()函数会忽略指定列的值为NULL的行,但如果COUNT()函数中用的是星号(*),则不忽略。

9.1.3 max()函数

max()函数返回指定列中的最大值。max()函数要指定列名。

select max(prod_price) as max_price
from products;

 

上述SQL语句是查询产品列表中价格最高的产品。

max()函数一般用来找出最大的数值或者日期,但是有许多DBMS允许它返回任意列中的最大值,包括返回文本列中的最大值。当max()函数用于返回文本最大值时,返回按该列排序的最后一行。

max()函数忽略值为NULL的行。

9.1.4 min()函数

与max()函数相反,min()函数返回指定列的最小值。min()函数要求指定列名。

select min(prod_price) as min_price
from products;

 

min()函数一般用来找出最小的数值或者日期,但是有许多DBMS允许它返回任意列中的最小值,包括返回文本列中的最小值。当min()函数用于返回文本最小值时,返回按该列排序的最前面的行。

min()函数忽略NULL值所在的行。

9.1.5 sum()函数

sum()函数用来返回指定列值的总和。

例如:orderitems表中包含订单中实际的物品,每个物品有相应的数量,由此计算所订购的物品的总数。

select sum(quantity) as items_ordered
from orderitems
where order_num = 20005;

 

上述SQL语句用于返回总的物品数量,一共是200个。

函数SUM(quantity)返回订单中所有物品数量之和,WHERE子句保证只统计某个物品订单中的物品。

sum()也可以用来合计计算值。

select sum(item_price*quantity) as total_price
from orderitems
where order_num = 20005;

 

上述SQL语句计算所有符合条件的价值的总和。

sum()函数忽略列值为NULL的行。

9.2-聚集不同值

上述五种聚集函数都可以按照下面的方式使用:

  • 对所有行执行计算,指定all参数或不指定参数(因为all是默认行为)。

  • 只包含不同的值,指定distinct

注意:all参数不需要指定,它是默认行为。如果不指定distinct,则假定为all。

下面举例说明指定distinct参数,而不使用默认参数。

select avg(distinct prod_price) as avg_price
from products
where vend_id = 'DLL01';

 

因为使用了distinct参数,所以计算平均值的时候自动忽略相同的价格去计算平均值。但是计算后高于上面我们计算的平均价格,这是因为数量虽然少了,但是价格低的物品数量也少了。

另外,distinct不能用于count(*),但是可以用于指定列名的count(),也就是说:如果想要使用distinct,就必须指定列名。

distinct可以用于min()和max(),但是毫无意义,因为只有一行。

9.3-组合聚集函数

select语句可以根据需要选择多个聚合函数。

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语句返回products表中物品数量,产品价格最高,产品价格最低以及平均值。

练习

  1. 编写SQL语句,确定已售出产品的总数(使用OrderItems中的quantity列)。

    select sum(quantity) as selled
    from orderitems;

     

  2. 修改刚刚创建的语句,确定已售出产品项(prod_id)BR01的总数。

    select sum(quantity) as selled
    from orderitems
    where prod_id = 'BR01';

     

  3. 编写SQL语句,确定Products表中价格不超过10美元的最贵产品的价格(prod_price)。将计算所得的字段命名为max_price。

    select max(prod_price) as max_price
    from products
    where prod_price <= 10;

     

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

掩月天权

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值