SQL语句——分组函数和分组查询
一、分组函数
分组函数(多行处理函数)特点:输入多行,最终输出一行 分组函数在使用时必须先进行分组,然后才能使用;如果没有对数据进行分组,整张表默认为一组。 (1)count 计数 (2)sum 求和 (3)avg 平均值 (4)max 最大值 (5)min 最小值
1、使用
(1)求最小/最大/平均/总和工资 select xxx(salay) from t_role; xxx:是上边这些函数
2、注意
(1).null
分组函数自动忽略 Null ,不需要提前对 null 进行处理
(2).count(*)和count(具体字段)的区别
count(*):统计表当中的总行数(只要有一行数据,则count++)。因为每一行记录不可能都为 null 。 count(具体字段):表示统计该字段下所有不为 null 的元素的总数。
(3).分组函数不能直接使用在where子句中
(1)找出比最低工资高的员工信息 select name,salay from t_role where salay>min(salay);:是错误的
(4).所有分组函数可以组合起来使用
二、分组查询
1.注意
(1)关键字的组合使用顺序 select … from … where … group by … order by … (2)执行顺序,不能颠倒 from where group by select order by (3)为什么分组函数不能直接使用在 where 后边 为什么**select name,salay from t_role where salay>min(salay);**会报错 因为分组函数在使用的时候必须先分组之后才能使用,where执行的时候,还没有分组。 (4)为什么 select sum(salay) from t_role;,没有分组却可以使用呢? 因为 select 在 group by 之后才执行
2.案例
(1)找出每个工作岗位的工资和 select job,sum(salay) from emp group by job; 执行顺序:先从 emp 表中查询数据,再根据 job 字段进行分组,然后对每一组的数据进行 sum(salay) 重点结论:在一条 select 语句中,如果有 group by 语句的话, ** select** 后面只能跟参加分组的字段以及分组函数,其他一律不能跟。 (2)找出每个部门的最高薪资 select deptno,max(salay) from emp group by deptno; (3)找出每个部门不同工作岗位的最高薪资 技巧:两个字段连接成一个字段看(两个字段联合起来分组) select deptno,job,max(salay) from emp group by deptno,job; (4)找出每个部门的最高薪资,要求显示最高薪资大于3000的 使用 having 可以对分完组之后的数据进一步过滤。 having 不能单独使用, having 不能代替 where , having 必须和 group by 联合使用 select deptno,max(salay) from emp where salay>3000 group by deptno 也可以:select deptno,max(salay) from emp group by deptno having max(salay)>3000; 优化策略:优先选择 where,where 完成不了再选择 having。