MySQL 查询语句--------------进阶5:分组查询

#进阶5:分组查询
/*
   select 分组函数,列(要求出现在group by的后面)
   from 表 【where 筛选条件】 group by 分组的列表 【order by 子句】
注意:
    查询列表必须特殊,要求是分组函数和group by后出现的字段
特点:
	1.分组查询中的筛选条件分为两类
			数据源			位置		关键字
	分组前筛选      原始表		     group by  前	where
	分组后筛选      分组后的结果集	     group by  后	having

	分组函数做条件,一定是放在having子句之中

	group by子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开没有顺序要求),表达式或者函数(用的较少)
	也可以添加排序(排序放在分组查询的最后)

*/

# 引入:查询每个部门的平均工资
select avg(salary) from employees; #这个是整个表格的基本工资
#需要拆分小组
select avg(salary),department_id from employees group by department_id; #这个结果不太对

select distinct department_id from employees;

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

#案例2:查询每个位置上的部门个数
select count(department_id),location_id from departments group by location_id;


#添加  分组前  筛选条件
#案例1:查询邮箱中包含a字符的,每个部门的平均工资
select avg(salary),department_id from employees where email like "%a%" group by department_id;

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

#添加  分组后 的复杂的筛选条件
#案例1:查询哪个部门的员工个数>2
select count(*),department_id from employees where count(*)>2 group by department_id; #这个是错误的,因为employees中没有 count(*)>2
这里使用having
select count(*),department_id from employees group by department_id  having count(*)>2 ;

#案例2:查询每个工种有奖金的员工,他们的最高工资>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; 

#案例3:查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及其最低的工资
筛选条件:
where manager_id>102
having min(salary)>5000
完整:
select min(salary),manager_id from employees where manager_id>102 group by manager_id having min(salary)>5000;


#  group by 后跟 表达式或者分组函数(可以不是简单的字段)
#案例:按照员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些
select count(employee_id),length(last_name) from employees group by length(last_name) having count(employee_id)>5;


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


# 添加排序
#案例:查询每个部门每个工种的员工的平均工资,并且按照平均工资的高低显示
select avg(salary),department_id,job_id from employees group by department_id,job_id order by avg(salary) desc;
order by 后面可以跟函数语句。



#题目1:查询各个job_id的员工工资的最大值、最小值、平均值、总和,并按照job_id升序
select max(salary),min(salary),avg(salary),sum(salary),job_id from employees group by job_id order by job_id asc;

#题目2:查询员工最高工资和最低工资的差距(difference)
select max(salary)-min(salary)  difference from employees;

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

#题目4:查询所有部门的编号,员工数量和工资的平均值,并按照平均工资降序
select count(employee_id),avg(salary),department_id from employees group by department_id order by avg(salary) desc;

#题目5:选择具有各个job_id的员工人数
select count(*),job_id from employees group by job_id;

  

猜你喜欢

转载自www.cnblogs.com/ivyharding/p/11542165.html