有时候需要对数据库中的数据进行一些统计,比如统计员工总数,统计年龄大于25的员工中的最低工资,统计工资大于3800元的员工的平均年龄等。SQL规定了下面几种聚合函数来实现数据的统计功能:
这几个聚合函数都有一个参数,这个参数表示要统计的字段名,比如要统计工资总额,就需要把工资字段作为SUM函数的参数。我们通过例子来看一下聚合函数的用法。
第一个例子是检索当天销售金额大于300的订单中最小的折扣比例,编写下面的SQL:
SELECT MIN(折扣比例) FROM demo_salesday WHERE 销售金额>300;
执行完毕我们就能看到下面的结果:
+---------------+
| MIN(折扣比例) |
+---------------+
| 0.12000 |
+---------------+
第二个例子我们来统计一下折扣比例小于0.5的订单的平均销售金额,编写如下SQL:
SELECT AVG(销售金额) FROM demo_salesday WHERE 折扣比例<0.5;
执行完毕我们就能看到下面的结果:
+---------------+
| AVG(销售金额) |
+---------------+
| 290.254271844 |
+---------------+
第三个例子我们来统计一下当日所有订单的销售总额,编写如下SQL:
SELECT SUM(销售金额) FROM demo_salesday;
执行完毕我们能看到如下结果:
+---------------+
| SUM(销售金额) |
+---------------+
| 58601.42000 |
+---------------+
最后一个例子我们统计销售金额小于200的订单数,编写如下SQL:
SELECT COUNT(*) as low_num FROM demo_salesday WHERE 销售金额<200;
执行完毕我们能看到下面的执行结果:
+---------+
| low_num |
+---------+
| 100 |
+---------+
正如我们在这个例子中所做的,为了提高检索结果的可读性,我们可以为输出字段取一个别名,列别名的定义格式为“列名 AS 别名”。从输出结果可以看出,输出的列名为low_num,并非COUNT(*)。
我们还可以多次使用聚合函数,比如下面的SQL用来统计当日订单中最高和最低的销售额:
SELECT MIN(销售金额),MAX(销售金额) FROM demo_salesday;
执行完毕我们能看到下面的执行结果:
+-----------------------+-----------------------+
| MIN(销售金额) | MAX(销售金额) |
+-----------------------+-----------------------+
| 200.85000 | 399.82000 |
+------------------------+-----------------------+
需要提一句,检索出表中所有列的SQL语句为SELECT *。*表示表中的所有记录,例如SQL语句:
SELECT * FROM demo_area WHERE 地区ID<3;
执行结果如下:
+--------+------+--------+------+--------+------+
| 国家ID | 国家 | 地区ID | 地区 | 城市ID | 城市 |
+--------+------+--------+------+--------+------+
| 1 | 中国 | 1 | 华东 | 1 | 山东 |
| 1 | 中国 | 1 | 华东 | 2 | 江苏 |
| 1 | 中国 | 1 | 华东 | 3 | 安徽 |
| 1 | 中国 | 1 | 华东 | 4 | 浙江 |
| 1 | 中国 | 1 | 华东 | 5 | 福建 |
| 1 | 中国 | 1 | 华东 | 6 | 上海 |
| 1 | 中国 | 2 | 华南 | 7 | 广东 |
| 1 | 中国 | 2 | 华南 | 8 | 广西 |
| 1 | 中国 | 2 | 华南 | 9 | 海南 |
+--------+------+--------+------+--------+------+
检索结果列出了demo_area表中地区ID小于3的地区的所有列。
WHERE子句支持的过滤条件除了>,<,=,>=,<=,等比较关系条件外,还支持复杂的过滤条件。使用AND/OR/NOT可以连接多个简单过滤条件,以完成复杂的检索。例如下面的SQL语句用来检索demo_area表中地区ID<3且城市ID>2的所有地区信息:
SELECT * FROM demo_area WHERE 地区ID<3 AND 城市ID>2;
执行完毕我们就能看到下面的执行结果:
+--------+------+--------+------+--------+------+
| 国家ID | 国家 | 地区ID | 地区 | 城市ID | 城市 |
+--------+------+--------+------+--------+------+
| 1 | 中国 | 1 | 华东 | 3 | 安徽 |
| 1 | 中国 | 1 | 华东 | 4 | 浙江 |
| 1 | 中国 | 1 | 华东 | 5 | 福建 |
| 1 | 中国 | 1 | 华东 | 6 | 上海 |
| 1 | 中国 | 2 | 华南 | 7 | 广东 |
| 1 | 中国 | 2 | 华南 | 8 | 广西 |
| 1 | 中国 | 2 | 华南 | 9 | 海南 |
+--------+------+--------+------+--------+------+