六:分组函数和分组查询(GROUP BY)
转载#进阶5:分组函数
/*
说明:分组函数往往用于实现将一组数据进行统计计算,最终得到一个值,有称为聚合函数或统计函数
分组函数清单
sun(字段名):求和
avg(字段名):求平均数
max(字段名):求最大值
min(字段名):求最小值
count(字段名):计算非空字段值的个数
*/
#案例1:查询员工信息表中,所有员工的工资和,工资平均值,最低工资,最高工资,有工资的个数
SELECT SUM(`salary`),AVG(`salary`),MIN(`salary`),MAX(`salary`),COUNT(`salary`) FROM `employees`;
#案例2:添加筛选条件
#1、查询emp表中的记录数
SELECT COUNT(`employee_id`) FROM `employees`;
#2、查询emp表中有佣金的人数
SELECT COUNT(`salary`) FROM `employees`; #10进行
#3、查询emp表中月薪大于25000的人数
SELECT COUNT(`salary`) FROM `employees` WHERE `salary`>25000;
#4、查询有领导的人数
SELECT COUNT(`manager_id`) FROM `employees`;
#count 的补充介绍
#1、统计结果集的行数,推荐使用count(*)
SELECT COUNT(*) FROM `employees`; #统计表的行数
SELECT COUNT(1) FROM `employees`; #统计表的行数,相当于加了一行,每行都是1,最后统计有多少个1
SELECT COUNT('王金') FROM `employees`; ##统计表的行数,相当于加了一行,每行都是‘王金’,最后统计有多少个‘王金’
SELECT COUNT(*) FROM `employees` WHERE `department_id`=30;
#2、搭配distinct实现去重的统计
#需求:查询有员工的部门个数
SELECT COUNT(DISTINCT `department_id`) FROM `employees`;
#分组查询(GROUP BY)
#案例:每个部门的总工资、平均工资?
SELECT SUM(`salary`),`department_id`
FROM `employees`
GROUP BY `department_id`;
SELECT AVG(`salary`),`department_id`
FROM `employees`
GROUP BY `department_id`;
分组查询
/*
语法:
select 查询列表
from 表名
where 分组前的筛选条件
group by 分组列表
having 分组后筛选
order by 排序列表
执行顺序:
(1)from
(2)where
(3)group by
(4)having
(5)select
(6)order by
特点:
1、查询列表往往是 分组函数和被分组的字段
2、分组查询中的筛选分为两类
筛选的基表 使用的关键词 位置
分组前筛选 原始表 where group by的前面
分组后筛选 分组后的结果集 having group by的后面
where——group by——having
分组函数(count(*),max()等)做条件只可能放在 having 后面!!!
*/
#1、简单查询
#案例1:查询每个工种的员工平均工资
SELECT AVG(`salary`),`job_id`
FROM `employees`
GROUP BY `job_id`;
#案例2:查询每个领导的手下人数
SELECT COUNT(*),`manager_id`
FROM `employees`
WHERE `manager_id` IS NOT NULL
GROUP BY `manager_id`;
#2、可以实现分组的筛选
#案例1:查询邮箱中包含a字符的 每个部门的最高工资
SELECT MAX(`salary`) 最高工资,`department_id`,`email`
FROM `employees`
WHERE `email` LIKE '%a%'
GROUP BY `department_id`;
#案例2:查询每个领导手下有奖金的员工的平均工资
SELECT AVG(`salary`),`manager_id`
FROM `employees`
WHERE `commission_pct` IS NOT NULL
GROUP BY `manager_id`;
#3、可以实现分组后的筛选
#案例1:查询哪个部门的员工个数>5
#分析1:查询每个部门的员工个数
SELECT COUNT(*) 员工个数,`department_id`
FROM `employees`
GROUP BY `department_id`;
#分析2:在刚才结果的基础上,筛选哪个部门的员工人数>5
SELECT COUNT(*) 员工个数,`department_id`
FROM `employees`
GROUP BY `department_id`
HAVING COUNT(*)>5;
#案例2:每个工种有奖金的员工的最高工资>12000得工种编号和最高工资
SELECT `job_id`,MAX(`salary`)
FROM `employees`
WHERE `commission_pct` IS NOT NULL
GROUP BY `job_id`
HAVING MAX(`salary`)>12000;
#案例3:领导编号>120 的每个领导手下的最低工资 大于5000的最低工资
SELECT MIN(`salary`) 最低工资,`manager_id`
FROM `employees`
WHERE `manager_id`>102
GROUP BY `manager_id`
HAVING MIN(`salary`)>5000;
#4、可以实现排序
#案例:每个工种有奖学金的员工的最高工资>6000的工种编号和最高工资,按最高工资升序
SELECT MAX(`salary`) 最高工资,`job_id`
FROM `employees`
WHERE `commission_pct` IS NOT NULL
GROUP BY `job_id`
HAVING MAX(`salary`)>6000
ORDER BY MAX(`salary`) ASC;
#5、按多个字段分组
#案例:查询每个工种每个部门的最低工资,并按最低工资降序(提示:工种和部门都一样,才是一组)
工种 部门 工资
1 10 10000
1 20 2000
2 20
3 20
1 10
2 30
2 20
SELECT MIN(`salary`) 最低工资,`job_id`,`department_id`
FROM `employees`
GROUP BY `job_id`,`department_id`
ORDER BY MIN(`salary`) DESC;
本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。

提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
mysql_分组查询_函数和字段分组查询mysql