【数据库】4.函数使用&分组查询
目录
单行处理函数
单行处理函数的特点是输入一行,输出一行。
ifnull
ifnull()
用于处理值可能为NULL的数据,该函数接收两个参数,分别为需处理字段名和供替换值。
注意:数据库中规定,凡是有NULL
参与的运算,结果均为NULL
--查询sal的值,若sal为NULL,设为0
select ifnull(sal,0) from emp;
--算术运算(防止comm为NULL导致结果为NULL)
select (sal+ifnull(comm,0))*12 from emp;
分组函数(多行处理函数)
分组函数(多行处理函数)的特点是输入多行,最终输出的结果是一行。
SQL只有五个分组函数,分组函数不能直接使用在where
语句当中:
sum()
用于求和count()
用于计数max()
用于求出最大值min()
用于求出最小值avg()
用于求出平均值
所有分组函数都是对某一组数据进行操作。分组函数会自动忽略NULL
。
分组函数可以使用表达式作为传入值。
--求出sal和
select sum(sal) from emp;
--求出最高sal
select max(sal) from emp;
--求出最低sal
select min(sal) from emp;
--求出平均sal
select avg(sal) from emp;
--计数ename不为NULL的数据条数
select count(ename) from emp;
--计数emp总数据条数
select count(*) from emp;
--计数最低sal和最低sal和平均sal
select min(sal),max(sal),avg(sal) from emp;
分组查询
group by
group by
:按照某个字段或者某些字段进行分类
分组函数一般会和group by
联合使用。并且任何一个分组函数都在group by
执行结束之后才进行执行。
注意
sql语句的执行顺序是:
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY
由于未执行完GROUP BY
时分组函数不能使用,因此在WHERE
中使用分组函数是不被允许的。
(当没有显式的GROUP BY
语句时,系统会加上缺省的GROUP BY
语句)
--查找emp中每个不同的job对应的sal最大值
select job,max(sal) from emp group by job;
--查找emp中每个deptno不同job对应的sal最大值
select deptno,job,max(sal) from emp group by deptno,job;
使用显式GROUP BY
语句后,SELECT
中只能出现GROUP BY
中的字段和使用分组函数处理后的其他字段。
having
having
:对分组之后的数据进行再次过滤
如果数据可以使用WHERE
先筛选,就不要使用HAVING
。
--找出每个deptno的最高sal,并且只显示sal大于2900的数据
select deptno,max(sal) from emp group by deptno having max(sal) > 2900; -- 使用having效率低
select deptno,max(sal) from emp where sal > 2900 group by deptno; -- 使用where提前过滤效率高
--找出每个deptno的平均sal,并且只显示平均sal大于2000的数据
select deptno,avg(sal) from emp group by deptno having avg(sal) > 2000;