Aggregate Functions | 汇总数据 | 聚合函数 | MySQL

Aggregate Functions

今天学习如何为数据汇总编写查询
在这之前先看看内置函数的使用

内置函数

SELECT 
MAX(invoice_total) AS highest,
MIN(invoice_total) AS lowest,
AVG(invoice_total) AS average
FROM invoices

在这里插入图片描述
这些函数也试用于日期,例如

SELECT 
MAX(payment_date) AS highest,
MIN(invoice_total) AS lowest,
AVG(invoice_total) AS average
FROM invoices

在这里插入图片描述

SELECT 
MAX(invoice_total) AS highest,
MIN(invoice_total) AS lowest,
AVG(invoice_total) AS average,
SUM(invoice_total) AS total,
COUNT(invoice_total) AS number_of_invoices -- 计数
FROM invoices

在这里插入图片描述

注意

  • 聚合函数只允许非空值 因此如果所选列有空值,该列不会被算在函数里
  • 思考一下排除非空值可能会出现的问题
    这里举个例子
  SELECT 

COUNT(invoice_total) AS number_of_invoices,
COUNT(payment_date) AS count_of_payments  --  payment_date列存有空值
FROM invoices

在这里插入图片描述
得到7是因为并不是所有的发票都结了帐,所以count函数返回了非空payment dates的记录数

  • 如果想得到表格中的所有条目,不管是不是空值,可以这样表示
    在这里插入图片描述
  • 很多时候我们在内置函数中使用列名,但其实这里也可以写表达式
SELECT 
MAX(invoice_total) AS highest,
MIN(invoice_total) AS lowest,
AVG(invoice_total) AS average,
SUM(invoice_total *1.1) AS total,
COUNT(*) AS total_records
FROM invoices

当SQL执行查询,它会最先得到列值,并对每个值*1.1,之后这些值在SUM()进行累加,也可以添加”筛选器“进行更具体的加和

SELECT 
MAX(invoice_total) AS highest,
MIN(invoice_total) AS lowest,
AVG(invoice_total) AS average,
SUM(invoice_total *1.1) AS total,
COUNT(*) AS total_records
FROM invoices
WHERE invoice_date >'2019-07-01' -- 只看下半年的发票

在这里插入图片描述

这里会出现一个问题,total_records包含了所有的列数,就算我修改函数列名为COUNT(*) AS total_records → COUNT(client_id) AS total_records
也依然得到返回值7,因为invoices表格中client_id存有重复值

因此这里会用到distinct关键词

SELECT 
MAX(invoice_total) AS highest,
MIN(invoice_total) AS lowest,
AVG(invoice_total) AS average,
SUM(invoice_total *1.1) AS total,
COUNT(DISTINCT client_id) AS total_records
FROM invoices
WHERE invoice_date >'2019-07-01' -- 只看下半年的发票

现在得到的数值为3,因为表格中只有3个唯一客户拥有这个日期以后的发票
在这里插入图片描述

练习

请对invoices表格编写一个查询,以得到下述结果
在这里插入图片描述
其中what_we_expect列为total_sales列和total_payments列的差值

SELECT
	'First half of 2019' AS date_range,
	SUM(invoice_total) AS total_sales,
	SUM(payment_total) AS total_payments,
	SUM(invoice_total - payment_total) AS what_we_expect
FROM invoices
WHERE payment_date BETWEEN '2019-01-01' AND '2019-06-30'
UNION 
SELECT
	'second half of 2019' AS date_range,
	SUM(invoice_total) AS total_sales,
	SUM(payment_total) AS total_payments,
	SUM(invoice_total - payment_total) AS what_we_expect
FROM invoices
WHERE payment_date BETWEEN '2019-07-01' AND '2019-12-30'
UNION 
SELECT
	'total' AS date_range,
	SUM(invoice_total) AS total_sales,
	SUM(payment_total) AS total_payments,
	SUM(invoice_total - payment_total) AS what_we_expect
FROM invoices
WHERE payment_date BETWEEN '2019-01-01' AND '2019-12-30'

可以回顾一下:

  • 怎么自己创建一个列 ‘值名’ AS 列名
  • 连接行Unions | 联合 | MySQL
  • 之前注意里提到的,聚合函数括号内是可以用计算的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值