SQL

SQL 知识量:22 - 44 - 129

9.2 更多使用方式><

聚集不同值- 9.2.1 -

对于聚集函数可以按照如下方式使用:

  • 对所有行执行计算,指定all参数或省略all(all是默认行为)。

  • 只包含不同的值,需要指定distinct参数。

在以上情形下,distinct表示的含义与all正好是相对应的,distinct表示数据不允许重复,而all表示包含所有记录,包括重复的行。

例如:有如下访客记录表(visitor)。

+----+-------+---------+
| id | name  | country |
+----+-------+---------+
|  1 | Bob   | USA     |
|  2 | Jame  | NULL    |
|  3 | Susan | UK      |
|  4 | Chen  | China   |
|  5 | Koco  | Japan   |
|  6 | Sophy | NULL    |
|  7 | Susan | UK      |
|  8 | Bob   | USA     |
+----+-------+---------+

现在按照姓名查询访问人次。

select count(name) from visitor;

结果:

+-------------+
| count(name) |
+-------------+
|           8 |
+-------------+

以上计算结果中包含了重复的姓名(所以才叫人次),如果要查询累计有多少人访问过,就需要排除重复的情况,使用distinct就可以做到了。

select count(distinct name) from visitor;

结果:

+----------------------+
| count(distinct name) |
+----------------------+
|                    6 |
+----------------------+

注意:

  • distinct不能用于count(*)。类似的,distinct只能使用列名,不能用于计算或表达式。

  • Microsoft Access不支持distinct。

组合聚集函数- 9.2.2 -

在实际应用中,select语句可以根据需要,同时使用多个聚集函数。

例如:查询学生的人数、最大年龄、最小年龄及平均年龄。

select count(name),max(age),min(age),avg(age) from student;

结果:

+-------------+----------+----------+----------+
| count(name) | max(age) | min(age) | avg(age) |
+-------------+----------+----------+----------+
|          10 |       13 |       10 |  11.1000 |
+-------------+----------+----------+----------+