9.2 聚集不同值

以上5个聚集函数都可以如下使用:

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

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

说明:不要在Access中使用
Microsoft Access在聚集函数中不支持DISTINCT,因此下面的例子不适合于Access。要在Access得到类似的结果,需要使用子查询把DISTINCT数据返回到外部SELECT COUNT(*)语句。

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

输入▼

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

输出▼

  1. 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支持哪些参数,请参阅相应的文档。