mysql分组查询
语法
select 分组函数,分组后的字段 (5)
from 表 (1)
【where 筛选条件】 (2)
group by 分组的字段 (3)
【having 分组后的筛选】 (4)
【order by 排序列表】 (6)
执行顺序:按照上述语法中标注的
举例:
eg:查询每个工种的最高工资
SELECT MAX(salary) max_salary,job_id
FROM employees
GROUP BY job_id;
eg:查询每个位置上的部门个数
SELECT COUNT(*),location_id
FROM departments
GROUP BY location_id;
加上筛选条件【分组前筛选】
eg:查询邮箱中包含a字符,每个部门的平均工资
SELECT AVG(salary),department_id
FROM employees
WHERE email LIKE ('%a%')
GROUP BY department_id;
eg:查询有奖金的每个领导手下员工的最高工资
SELECT MAX(salary),manager_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id;
添加复杂条件 【分组后筛选】
eg:查询哪个部门的员工个数>2
select count(*),department_id
from employees
group by department_id
having count(*)>2;
eg:查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
SELECT MAX(salary) max_salary,job_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING max_salary>12000;
eg:查询领导编号>102的每个领导手下的最低工资>500的领导编号是哪个,以及其最低工资
SELECT MIN(salary) min_salary,manager_id
FROM employees
WHERE manager_id>102
GROUP BY manager_id
HAVING min_salary>5000;
特点
1、分组查询中的筛选条件分两类
使用关键字 | 筛选的表 | 位置 | |
---|---|---|---|
分组前筛选 | where | 原始表 | group by前面 |
分组后筛选 | having | 分组后的结果 | group by后面 |
①分组函数做条件肯定是放在having子句中
②能用分组前筛选的,就优先考虑使用分组前
2、group by子句中支持单个字段分组,多个字段分组(多个字段之间用逗号隔开,无顺序要求)
3、也可以添加排序(排序放在整个分组查询的最后)
按函数分组
eg:按员工的姓名长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些
SELECT COUNT(*) people,LENGTH(last_name) len_name
FROM employees
GROUP BY len_name
HAVING people;
分组查询练习
eg1:查询各个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;
eg2:查询员工最高工资和最低工资的差距(DIFFRENCE)
SELECT MAX(salary)-MIN(salary) DIFFRENCE
FROM employees;
eg3:查询各个管理者手下的员工的最低工资,其中最低工资不能低于6000,没有管理者和的员工不计算在内
select min(salary),manager_id
from employees
where manager_id is not null
group by manager_id
having min(salary)>=6000;
eg4:查询所有部门的编号,员工数量和工资平均值,并按平均工资降序
SELECT department_id,COUNT(*),AVG(salary)
FROM employees
GROUP BY department_id
ORDER BY AVG(salary) DESC;
eg5:查询具有各个job_id的员工人数
select count(*) 个数,job_id
from employees
group by job_id;
还没有评论,来说两句吧...