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
可以使用,其他均不能使用。