9.2 聚集不同值
以上5个聚集函数都可以如下使用:
- 对所有行执行计算,指定
ALL
参数或不指定参数(因为ALL
是默认行为)。 - 只包含不同的值,指定
DISTINCT
参数。
提示:
ALL
为默认
ALL
参数不需要指定,因为它是默认行为。如果不指定DISTINCT
,则假定为ALL
。
说明:不要在Access中使用
Microsoft Access在聚集函数中不支持DISTINCT
,因此下面的例子不适合于Access。要在Access得到类似的结果,需要使用子查询把DISTINCT
数据返回到外部SELECT COUNT(*)
语句。
下面的例子使用AVG()
函数返回特定供应商提供的产品的平均价格。它与上面的SELECT
语句相同,但使用了DISTINCT
参数,因此平均值只考虑各个不同的价格:
输入▼
SELECT AVG(DISTINCT prod_price) AS avg_price
FROM Products
WHERE vend_id = 'DLL01';
输出▼
avg_price
avg_price
4.2400
分析▼
可以看到,在使用了DISTINCT
后,此例子中的avg_price
比较高,因为有多个物品具有相同的较低价格。排除它们提升了平均价格。
警告:
DISTINCT
不能用于COUNT(*)
如果指定列名,则DISTINCT
只能用于COUNT()
。DISTINCT
不能用于COUNT(*)
。类似地,DISTINCT
必须使用列名,不能用于计算或表达式。
提示:将
DISTINCT
用于MIN()
和MAX()
虽然DISTINCT
从技术上可用于MIN()
和MAX()
,但这样做实际上没有价值。一个列中的最小值和最大值不管是否只考虑不同值,结果都是相同的。
说明:其他聚集参数
除了这里介绍的DISTINCT
和ALL
参数,有的DBMS还支持其他参数,如支持对查询结果的子集进行计算的TOP
和TOP PERCENT
。为了解具体的DBMS支持哪些参数,请参阅相应的文档。