MySQL基础篇之分组查询

Posted nuist__NJUPT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL基础篇之分组查询相关的知识,希望对你有一定的参考价值。

mysql基础篇之分组查询

简单分组函数的使用:

#简单分组函数的使用
  select max(salary) from employees;
  select min(salary) from employees;
  select avg(salary) from employees;
  select count(salary) from employees;
  select sum(salary) from employees; 

也可以这样写:

select max(salary) 最高工资, min(salary) 最低工资, sum(salary) 工资和, avg(salary) 平均工资, count(salary) 个数
 from employees;

注意:sum(),svg()函数只能处理数字类型
max(),min(),count()函数可以处理任意类型
以上分组函数忽略null值

分组函数和distinct搭配使用:

#分组函数和distinct搭配使用
  select count(distinct salary) from employees;

注意:一般使用count(*)统计行数
和分组函数一同查询的字段要求是group by后的字段

查询员工表中最大入职时间和最小入职时间的天数差:

#查询员工表中最大入职时间和最小入职时间的天数差
    select datediff(max(hiredate),min(hiredate))
    from employees;

查询部门编号为90的员工个数:

 #查询部门编号为90的员工个数
    select count(*)
    from employees
    where department_id = 90;

查询每个部门的员工的平均工资:

 #查询每个部门的员工的平均工资
    select avg(salary)
    from employees
    group by department_id ;

查询每个工种的最高工资:

#查询每个工种的最高工资
    select max(salary), job_id as 工种
    from employees
    group by job_id;

查询每个位置上的部门个数:

#查询每个位置上的部门个数
    select count(*), location_id
    from departments
    group by location_id;

查询邮箱种包含a字符的,每个部门的平均工资:

#查询邮箱种包含a字符的,每个部门的平均工资
    select avg(salary), department_id
    from employees
    where email like '%a%'
    group by department_id;

查询每个领导手下有奖金的员工的最高工资:

 #查询每个领导手下有奖金的员工的最高工资
    select max(salary), manager_id
    from employees
    where salary is not null
    group by manager_id;

查询哪个部门的员工个数大于2:
分组后的筛选

#查询哪个部门的员工个数大于2
    select count(*), department_id
    from employees
    group by department_id
    having count(*) > 2 ;

查询每个工种有奖金的员工的最高工资大于12000的员工编号和最高工资:

#查询每个工种有奖金的员工的最高工资大于12000的员工编号和最高工资
    select job_id, max(salary)
    from employees
    where commission_pct is not null
    group by job_id
    having max(salary) > 12000;

查询领导编号大于102的每个领导手下的最低工资大于5000的领导编号以及最低工资:

 #查询领导编号大于102的每个领导手下的最低工资大于5000的领导编号以及最低工资
 select manager_id, min(salary)
    from employees
    where manager_id > 102
    group by manager_id
    having min(salary) > 5000;

注意:分组函数做条件,一定属于分组后的筛选,需要放到having字句中,能用分组前筛选的,尽量使用分组钱筛选

按员工姓名的长度分组,查询每一组的员工个数,筛选出员工个数大于5的:

#按员工姓名的长度分组,查询每一组的员工个数,筛选出员工个数大于5的
    select count(*)
    from employees
    group by length(last_name)
    having count(*) > 5;

按多个字段分组
查询每个部门,每个工种的员工的平均工资:

#按多个字段分组
     #查询每个部门,每个工种的员工的平均工资
     select avg(salary) 平均工资, department_id 部门, job_id 工种
     from employees
     group by 部门, 工种;

注意:group by 支持单个字段分组,也支持多个字段分组,用逗号隔开即可,也可以添加排序,排序是放在整个分组查询之后的。

查询各个管理者手下的员工最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内:

 #查询各个管理者手下的员工最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内
    select min(salary), manager_id
    from employees
    where manager_id is not null
    group by manager_id
    having min(salary) >= 6000;

查询所有部门的编号,员工数量和工资平均值,并按平均工资排序:

 #查询所有部门的编号,员工数量和工资平均值,并按平均工资排序
     select department_id, count(*), avg(salary)
     from employees
     group by department_id
     order by avg(salary);

选择每个工种下的员工数:

 #选择每个工种下的员工数
    select count(*)
    from employees
    group by job_id;

以上是关于MySQL基础篇之分组查询的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据库篇之单表查询

Mysql基础篇之索引上--04

Mysql基础篇之事务隔离---03

MySQL基础篇之常用基本命令

MySQL基础-06DQL语言(数据查询语言)-进阶5分组查询

Mysql原理篇之索引不懂不要瞎用---04