首页 > 技术文章 > MySQL之常用函数及案例-分组函数及分组查询

hydd 2020-04-23 10:13 原文

  单行函数主要是对数据表中某一具体字段对应操作,而分组函数往往用于实现将一组数据进行统计计算,最终得到一个值,又称为聚合函数或统计函数,其简介及具体用法如下:

 

一、分组函数

分组函数清单:

 

案例1:

 

count的补充介绍

1.count(*) 统计结果集的行数

count(*) 在统计结果集的时候,只要这行有数据,即使个别字段为空也会被统计到;count(1)和count(*)等同,count(1)相当于在表中加了一个常量列,该列的所有字段都是1,最后统计有多少个1。

推荐使用count(*)。

区分:count(具体字段名)的使用场景是要统计指定字段不为空的行数,count(*)只要有一个字段不为空,都会统计。

 

2.搭配distinct实现去重的统计 

查询所有员工及其对应的部门id

员工表里涉及到了这个部门,就说明这个部门有员工

因为有一个员工是最高领导人,没有部门,所以是106

加入了 distinct就可以看有多少个部门

 

 

 

二、分组查询

分组查询的逻辑是先分组,再统计,其逻辑图如下:

分组查询的语法如下:

 

1.分组查询的查询列表往往是分组函数和被分组的字段

案例1:求每个部门的总工资

 

案例2:查询每个工种员工平均工资 

 

案例3: 查询每个领导的手下人数

 

 

 

 

 

 

案例4:查询邮箱中包含a字符的 每个部门的最高工资

 

 

 

案例5:查询每个领导下有奖金的员工的平均工资

 

 

2.分组后的筛选:

在group by前面添加where count(*) > 5 限定员工人数大于五,由于此时还没有分组完成,系统不知道count(*)的具体指代对象,所以我们要在GROUP BY后,使用HAVING来对分组函数值进行限定;分组函数(比如COUNT(*))做条件,只可能放在having后面。

分组前使用where来限定,分组后用having来限定。

 

案例1:查询哪个部门的员工人数>5

 

 

 

 案例2:每个工种有奖金的员工的最高工资>12000的工种编号和最高工资

分析需求:

需要:job_id和MAX(salary)

限定:奖金不为空(判断奖金不为空,不是分组函数,所以放在WHERE后,GROUP BY之前)和最高工资大于12000(MAX为分组函数,所以在HAVING后)

所以我们的SQL语句如下:

 

 案例3:领导编号>102的,每个领导手下的最低工资大于5000的最低工资

 

 

案例4:查询有奖金的员工的最高工资>6000的工种编号和最高工资,按最高工资升序

 

案例5: 查询每个工种每个部门的最低工资,并按最低工资降序

工种和部门都一样,才是一组

 

推荐阅读