1、聚合函数简介

  • 写在前面:为了方便理解可以将一张表的看做是一个二维矩阵,一条数据就是一行,一列数据就是针对一个字段!
  • 什么是聚合函数:聚合函数针对某一字段(列)执行计算并返回单一的值(一行)。
  • 聚合函数在使用时会自动忽略NULL值,这是聚合函数的一大特点。
  • 常用的聚合函数:count()计数、sum()求和、max()最大值、min最小值、avg平均值;这是五大最常用的聚合函数,当然随着SQL的不短发展扩充聚合函数越来越多!



2、数据库表的构建

create table `emp` (
	`EMPNO` int(4) not null,
	`ENAME` varchar(10) default null,
	`JOB` varchar(9) default null,
	`MGR` int(4) default null,
	`HIREDATE` date default null,
	`SAL` double(7,2) default null,
	`COMM` double(7,2) default null,
	`DEPTNO` int(2) default null,
	primary key (`EMPNO`)
) engine=innodb default charset=utf8

聚合函数索引生效吗 聚合函数的使用_聚合函数索引生效吗




3、基本使用

  • 聚合函数自动忽略NULL值
  • 当NULL值参与数学运算时,结果一定是NULL
3.1、count查询人数

查询总人数,由于聚合函数会自动忽略NULL,因此当存在某个字段中存在NULL时结果会不一致。总之*的查询二维矩阵的行数,字段(列)是查询不为NULL值的个数!

*进行通配
select count(*) from emp; 				//结果14

select count(ename) from emp; 			//结果14

select count(comm) from emp;			//结果是4

select count(*), count(ename), count(comm) from emp;		//结果14 14 4



3.2、sum查询总津贴

一样的,聚合函数都会忽略NULL,因此在使用时不需要单独特别判断NULL值的情况

select sum(comm) from emp;
select sum(comm) from emp where comm is not null

这两条SQL语句查询的结果是相同的,但是在笔试时第二条不出意外应该是0分!其实就是考聚合函数对NULL的特殊处理!



3.3、查询员工的年薪(一)

员工的年薪 = (月薪 + 津贴)* 12,也就是 yearsalary = (sal + comm) * 12。

select ename, (sal + comm)*12 as yearsalary from emp;

聚合函数索引生效吗 聚合函数的使用_字段_02


很明显结果不对,大多数员工虽然津贴(comm)是NULL值,但是他们还是有基本的月薪的啊,那么年薪为什么会为NULL?因为所有NULL参与运算的结果一定是NULL就是这么规定的!


3.4、查询员工的年薪(二)

mysql提供了ifnull(字段,指定的值)函数,可以将可能为null值的字段转换为指定的值。但是ifnull()并不是聚合函数!

select ename, (sal + ifnull(comm, 0))*12 yearsalary from emp;

聚合函数索引生效吗 聚合函数的使用_字段_03



4、count(列名)、count(1)、count(*)区别

它们三者的区别主要从:NULL值处理、以及执行速度方面进行比较,一般来说认为* 和 1会比较快,列名比较慢!

4.1、NULL值处理
  • count(*):包括所有的列,统计所有的行数,不忽略NULL值。
  • count(1):忽略所有的列,统计所有的行数,不忽略NULL值。
  • count(列名):只包括指定的那一列,在统计结果的时候会忽略NULL值。


4.2、执行速度

执行速度主要考虑是否主键、是否有索引的情况。

  • 列名为主键:count(1)= count(*)= count(列名) 三者的执行效率一样!
  • 列名不为主键且列名没有创建索引:count(1) = count(*)> count(列名)。
  • 列名不为主键且列名有创建索引:count(1) = count(*)= count(列名)。