SQL 入门教程:聚集不同值

目录汇总:SQL 零基础入门教程

聚集函数 中介绍的 5 个聚集函数都可以如下使用。

  • 对所有行执行计算,指定 ALL 参数或不指定参数(因为 ALL 是默认行为)。
  • 只包含不同的值,指定 DISTINCT 参数。

提示:ALL 为默认

ALL 参数不需要指定,因为它是默认行为。如果不指定 DISTINCT,则假定为 ALL

下面的例子使用 AVG() 函数返回特定供应商提供的产品的平均价格。它与 聚集函数SELECT 语句 相同,但使用了 DISTINCT 参数,因此平均值只考虑各个不同的价格:

输入▼

1
2
3
SELECT AVG(DISTINCT prod_price) AS avg_price
FROM Products
WHERE vend_id = 'DLL01';

输出▼

avg_price
-----------
4.2400

分析▼

可以看到,在使用了 DISTINCT 后,此例子中的 avg_price 比较高,因为有多个物品具有相同的较低价格。排除它们提升了平均价格。

注意:DISTINCT 不能用于 COUNT(*)

如果指定列名,则 DISTINCT 只能用于 COUNT()DISTINCT 不能用于 COUNT(*)。类似地,DISTINCT 必须使用列名,不能用于计算或表达式。

提示:将 DISTINCT 用于 MIN()MAX()

虽然 DISTINCT 从技术上可用于 MIN()MAX(),但这样做实际上没有价值。一个列中的最小值和最大值不管是否只考虑不同值,结果都是相同的。

说明:其他聚集参数

除了这里介绍的 DISTINCTALL 参数,有的 DBMS 还支持其他参数,如支持对查询结果的子集进行计算的 TOPTOP PERCENT。为了解具体的 DBMS 支持哪些参数,请参阅相应的文档。

组合聚集函数

目前为止的所有聚集函数例子都只涉及单个函数。但实际上,SELECT 语句可根据需要包含多个聚集函数。请看下面的例子:

输入▼

1
2
3
4
5
SELECT COUNT(*) AS num_items,
       MIN(prod_price) AS price_min,
       MAX(prod_price) AS price_max,
       AVG(prod_price) AS price_avg
FROM Products;

输出▼

num_items      price_min           price_max           price_avg
----------     ---------------     ---------------     ---------
9              3.4900              11.9900             6.823333

分析▼

这里用单条 SELECT 语句执行了 4 个聚集计算,返回 4 个值(Products 表中物品的数目,产品价格的最高值、最低值以及平均值)。

注意:取别名

在指定别名以包含某个聚集函数的结果时,不应该使用表中实际的列名。虽然这样做也算合法,但许多 SQL 实现不支持,可能会产生模糊的错误消息。

请参阅

(完)

comments powered by Disqus