3、聚合与排序
3-1:对表进行聚合查询
1、使用聚合函数对表中的列进行合计值或者平均值等等合计操作
2、聚合函数会对NULL以外的对象进行合计,但是COUNT(*)函数可以查出包含NULL的内的全部数据行数
3、使用DISTINCT关键字删除重复值
3-1-1:聚合函数
COUNT:计算表中的记录数(行数)
SUM:计算表中的数值列的数据合计值
AVG:计算表中的数值列的数据平均值
MAX:求出表中任意列中数据的最大值
MIN:求出表中任意列中数据的最小值
-- 计算全部数据行数 SELECT COUNT(*) FROM Shohin;
3-1-2:计算NULL以外数据的行数
-- 计算shiire_tanka列中(进货单价)中非空行数 SELECT COUNT(shiire_tanka) FROM Shohin;
法则3-1:COUNT函数的结果根据参数的不同而不同,COUNT(*)会得到包含NULL的数据行数,而COUNT(<列名>)会得到NULL之外的数据行数。
3-1-3:计算合值
-- 销售单价的合计值 SELECT SUM(hanbai_tanka) FROM Shohin;
法则3-2:聚合函数会将NULL排除在外,但COUNT(*)例外,并不会排除NULL。
3-1-3:计算平均值
SELECT AVG(hanbai_tanka) FROM Shohin;
3-1-3:计算最大值和最小值
-- 计算销售单价最大值和进货单价的最小值 SELECT MAX(hanbai_tanka), MIN(shiire_tanka) FROM Shohin;
法则3-3:MAX/MIN函数几乎适用于所有数据类型的列,SUM/AVG函数只适用于数值类型的列。
3-1-4:使用聚合函数删除重复值(关键字DISTINCT)
SELECT COUNT(shohin_bunrui), COUNT(DISTINCT shohin_bunrui) FROM Shohin;
法则3-4:计算值种类,可以在聚合函数参数前使用DISTINCT关键字,进行去重。
3-2:对表进行分组
1、使用GROUP BY子句可以对数据进行分割再聚合
2、聚合中包含NULL时,在结果中会以“不确定”行(空行)的形式表现出来
3、使用聚合函数和GROUP BY子句时需要注意以下4点:
(1)只能写在SELECT子句中
(2)GROUP BY子句中不能使用SELECT子句中列的别名
(3)GROUP BY子句的聚合结果是无序的
(4)WHERE子句中不能使用聚合函数
3-2-1:GROUP BY子句
语法3-1:使用GROUP BY子句进行聚合
SELECT <列名1>,<列名2>,<列名3>,....
FROM <表名>
GROUP BY <列名1>,<列名2>,<列名3>,....;
-- 按商品种类统计数据行数 SELECT shohin_bunrui, COUNT(*) -- COUNT(shohin_bunrui) FROM Shohin GROUP BY shohin_bunrui;
法则3-5:GROUP BY子句要写在最后。
3-2-2:聚合中包含NULL的情况
-- 按照进货碟单价统计数据行数 SELECT shiire_tanka, COUNT(*) -- COUNT(shiire_tanka) FROM Shohin GROUP BY shiire_tanka;
法则3-6:聚合键中包含NULL时,结果中会以“不确定”行(空行)的形式表现出来。
3-2-3:使用WHERE子句时GROUP BY的执行结果
语法3-2:使用WHERE子句和GROUP BY子句进行聚合
SELECT <列名1>,<列名2>,<列名3>,....
FROM <表名>
WHERE <条件表达式>
GROUP BY <列名1>,<列名2>,<列名3>,....;
SELECT shiire_tanka, COUNT(*) -- COUNT(shiire_tanka) FROM Shohin WHERE shohin_bunrui = '衣服' GROUP BY shiire_tanka;
说明:GROUP BY和WHERE并用时,SELECT语句的执行顺序是:
FROM -> WHERE -> GROUP BY -> SELECT
3-2-4:使用聚合函数和GROUP BY子句中常见的错误
法则3-7:使用GROUP BY子句时,SELECT子句中不能出现聚合键之外的列名。
法则3-8:在GROUP BY子句中不能使用SELECT子句中定义的别名。(在PostgreSQL中不会报错,但有些DBMS会报错)
法则3-9:GROUP BY子句结果的输出是无序的。
法则3-10:只有在SELECT子句和HAVING子句(以及ORDER BY子句)中能够使用聚合函数。
3-2-5:DISTINCT和GROUP BY都能去除重复值
-- DISTINCT和GROUP BY实现相同的功能 SELECT DISTINCT shohin_bunrui FROM Shohin; SELECT shohin_bunrui FROM Shohin GROUP BY shohin_bunrui;
如何选择使用这两个:
想要删除选择结果的重复记录使用DISTINCT
想要计算聚合结果时使用GROUP BY
3-3:为聚合结果指定条件
1、使用COUNT函数等对表中数据进行聚合操作时,为其指定的条件不是WHERE子句,而是HAVING子句
2、聚合函数可以在SELECT、HAVING和ORDER BY子句中使用
3、HAVING子句要写在GROUP BY子句之后
4、WHERE子句用来指定数据行的条件,HAVING子句用来指定分组的条件
3-3-1:HAVING子句
语法3-3:SELECT <列名1>,<列名2>,<列名3>,....
FROM <表名>
GROUP BY <列名1>,<列名2>,<列名3>,....
HAVING <分组结果对应的条件>;
法则3-13:HAVING子句要写在GROUP BY子句之后。
-- 取出包含数据的行数为2行的组 SELECT shohin_bunrui, COUNT(*) FORM Shohin GROUP BY shohin_bunrui HAVING COUNT(*) = 2;
3-3-2:HAVING子句的构成要素
1、常数
2、聚合函数
3、GROUP BY子句中指定的列名
法则3-14:指定行所对应的条件写在WHERE子句中,指定组所对应和条件写在HAVING子句中。
3-4:对查询结果排序
1、使用ORDER BY子句对查询结果排序
2、在ORDER BY子句中的列名后使用关键字ASC升序排序,DESC降序排序
3、ORDER BY子句中可以指定多个排序列名
4、排序中包含NULL时,会在开头或结尾进行汇总
5、ORDER BY子句中可以使用SELECT子句中定义的列的别名
6、ORDER BY子句中可以使用SELECT子句中未出现的列或聚合函数
7、ORDER BY子句中不能使用列的编号
3-4-1:ORDER BY子句
语法3-3:SELECT <列名1>,<列名2>,<列名3>,....
FROM <表名>
ORDER BY <列名1>,<列名2>,<列名3>,....
-- 按销售单价从低向高排序 SELECT shohin_id, shohin_mei,hanbai_tanka,shiire_tanka FROM Shohin ORDER BY hanbai_tanka;
说明:子句的书写顺序
SELECT子句->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句
法则3-15:ORDER BY子句通常写在SELECT语句末尾。
-- 按销售单价从高向低排序 SELECT shohin_id, shohin_mei,hanbai_tanka,shiire_tanka FROM Shohin ORDER BY hanbai_tanka DESC;
-- 按销售单价和商品编号从高向低排序 SELECT shohin_id, shohin_mei,hanbai_tanka,shiire_tanka FROM Shohin ORDER BY hanbai_tanka DESC,shohin_id DESC;-- 每一个列都必须跟一个DSEC
法则3-17:排序键中包含NULL时,会在开头或进行汇总
3-4-2:在排序键中使用显示用别名
SELECT shohin_id AS id, shohin_mei FROM Shohin ORDER BY id;
说明:SELECT子句执行在GROUP BY子句之后,ORDER BY子句之前,所以在GROUP BY子句中不能用SELECT字义的别名,ORDER BY子句中可以。
法则3-18:ORDER BY子句中可以使用SELECT子句中字义别名。
法则3-19:ORDER BY子句中可以使用列中所有的列和聚合函数。
法则3-20:ORDER BY子句中不要使用列编号。