目录

【数据库】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;