SQL聚合、分组和排序

聚合函数

聚合函数包括 COUNT SUM AVG MIN MAX 。聚合函数根据规则把多行结果输出为一行结果。

SELECT product_name, SUM(sale_price) FROM Product;

执行该SQL语句会失败,聚合函数是把多行结果聚集在一起,最终输出一行,而product_name的查询结果有多行,即便能输出,输出结果如下所述,sum计算的是所有结果总和,product_name是单个结果,不存在一一对应的关系,自然会报错。

product_namesum 叉子50T恤50笔记本50

  • COUNT :统计查询结果的个数, COUNT(*) 统计结果个数包含NULL, COUNT(列名) ,统计结果不包含该列NULL值。
  • SUM :查询结果的累加和,只能应用于数值类型,会自动过滤掉NULL值,输出累加和。
  • AVG : 计算查询结果的平均值,只能应用于数值类型,自动过滤NULL值,输出平均值。
  • MIN :计算查询结果的最小值,几乎能应用在所有数据类型上,如果是数值输出最小值,如果是字符按字典顺序输出最小字符,如果是时间输出最久时间。
  • MAX :计算查询结果的最大值,和 MIN 输出结果相反。

使用方式为 聚合函数(列名) ,如 SUM(列名) 等。
聚合函数还能和 DISTINCT 联合使用,用于计算去除重复行的结果,如 SUM(DISTINCT 列名)

对表分组

GROUP BY 列名、列名... ,根据列名进行组合分组,分组列结果值相同的会被分为一组。如果分组列结果包含NULL,则NULL值单独作为一组。

比如

SELECT product_type FROM Product GROUP BY product_type;

只要product_type为厨房用具的,都会被合并成一组。

如果有 GROUP BY 的组合列有多个,要所有分组列的结果值均相同才会被合并成一组。
比如

SELECT product_type,product_name FROM Product GROUP BY product_type, product_name;


分组列为 product_type product_name ,只有查询结果均为厨房用具和叉子,才会合并成一组,即使 product_type 相同, product_name 不同,也被当成单独分组。

SELECT 后查询列必须要在 GROUP BY 的分组列中存在,原因和聚集函数一样。

SELECT product_type, product_name FROM Product GROUP BY product_type; 

假设能输出结果,结果如下,按照 GROUP BY 分组,衣服和厨房用具只会出现一组,但是由于product_name有多个查询结果都要显示,相同类型的显示了多行,显然矛盾,所以一定会报错。

product_nameproduct_type 叉子厨房用具T恤衣服毛衣衣服筷子厨房用具笔记本办公用品

聚合函数不能作为 GROUP BY 的分组列,聚合函数是计算查询列中所有结果的值,有且只有一个,根据聚合值分组毫无意义。
如果想要计算分组中的聚合值,使用如下SQL语句,计算每个分类下的售价总和。

SELECT product_type, SUM(sale_price) FROM Product GROUP BY product_type;

聚合函数不能作为 WHERE 的查询条件,聚合函数的结果是所有查询结果的值,因此需要查询的列永远不会符合查询条件,不会返回任何结果。
意思是选择总售价为2000的产品类型。实际求出的所有产品类型的售价总和,并不能分出哪几种类型总售价为2000。

SELECT product_type FROM Product WHERE SUM(sale_price) = 2000;

HAVING子句

HAVING 子句用于 GROUP BY 后面,作为分组条件。 HAVING 中的条件语句主要有:聚合函数、常数、GROUP BY中指定的条件即为分组列。
GROUP BY 后有 HAVING 子句,满足条件的分组才会显示。

WHERE 条件作用于筛选行。
HAVING 筛选条件用于筛选组。

ORDER BY 排序

ORDER BY 用于排序,默认是升序。

ORDER BY 排序条件可以列名进行排序,列名可以不是SELECT中指定的列,但是一定要在表中存在。
如根据价格顺序显示产品类型

SELECT product_type FROM Product ORDER BY sale_price; 

ORDER BY 如果和 GROUP BY 同时使用,后面可以跟聚合函数,用于分组聚合排序。
如根据销售总价顺序显示产品类型

SELECT product_type FROM Product GROUP BY product_type ORDER BY SUM(sale_price);

ORDER BY A键值,B键值 可以指定多个排序键,先按照A键值排序,如果A键值相同再按照B键值排序。

ASC :表示升序,默认即为升序
DESC :表示降序

总结

查询语句结构顺序如下:
SELECT 列名、列名、列名... FROM 表名 WHERE 行条件 GROUP BY SELECT指定列名 HAVING 分组条件 ORDER BY 类名或聚合函数 DESC

调用顺序为 FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY ,根据调用顺序,如果 SELECT 中使用别名,只有 ORDER BY 可以使用,其他均不能使用。

编辑于 2020-06-29 23:49