本教程中所使用的数据库的建表语句都在“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;

sql server分组展示并按组内合计数排序 sql 分组求和_存储引擎