MySql 分组查询

一、分组查询

功能:用作统计使用,又称聚合函数或统计函数或组函数

1.基础用法

  1. sum() 求和
  2. avg() 求平均值
  3. max() 求最大值
  4. min() 求最小值
  5. count() 计算个数
select sum(字段), avg(字段),max(字段),min(字段),count(字段)from 表名;

2.支持参数类型

  1. sum() avg()一般用于处理数值型。max(),min(),count()可以处理任何类型
  2. 以上分组函数都忽略null值
  3. 可以和distinct搭配使用
select sum(distinct salary),sum(salary) from deployees;
  1. count()函数的详细介绍
select count(salary) from employees;	//计算工资列的行数
select count(*) from employees;		//计算表的函数(效率更好)
select count(1) from employees;		//计算1的列数(会自动在表前面增加一列)
  1. 和分组函数一同查询的字段要求是 group by后的字段
查询员工表中最大的入职时间和最小入职时间的相差天数(datediff)
select dattediff(max(hiredate),min(hiredate)) as D from employees;

二、分组查询进阶

语法:
select 分组函数,列(要求出现在group by的后面) from 表名 【where 筛选条件】 group by 分组的列表 【order by 字句】
特点:

  1. 分组查询中的筛选条件分为两类:分组前筛选 (查询的是原始表 , 位置是 group by字句的前面 使用的是关键在 where); 分组后筛选(查询的分组后的结果集 ,位置是group by字句的后面 ,使用的是关键字 having)
  2. 分组函数做条件肯定是放在having 字句中
  3. group by子句支持单个字段分组,多个字段分组(多个字段之间用逗号分开),没有顺序要求,表达式或是函数
  4. 也可以添加排序(排序放在整个分组查询的最后)

1、简单的分组查询

  1. 查询每个工种的最高工资
select max(salary),job_id from employees group by job_id;
  1. 查询每个位置上的部门个数
select count(*),loaction_id from departments group by location_id;

2、添加分组前筛选条件查询

  1. 查询邮箱中包含a字符的,每个部门的平均工资
select avg(salary),department_id from employees where email like "%a%" group by department_id ;
  1. 查询有奖金的每个领导手下员工的最高工资
select max(salary),manager_id from employees where commission_pct is not null group by manager_id ;

3、添加分组后的筛选条件

  1. 查询哪个部门的员工个数 > 2
select count(*),department_id from employees group by department_id having count(*) > 2;
  1. 查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
① 查询每个工种有奖金的员工的最高工资
select max(salary),job_id from employees where commission_pct is not null group by job_id;
② 根据①的结果继续筛选,最高工资>12000
select max(salary),job_id from employees where commission_pct is not null group by job_id having max(salary) > 12000;
  1. 查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,已及其最低工资
① 查询领导编号>102的每个领导手下的最低工资
select min(salary),manager_id from employees where manager_id > 102 group by manager_id;
② 查询工资> 5000,的领导编号和最低工资
select min(salary),manager_id from employees where manager_id > 102 group by manager_id having min(salary)>5000;

4、按函数分组

  1. 按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数 > 5的有哪些
① 查询每个长度的员工个数
select count(*),length(last_name) len_name from employees group by length(last_name);
② 添加筛选条件
select count(*),length(last_name) len_name from employees group by length(last_name) having count(*)>5;

5、按多个字段分组

  1. 查询每个部门每个工种的员工的平均工资
select avg(salary),department_id,job_id from employees group by department_id,job_id;

6、添加排序

  1. 查询每个部门每个工种的员工的平均工资,并且按平均工资的高低显示
select avg(salary),department_id,job_id from employees group by department_id,job_id order by avg(salary) desc;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值