【MySQL必知必会】第12章汇总数据

本章介绍什么是SQL的聚集函数以及如何利用它们汇总表的数据。

聚集函数

我们经常需要汇总数据而不用把它们实际检索出来,为此MySQL提供了专门的函数。
常用的使用场景:

  • 确定表中行数(或者满足某个条件或包含某个特定值的行数)。
  • 获得表中行组的和。
  • 找出表列(或所有行或某些特定的行)的最大值、最小值和平均值。

重复一遍,实际想要的是汇总信息。你查找的消息越少,对时间、处理资源、带宽都是一种节约,性能就越好。

为了方便以上操作,MySQL提供了5个聚集函数:
在这里插入图片描述

AVG()函数

AVG()通过对表中行数计数并计算特定列值之和,求得该列的平均值。AVG()可用来返回所有列的平均值,也可以用来返回特定列或行的平均值。

举个栗子:

SELECT AVG(prod_price) AS avg_price FROM Products;

在这里插入图片描述
AVG()也可以用来确定特定列或行的平均值。

SELECT AVG(prod_price) FROM Products WHERE vend_id=1003;

在这里插入图片描述
AVG()只能用来确定特定数值列的平均值,而且列名必须作为函数参数给出。为了获得多个列的平均值,必须使用多个AVG()函数。
即,AVG函数使用的两个特点:

  • 一个AVG函数只能用于某一列。
  • AVG()函数忽略列值为NULL的行。

COUNT()函数

COUNT()函数进行计数。可利用COUNT()确定表中行的数目或符合特定条件的行的数目。
COUNT函数比较特别,它可以用通配符*,这是聚集函数中最牛B的。

  • COUNT(*)对表中行的数目进行计数时,不管表列中包含的是空值(NULL)还是非空值,都会统计到。是多少行就是多少行。
  • COUNT()对某个特定列进行计数时,和其他的聚集函数一样,会忽略掉NULL值。

举个栗子:

SELECT COUNT(*) AS num_cust FROM customers;

在这里插入图片描述

SELECT COUNT(cust_email) AS num_cust FROM customers;

在这里插入图片描述

MAX()函数

MAX()返回指定列中的最大值。

SELECT MAX(prod_price) AS max_price FROM Products;

在这里插入图片描述

  • 虽然MAX函数常用于数值序列,但是非数值序列也可以用的。
  • 虽然MAX()一般用来找出最大的数值或日期值,但MySQL允许将它用来返回任意列中的最大值,包括返回文本列中的最大值。在用于文本数据时,如果数据按相应的列排序,则MAX()返回最后一行。
  • MAX()函数忽略列值为NULL的行。

MIN()函数

MIN()的功能正好与MAX()功能相反,它返回指定列的最小值.

SELECT MIN(prod_price) AS min_price FROM Products;

在这里插入图片描述
MIN和MAX的特性是一样的,就不赘述了。

SUM()函数

SUM()用来返回指定列值的和(总计)。

SELECT SUM(quantity) AS items_ordered FROM orderitems WHERE order_num = 20005;

在这里插入图片描述
SUM()也可以用来合计计算值。

SELECT SUM(item_price*quantity) AS total_price FROM orderitems WHERE order_num=20005;

在这里插入图片描述
聚集函数的特点:

  • 如本例所示,利用标准的算术操作符,所有聚集函数都可用来执行多个列上的计算。
  • SUM()函数忽略列值为NULL的行。

聚集不同值

以上5个聚集函数都可以如下使用:

  • 对所有的行执行计算,指定ALL参数或不给参数(因为ALL是默认行为);
  • 只包含不同的值,指定DISTINCT参数。

注意:ALL参数不需要指定,因为它是默认行为。如果不指定DISTINCT,则假定为ALL。
下面的例子使用AVG()函数返回特定供应商提供的产品的平均价格。
它与上面的SELECT语句相同,但使用了DISTINCT参数,因此平均值只考虑各个不同的价格:

SELECT AVG(DISTINCT prod_price) AS avg_price FROM Products WHERE vend_id = 1003;

在这里插入图片描述
再来看一下没用DISTINCT时:
在这里插入图片描述
可以看到,在使用了DISTINCT后,此例子中的avg_price比较高,因为有多个物品具有相同的较低价格。排除它们提升了平均价格。

  • 对于SUM和AVG来讲,函数(DISTINCT 列名)有实际意义。
  • 对于MAX和MIN来讲,函数(DISTINCT 列名)没啥意义。因为过滤掉了重复的,该大还是大该小还是小。
  • 对于COUNT来讲, COUNT(DISTINCT 列名)有意义,而COUNT(DISTINCT *)就是错误的语法了。
  • 对于所有的聚合函数来讲,DISTINCT 函数名()都没有意义。因为聚合函数肯定只返回一行。

组合聚集函数

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;

在这里插入图片描述

发布了464 篇原创文章 · 获赞 21 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_41687289/article/details/105328397