本教程中所使用的数据库的建表语句都在“SQL教程——索引”这篇文章中,点击链接直达:索引&建表语句
摘要:本文主要介绍SQL的常见函数中的分组函数
分组函数
功能:用作统计使用,又称为聚合函数或统计函数或组函数
分类:sum 求和、avg 平均值、 max 最大值、 min 最小值、 count 计算个数
特点: 1、sum、avg一般用于处理数值;
max、min、count可以处理任何类型。
2、以上分组函数都忽略null值。
3、可以和distinct搭配,实现去重。
4、一般使用count(*)用做统计计数
5、和分组函数一同查询的字段要求:必须是group by后的字段,不能用了这5个函数之一后,后边又跟上了其它字段,如select min(salary), employee_id from employees; 这样的语句逻辑上是不对的。
1、简略使用方法
select sum(salary) from employees;
select avg(salary) from employees;
select min(salary) from employees;
select max(salary) from employees;
select count(salary) from employees;
select sum(salary) 和, avg(salary) 平均, max(salary) 最高, min(salary) 最低, count(salary) 统计 from employees;
#当然也可以嵌套其它函数使用:
select sum(salary) 和, round(avg(salary), 2) 平均, max(salary) 最高, min(salary) 最低, count(salary) 统计 from employees;
2、传入参数注意事项
#sum 和 avg 这两个函数只能传入数值,不能传入字符和日期,传入字符和日期不会报错但是会输出0
select sum(last_name), avg(first_name) from employees; 两项的值都为0,不仅如此,传入日期也会gg,不报错但没用。
#max和min可以传入字符和日期,因为字符和日期可以排序(字典排序),类似的,order by后面也是可以跟上字符或日期的。
select max(last_name) 最大名字, min(last_name) 最小名字 from employees;
select max(hiredate) 萌新, min(hiredate) 大佬 from employees;
select count(last_name) from employees;
select count(commission_pct) from employees; #不计为null的值
#所以,只有sum和avg两个函数只能传入数值,其它三个min、max、count可以同时接收数值、字符、日期。
3、和distinct搭配
select sum(distinct salary), sum(salary) from employees;
select count(distinct salary), count(salary) from employees; #前者用了去重,计算有几种工资,后者不去重,代表统计一共有多少非null的工资。
4、count函数的详细介绍
select count(commission_pct) from employees; #不count为null值
select count(*) from employees; #count所有的行数
select count(1) from employees; #相当与count(*),为什么呢? 因为count(1)就相当于为每一行数据都加了一个值为1的字段,然后统计该1的值!,不仅如此,只要是常亮都是如此。
#放常亮和放*的效率比较:
myisam存储引擎下, count(*)效率高
innodb存储引擎下,count(*)和count(1)效率差不多,但要比count(字符)效率高一些。
5、和分组函数一同查询的字段有限制
select avg(salary), employee_id from employees; #逻辑上有错误,输出一行结果: 6461.682243 100
#小问题:
计算最早入职和最晚入职员工的入职时间相差多少天:
select datediff(max(hiredate), min(hiredate)) "萌新和大佬的差距(单位光年)" from employees; #注意不能max和min的位置写反了,默认是第一个数减去第二个
计算部门编号为90的员工的个数
select count(*) from employees where department_id = 90;