第六章 聚合函数与分组
6.1 使用聚合函数进行统计汇总
常用的聚合函数如下:
COUNT:返回结果集中行的数目
SUM:返回结果集中所有值的总和
AVG:返回结果集中所有值的平均值
MAX:返回结果集中所有值的最大值
MIN:返回结果集中所有值的最小值
执行行和列计数
SQL使用COUNT函数用于对满足某种条件的行计数。我们可以以多个方法使用这个函数,但是基本语法是相同的。通常,我们在一个SELECT查询按照如下方法使用COUNT函数:
SELECT COUNT(<计数规范>) FROM <表名>;
计数规范关键字
计数规范 含义
* 计数所有选择的行,包括NULL值
ALL列 计数指定列的所有的非空值行。如果没有仅仅是指定列儿不带 ALL 或者DISTINCT ,这是默认操作。
DISTINCT 计数指定列的所有唯一非空值行。(和ALL唯一区别就是DISTINCT不会排除重复)
我们可以使用与前面一章中命名为计算列一样的方法来重命名COUNT列如下:
SELECT COUNT(<计数规范>) as <列名> FROM <表名>;
返回列合计值(SUM不能统计字符串,没有‘*’规范)
使用SUM函数的语法与COUNT函数类似:
SELECT SUM(<计数规范>) FROM <表名>;
获取列平均值(AVG:过滤为空的值)
列平均值(算术平均值)通过列的合计值除以参加合计的行数可以很容易获取,但是使用AVG函数更容易。AVG函数的用法与全面学过的聚合函数类似,其方法为:
SELECT AVG(<平均值规范>) FROM <表名>;
返回最大和最小值(也会过滤为空的值)(MAX/MIN没有ALL,DISTINCT,* 规范,但它们自动过滤空的值)
SELECT MAX(<最大值规范>) FROM <表名>;
SELECT MIN(<最小值规范>) FROM <表名>;
数据分组
例如: SELECT SUM(unitCost) FROM Prodcts WHERE SupplierID = 1;
SELECT SUM(unitCost) FROM Prodcts WHERE SupplierID = 2;
SELECT SUM(unitCost) FROM Prodcts WHERE SupplierID = 3;
. . . . .
过滤分组数据
在SQL中使用GROUP BY子句来对数据分组,其典型语法如下:
SELECT 列A,聚合函数(集合函数规范) FROM 表名
WHERE 过滤条件
GROUP BY 列A;
使用HAVING子句(与WHERE区别,两者都过滤,WHERE运行在前面,不能运行组合函数。HAVING运行在后面,可以运行函数)
SELECT StudentID, AVG(Mark) AS AverageMark
FROM SrudentExam
WHERE AVG(Make) < 50 OR AVG(Make) > 70
GROUP BY StudentID;
6.3 SQL语句的执行顺序
一、执行FROM
二、WHERE条件过滤
三、GROUR BY分钟
四、执行SELECT投影列
五、HAVING子句
六、ORDER BY 排序
6.1 使用聚合函数进行统计汇总
常用的聚合函数如下:
COUNT:返回结果集中行的数目
SUM:返回结果集中所有值的总和
AVG:返回结果集中所有值的平均值
MAX:返回结果集中所有值的最大值
MIN:返回结果集中所有值的最小值
执行行和列计数
SQL使用COUNT函数用于对满足某种条件的行计数。我们可以以多个方法使用这个函数,但是基本语法是相同的。通常,我们在一个SELECT查询按照如下方法使用COUNT函数:
SELECT COUNT(<计数规范>) FROM <表名>;
计数规范关键字
计数规范 含义
* 计数所有选择的行,包括NULL值
ALL列 计数指定列的所有的非空值行。如果没有仅仅是指定列儿不带 ALL 或者DISTINCT ,这是默认操作。
DISTINCT 计数指定列的所有唯一非空值行。(和ALL唯一区别就是DISTINCT不会排除重复)
我们可以使用与前面一章中命名为计算列一样的方法来重命名COUNT列如下:
SELECT COUNT(<计数规范>) as <列名> FROM <表名>;
返回列合计值(SUM不能统计字符串,没有‘*’规范)
使用SUM函数的语法与COUNT函数类似:
SELECT SUM(<计数规范>) FROM <表名>;
获取列平均值(AVG:过滤为空的值)
列平均值(算术平均值)通过列的合计值除以参加合计的行数可以很容易获取,但是使用AVG函数更容易。AVG函数的用法与全面学过的聚合函数类似,其方法为:
SELECT AVG(<平均值规范>) FROM <表名>;
返回最大和最小值(也会过滤为空的值)(MAX/MIN没有ALL,DISTINCT,* 规范,但它们自动过滤空的值)
SELECT MAX(<最大值规范>) FROM <表名>;
SELECT MIN(<最小值规范>) FROM <表名>;
数据分组
例如: SELECT SUM(unitCost) FROM Prodcts WHERE SupplierID = 1;
SELECT SUM(unitCost) FROM Prodcts WHERE SupplierID = 2;
SELECT SUM(unitCost) FROM Prodcts WHERE SupplierID = 3;
. . . . .
过滤分组数据
在SQL中使用GROUP BY子句来对数据分组,其典型语法如下:
SELECT 列A,聚合函数(集合函数规范) FROM 表名
WHERE 过滤条件
GROUP BY 列A;
使用HAVING子句(与WHERE区别,两者都过滤,WHERE运行在前面,不能运行组合函数。HAVING运行在后面,可以运行函数)
SELECT StudentID, AVG(Mark) AS AverageMark
FROM SrudentExam
WHERE AVG(Make) < 50 OR AVG(Make) > 70
GROUP BY StudentID;
6.3 SQL语句的执行顺序
一、执行FROM
二、WHERE条件过滤
三、GROUR BY分钟
四、执行SELECT投影列
五、HAVING子句
六、ORDER BY 排序