4--mysql DQL--分组查询

语法

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;

猜你喜欢

转载自blog.csdn.net/weixin_40719943/article/details/106656694
今日推荐