1. 语法
select 分组函数,列名(要求出现在group by的后面)
from 表
【where 分组前的筛选条件】
group by 分组列表
【having 分组后的筛选条件】
注意:
* group by、having后面是支持别名的
* 能用分组前筛选也能用分组后筛选的,建议用where筛选
* group by 支持单个字段分组、多个字段分组(多个字段用逗号分隔,没有前后顺序),也支持按分组函数和表达式分组
* 可以添加排序,排序是放在整个分组查询的最后的,排序作用于分组查询的结果集
* group by, order by 后面跟数字,指的是 select 后面选择的列(属性),1 代表第一个列(属性),依次类推。
2. where和having
having放在group by之后,是先分组后过滤,可以用分组函数,having作用于临时表/结果集,支持别名
where放在group by之前,是先过滤后分组,不可以用分组函数,where作用于原表,不支持别名
3. 案例
-- 查询每个工种的最高工资
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;
-- 查询哪个部门的员工个数大于2
select department_id,count(*) from employees group by department_id having count(*)>2;
-- 按员工姓名的长度分组,查询每一组员工的个数,筛选员工个数大于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 job_id,department_id;
5. 分组查询1. 语法 select 分组函数,列名(要求出现在group by的后面) from 表 【where 分组前的筛选条件】 group by 分组列表 【having 分组后的筛选条件】 注意: * group by、having后面是支持别名的 * 能用分组前筛选也能用分组后筛选的,建议用where筛选 * group by 支持单个字段分组、多个字段分组(多个字段用逗号分隔,没有前后顺序),也支持按分组函数和表达式分组 * 可以添加排序,排序是放在整个分