SQL的聚集函数及汇总表的数据

聚集函数

汇总数据而不用把它们实际检索出来。有时候需要对表中的数据进行汇总,而不是想得到数据本身,如果返回数据本身则对时间、带宽和处理资源的浪费

  • 确定表中行数
  • 获得表中行组的和
  • 找出列表的最大值、最小值、平均值

MySQL给出了5个聚集函数,运行在组上,计算和返回单个值的函数

  • AVG() 返回某列的平均值
  • COUNT() 返回某列的行数
  • MAX() 返回某列的最大值
  • MIN() 返回某列的最小值
  • SUM() 返回某列之和
  • 标准偏差聚集函数(略)

AVG()函数

1.通过对表中行数计算并计算特定列值之和,求得该列的平均值

SELECT
	AVG( prod_price ) AS avg_price 
FROM
	products;

image.png
2.确定特定行或列的平均值

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

image.png

注意

  • 只适用于单个列
    AVG()只能用来确定特定数值列的平均值,而且列名必须作为函数参数给出,如果要获得多饿列的平均值,必须使用多个AVG函数
  • 忽略NULL值
    AVG()函数忽略NULL值

COUNT()函数

COUNT()函数进行计数,可确定表中行的数目或符合特定条件的行的数目。

  • COUNT(*)不会忽略NULL值,就算该行所有值都为NULL
  • COUNT(column)对特定列中具有值的行进行计数,忽略NULL值

注意

  • COUNT()函数用*代替列名不忽略函数,但是如果指定列名则会忽略函数
SELECT
	COUNT(*) AS num_cust 
FROM
	customers;

不忽略NULL值,返回5
image.png

SELECT
	COUNT( cust_email ) AS num_cust 
FROM
	customers;

忽略NULL值,返回3
image.png

MAX()函数

返回列中最大值,必须指定列名

SELECT
	MAX( prod_price ) AS max_price 
FROM
	products;

image.png

注意

  • 对非数值数据使用MAX()
    在用于文本数据是,如果数据按相应的列排序,则MAX()返回最后一行
  • NULL值
    MAX()函数忽略值为NULL的行

MIN()函数

返回指定列的最小值,要求指定列名

SELECT
	MIN( prod_price ) AS min_price 
FROM
	products;

image.png

注意

  • 对非数值数据使用MIN()
    在用于文本数据是,如果数据按相应的列排序,则MAX()返回第一行
  • NULL值
    MIN()函数忽略值为NULL的行

SUM()函数

返回指定列值的和。
1.

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

检索订购物品的总数
image.png
2.合计计算值

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

返回订单价值的总和
image.png

注意

  • 所有的聚集函数都可以在多个列上计算
  • NULL值的行被SUM()函数忽略

聚集不同值DISTINCT

MySQL5之后的版本新增点

  • 所有的行执行计算,指定ALL参数或不给参数(因为ALL是默认行为)
  • 只包含不同的值,指定DISTINCT参数
SELECT
	AVG( DISTINCT prod_price ) AS avg_price 
FROM
	products 
WHERE
	vend_id = 1003;

image.png
此时的平均值要比不去重前高,是因为有多个价格低的产品被去重了
image.png

注意

  • 指定列名,DISTINCT必须使用列名,不能用于计算或表达式
  • MIN()和MAX(),虽然可以在其函数中使用DISTINCT,但是没有意义,因为如果存在多个最小值、最大值一样即使去重也没有任何影响,返回的结果都是相通的

组合聚集函数

SELECT语句可以包含多个聚集函数

SELECT
	COUNT(*) AS num_items,
	MIN( prod_price ) AS peice_min,
	MAX( prod_price ) AS price_max,
	AVG( prod_price ) AS price_avg 
FROM
	products;

image.png

取别名

包含多个聚集函数结果时,使用唯一的别名字段会使得SQL更易于理解和使用


这个家伙很懒,啥也没有留下😋