标签:group job 筛选 分组 DQL 查询语言 id select
分组查询
语法:
select 分组函数,列(要求出现在group by的后面) from 表名 where 筛选条件 group by 分组的列表【having分组后的筛选】 【order by子句】
执行顺序:①from 表名 ②where 筛选条件 ③group by分组的列表 ④having分组后的筛选 ⑤select 分组函数,列 ⑥order by 子句
注意:查询列表必须特殊,要求是分组函数和group by后出现的字段。
- 添加分组前的筛选条件
案例一:查询每个工种的最高工资
select max(`salary`),`job_id` from employees group by `job_id`;
案例二:查询每个位置上的部门个数
select count(*),location_id from departments group by `location_id`;
案例三:查询邮箱中包含a字符的每个部门的平均工资
select avg(salary),department_id from employees where email like '%a%' group by department_id;
案例四:查询有奖金的每个领导手下员工的最高工资
select max(salary),manager_id from employees where commission_pct is not null group by manager_id;
- 添加分组后的筛选条件(having)
案例五:查询哪个部门的员工个数大于2
解题步骤:①查询每个部门的员工个数 ②根据①的结果进行筛选
select count(*),department_id from employees group by department_id having count(*)>2;
案例六:查询每个工种有奖金的员工的最高工资大于12000的工种编号和最高工资
解题步骤:①查询每个工种有奖金的员工的最高工资 ②最高工资大于12000的工种编号和最高工资
select max(salary),job_id from employees where commission_pct is not null group by job_id having max(salary)>12000;
案例七:查询领导编号大于102的每个领导手下员工最低工资大于5000的领导编号是哪个,以及其最低工资
解题步骤:①查询领导编号大于102的每个领导手下最低工资 ②最低工资大于5000的领导编号及最低工资
select min(salary),manager_id from employees where manager_id>102 group by manager_id having min(salary)>5000;
总结:分组查询中的筛选条件分为两类,第一类叫分组前筛选,第二类叫分组后筛选,分组前筛选的数据源是原始表,分组后筛选的数据源是分组后的结果集,分组前筛选位置在group by 子句之前,分组后筛选位置在group by 子句之后。分组前筛选用的是where,分组后筛选用的是having.分组函数做条件一定要放在having子句中。能用分组前筛选的,就优先考虑分组前筛选。
使用关键字 | 筛选表 | 位置 | |
---|---|---|---|
分组前筛选 | where | 原始表 | group by的前面 |
分组后筛选 | having | 分组后的结果 | group by的后面 |
- 按表达式或函数分组
案例一:按员工姓名长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些
解题步骤:①查询每个长度的员工个数 ②添加筛选条件员工个数>5
select count(*),length(last_name) from employees group by length(last_name) having count(*)>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(salary) desc;
总结:group by子句支持单个字段分组,也支持多个字段分组(多个字段用 , 隔开,没有顺序要求),也可以添加排序,排序放到最后面
练习一:查询各job_id的员工的最大值,最小值,平均值,总和,并按job_id升序
select max(job_id),min(job_id),avg(job_id),sum(job_id),job_id from employees group by job_id order by job_id;
练习二:查询员工最高工资和最低工资的差距
select (max(salary) - min(salary)) difference from employees;
练习三:查询各个管理者手下员工的最低工资,其中最低工资不能低于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 order by avg(salary) desc;
练习五:选择具备各个job_id的员工个数
select count(*),job_id from employees group by job_id;
标签:group,job,筛选,分组,DQL,查询语言,id,select 来源: https://blog.csdn.net/ai123ai123456789/article/details/114479542
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。