语法
select 分组函数,列 (出现在gourp by的后面)
from 表
[where 筛选条件]
group by 分组列表
[order by 子句]
注意:查询列表必须特殊,要求是分组函数和gourp by后出现的字段
特点
1.分组查询中的筛选条就按分为两类:
属于源 位置 关键字
分组前筛选 原始表 group by子句前面 where
分组后筛选 分组后结果表 group by子句后面 having
① 分组函数作条件的肯定刚在Having子句中
②能用分组前筛选的,优先考虑分组前筛选
2. group by自居支持单个字段分组,多个字段分组
3. 可以添加排序,在分组查询后面
1 简单分组
#查询邮箱中包含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 对分组后的结果进行二次查询 Having关键字
#查询哪个部门的员工数>2
SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id
HAVING COUNT(*)>2;
#查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
SELECT MAX(salary),job_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000;
#查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,及对应最低工资
SELECT MIN(salary),manager_id
FROM employees
WHERE manager_id>102
GROUP BY manager_id
HAVING MIN(salary)>5000;
3 按多个字段分组,注意顺序
#查询每个部门的每个工种的员工得平均工资
SELECT AVG(salary),department_id,job_id
FROM employees
WHERE department_id IS NOTNULL
GROUP BY job_id,department_id;
添加排序
#查询每个部门每个工种员工得平均工资,并且按照平均工资的高低来显示
SELECT AVG(salary) a,department_id,job_id
FROM employees
WHERE department_id IS NOTNULL
GROUP BY job_id,department_id
ORDER BY a DESC;