1. 统计函数是以一组值为输入但只输出一个值的函数。SQL自带5个统计函数
2. avg min max sum count
3. sum和avg 的输入必须是数值,另外三个则还可以别的类型为输入比如字符串。
3.7.1基本统计
4. select avg ( salary)
from instructor
where dept name= ’Comp. Sci.’;
5. 这个查询的结果是一个只包含一个属性且只有一个值的关系。数据库可能会给这个关系的属性随意取个什么名字,但我们可以使用as操作来给它取个名字。
6. 进行统计时是否去重可能对结果产生很大影响——求平均时,如果重复值被去掉了,但计数仍按未去重的来计,得到的结果就是错误的。
7. 可以对统计函数中显式地使用distinct来去重,比如count(distinct name) ,能用distinct的地方也能用all,但all是默认值,因此没必要写。
8. 对max和min取distinct没有意义。
3.7.2分组统计
9. 先按条件分好组,再对每个分组分别计算统计
10. 在select子句中出现、不参与统计的属性必须出现在group by 条件中。或者说,没有出现在group by 条件中的属性如果要出现在select子句中必须参与统计。
11. 下面这个SQL语句中,对每个dept_name分组里的元组的ID值可能各不相同,但是这个语句中对一个分组只返回一个ID值,根本没法确定到底要返回哪个ID,所以这个语句是错的,没法执行。
12. select dept name, ID, avg (salary)
from instructor
group by dept name;
3.7.3Having子句
13. Where子句是作用于元组的条件,having子句则是作用于分组之上的条件。
14. 可按如下步骤来理解带group by 和having 子句的SQL语句:
a) 先用from子句中获得关系
b) 有where条件的话,执行Where子句进行过滤。
c) 满足where子句的谓词的元组按group by 的条件分组,如果没有group by则满足where子句的谓词的全部元组视为一个分组
d) 有Having子句的话,判断每个分组是否满足having的条件,不满足条件的分组被滤掉
e) 执行select 子句,使用统计函数,一个分组生成一个元组。
3.7.4对null值和bool值进行统计
15. 如果salary中有null, sum(salary)会忽略null值,将不为空的值求和
16. 一般来讲,除了count(*)之外,其它的统计函数都会忽略其输入中的null值。
17. 忽略null值可能导致用于统计的集合为空。空集合的count值为0,其它统计函数的输入为空集合时会返回 null。
18. 从sql:1999起布尔类型可取的值有true false unknown , some every这两个统计函数可作用于布尔值集合。