- 鉴于自己最近在做后端开发的工作时,发现自己的SQL能力实在太差,开始学习SQL语句基础,学习过程中在本博客进行笔记记录,课程参考:SQL课程
聚合函数是一系列SQL内置的方法,能够完成一些非常使用的功能,例如最大值计算、平均值计算等等。
MAX (计算最大值)
MAX函数便是通常用来计算最大值的方法,例如我们要获取发票总数的最大值:
SELECT MAX(invoice_total)
FROM sql_invoicing.invoices;
对于聚合函数的调用,我们使用的是(),例如这里的 MAX()
,执行的结果就是返回最大值:
MIN(计算最小值)
与MAX相反,MIN函数计算的就是最小值,同样的,我们计算发票总数的最小值:
SELECT MIN(invoice_total)
FROM sql_invoicing.invoices;
结果:
结果就是返回了最小值。
AVG(计算平均值)
AVG就是计算平均值的函数,例如我们计算发票总数的平均值:
SELECT AVG(invoice_total)
FROM sql_invoicing.invoices;
结果:
SUM(计算总数)
SUM用来计算总数,会返回列数的计算后数值,例如我们计算发票总数的总和:
SELECT SUM(invoice_total)
FROM sql_invoicing.invoices;
结果:
COUNT(计算列数总数)
COUNT与SUM不同的是,计算的是列数的综合,不是数值的总和,例如我们计算发票有多少张:
SELECT COUNT(invoice_total)
FROM sql_invoicing.invoices;
结果:
返回的是列数的总和。
对于聚合函数,只计算非空函数,若某列为空,该列不会参加计算,例如若计算列数时,使用了有空值的列名,例如:
SELECT COUNT(payment_date)
FROM sql_invoicing.invoices;
结果 :
返回的数字明显小于使用总数来计算,这里就是将空值进行删除后计算的结果。
Group By(数据分组)
Grounp By关键词的作用就是给关键词进行分组,例如在计算总和时,我们使用SUM语句来进行查询:
SELECT SUM(invoice_total) AS total_sales
FROM sql_invoicing.invoices;
结果:
这时返回的时所有数据之和,若我们要按照每个客户的情况来分别进行计算总和的话,这里就用到了Group By关键字在,例如,我们使用Group By将计算结果以客户来进行分开:
SELECT invoice_id AS id, (invoice_total) AS total_sales
FROM sql_invoicing.invoices
GROUP BY invoice_id;
结果:
如果与其他关键词进行复用时,需要记住,语句关键词的执行过程:
FROM -> WHERE -> GROUP BY -> SELECT -> ORDER BY
除了可以对单个的列进行GROUP BY外,还可以对多个列进行GROUP BY,例如我们将订单表和客户表进行合并后,按照state和city,两个条件进行分组:
SELECT
state,
city,
SUM(invoice_total) AS total_sales
FROM invoices i
JOIN clients USING(client_id)
GROUP BY client_id
会将相关的分组进行合并:
HAVING
HAVING关键词用来对GROUP BY之后的语句进行条件查询,GROUP BY之后的列并不能直接使用WHERE来进行查询,需要使用HAVING才能够进行查询,例如,我们对发票总数进行GROUP BY后,想要筛选出大于500的发票,正常思路是使用WHERE来进行查询:
SELECT
client_id AS id,
SUM(invoice_total) AS total_sales
FROM sql_invoicing.invoices
WHERE total_sales > 500
GROUP BY client_id
在执行的时候会报错,内容是未找到total_sales
列。
实际上在执行对GROUP BY
之后的列条件查询时,用到的是我们的HAVING语句:
SELECT
client_id AS id,
SUM(invoice_total) AS total_sales
FROM sql_invoicing.invoices
GROUP BY client_id
HAVING total_sales > 500
结果:
HAVING语句跟WHERE语句的区别可以简单理解为:
HAVING用来在GROUP BY之后进行条件查询,WHERE语句可以用来在GROUP之前进行条件查询。
HAVING语句只能够条件查询SELECT上有的列名。
ROOLLUP
用来汇总数据的聚合函数,用来将所有的数据进行结果集的聚合返回。
例如我们想要获取SUM()运算函数后的列的总和,就可以不用使用其他方法,只需要使用ROLLUP函数,例如:
SELECT
client_id,
SUM(invoice_total) AS total_sales
FROM invoices
GROUP BY client_id WITH ROLLUP
在最后的语句中我们使用关键词: WITH ROLLUP
,获得的结果就是:
在这里会将所有有意义的列进行汇总,类似于excel中的列总和计算的功能。