第二天
演示表格(emp)
分组函数(多行处理函数)
count 计数函数 #count(星号)和count(某个字段)的区别 count(*)代表总记录条数,
count(某一条字段)代表该字段下不为空的条数
sum 求和函数
avg 求平均值
max 求最大值
min 求最小值
分组函数都是对某一组数据进行操作的。//分组函数只有这五个
SQL语句中有一条规则:分组函数不能用在where子句当中。!!
分组函数实在group by函数执行之后执行的,group by 语句是在where之后执行的。!!!
分组函数另一个名字:多行处理函数//输入多行,输出一行。(就比如求和)
(有一个工工资表“emp”
字段是:empno,ename,job,mgr.hirdate,sal(工资),comm,deptno)
找出工资总和:
select sum(sal)from emp;
找出工资平均值:
select avg(sal) from emp;
找出工资高于平均工资的员工:
select ename,sal from emp where sal>(select avg(sal) from emp);#子查询,先求平均值,再求大于它的
分组函数自动忽略空(null)
单行处理函数(每输入一行,就会输出一行)
当运算中出现null时,计算结果就是null!!!
计算每个员工的年薪:
select ename,(sal+comm)*12 from emp;**#但是**当运算中出现null时,计算结果就是null!!!****
/*也就是说当sal或者comm中有任意一个出现null时,计算结果就是null(comm:津贴)*/
ifnull:空值处理函数
ifnull(可能为空的字段,怎么处理)
计算每个员工的年薪:(时用ifnull函数处理空值)
select ename,(sal+ifnull(comm,0))*12 from emp;
group by 和having
**注意:**分组函数一般都会和 group by函数一起使用,所以被称为分组函数
所有分组函数(count ,sum,avg,max,min)都是在 group by(分组字段)函数执行完之后执行的,
当一条sql语句没有 group by 函数时,整个表被看成一组。
当语句中有group by时,前面只能加参与分组的字段和分组函数。如果加了其他的字段·可以查询出来结果,但是结果没有意义。
例如
找出每个岗位薪资最大值:
select ename,max(sal),job #查找名字,最大薪资,岗位(可以查出名字,但是查处的结果没有意义,在mysql里面可以运行,在Orcel中运行时是会报错的)
from emp
group by job;
group by :按照某个或某些字段进行分组。多个字段进行分组,可以把多个字段看成同一个字段。
having :对分组之后的数据进行再次筛选。
找出每个工作岗位的最高薪资:
select job,max(sal)
from emp
group by job;
having和where之间先选where,效率高,先用where过滤,在去分组和排序,实在不能先筛选的就用having。
having函数必须和group by 一起使用!!!
找出每个部门的平均薪资,并且显示大于2000的:#先求平均值,再对结果进行筛选(having)
select deptno,avg(sal) #查找部门编号
from emp #从EMP表中
group by deptno #对部门进行分组
having avg(sal) > 2000; #筛选出大于2000的
找出每个部门的最高薪资,要求显示大于2900的:#先用where筛选出大于2900的。
select deptno,max(sal) #找出部门和最大薪资
from emp
where sal > 2900 #先筛选出大于2900的
group by deptno;#按照deptno进行分组
总结完整的DQL语句
**
查询结果去重
distinct “字段” #去重复值
distingt只能出现在所有字段的前面,
多个字段表示多个条件联合起来去重。
select
“字段1,字段2·····”#1
from
“表名”#2
where
“字段+条件”#3
group by
“字段1,字段2···”#4
having
“字段+条件”#5
order by
“字段1,字段2···”#6
执行顺序:2,3,4,5,1,6
**