概述
- 多行函数:输入多行记录,返回一行结果
- 过滤条件含有组函数,使用having关键字(不用where)
组函数
- max和min函数针对任意数据类型(字符串按首字母排序,然后再看次字母,以此类推,日期看成数字)
- AVG和SUM只能针对数值类型
- 组函数的参数为一行行的记录
- AVG = SUM/COUNT
- 都不考虑空值,仅仅计算非空的数据
count函数
- count(列名或表达式),如count(1),count(name),count(*)
- count(1):相当于进的每一条数据显示都是1(count函数和显示/具体的值是无关的,只和是否为空有关)
- count函数返回非空的数目
- NVL函数解决空值问题
数据分组
- 分组使用group by
- from要和where紧挨,having不用这样
- having作为过滤条件关键字(有分组函数要用having过滤)
多层分组
- 能否简写,看意思是否明确,语法是否通过
使用技巧
- 如不遵守上图红字内容,则一条记录,avg(salary),会对应多个department_id,从而不匹配
嵌套组函数
- AVG输出多行结果,传入MAX,输出一行记录
练习
- 使用SQ99语法
- 过滤条件:有员工的城市,内连接(要求两表都有数据)表达的就是这个意思
- 非组函数的列名一定包含在group by中
- 非组函数的列名一定包含在group by中
- count参数可传入*,具体解释见count组函数内容
- where的内容可通过and合并在having中,反之,不行
- having使用范围>where使用范围
难题
查询公司在1995-1998年之间,每年雇用的人数,结果类似下面的格式
total | 1995 | 1996 | 1997 | 1998 |
---|---|---|---|---|
20 | 3 | 4 | 6 | 7 |
- 转成字符格式(char类型)来判断年份
- 通过decode函数返回对应这一年的值,比如1(只要不为null,随意赋值)
- 方法巧妙
- 考虑部门没有员工的情况,使用右外连接
- 不用考虑员工没部门的情况,因为题干就是查询所有部门的员工数量等,暗指以部门为基准分类(不存在无部门)
- count(*)等价于count(department_name),当然有一个部门(此时,若某部门没有员工,同样会输出1)【???】
- 改成对employee_id的计数,若没有员工则employee_id为null,从而正确计数