MySQL笔记--MySQL分组函数和分组查询
Posted Al_tair
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL笔记--MySQL分组函数和分组查询相关的知识,希望对你有一定的参考价值。
mysql分组函数和分组查询
我们已经学习完常见函数,接下来我们涉足分组函数和分组查询,跟上我的步伐!
进阶5:分组函数
分组函数(聚合函数)
功能:用作统计使用,又称作聚合函数或统计函数或组函数
分类:以下是官方的MySQL5.7给出的表格
1.简单的使用
使用起来简单,方便!
SELECT SUM(salary) FROM employees # 691400.00
SELECT AVG(salary) FROM employees # 6461.682243
SELECT MIN(salary) FROM employees # 2100.00
SELECT MAX(salary) FROM employees # 24000.00
SELECT COUNT(salary) FROM employees # 107
# 可以全部放在一起
SELECT SUM(salary) AS "和",AVG(salary) AS "平均" FROM employees
2.参数支持哪些类型
现在我们知道直接用这些函数了,但是我们应该传入什么类型的值呢?
# 注意都是忽略NULL值
SUM(),AVG(); # 支持数值型,
MAX(),MIN(); # 支持数值型,字符型,日期型(但是日期是按日期上的数值大小比较,无关时间早晚)
COUNT(); # 可以计算字符型
3.和distinct搭配
实现去重(DISTINCT)的求和 SUM( )
SELECT SUM(DISTINCT salary) AS "工资" FROM employees; # 397900.00
SELECT COUNT(DISTINCT salary) AS "人数" FROM employees; # 57
4, count 函数的"特殊优待"
# 常用于统计人数(防止受NULL影响)
SELECT COUNT(*) FROM employees; # 107
# 在每一列前面加1这一列,统计1的行数,所以以此类推括号内放入常量就可以实现统计
SELECT COUNT(1) FROM employees; # 107
# 拓展 效率
#在 MYISAM 存储引擎下,COUNT(*)效率高
#在 INNODB 存储引擎下,COUNT(*)和COUNT(1)的效率差不多,比COUNT(字段)要高一些
#总结:还是用 COUNT(*)比较好!
5.和分组函数一同查询的字段有限制
要求:group by 后的字段
什么是group by 后的字段 ,请看下文分组查询!
案例测试
查询公司员工工资的最大值,最小值,平均值,总和
SELECT MAX(salary) AS MAX, MIN(salary) AS MIN,
AVG(salary) AS AVG,SUM(salary) AS SUM
FROM employees
查询员工表中的最大入职时间和最小入职时间的相差天数(DATEDIFF)
# 可以用来查询你出生到现在多久了
SELECT DATEDIFF(NOW(),"2000-8-30"); # 7595
# 该题无非是替换上述参数而已
SELECT DATEDIFF(MAX(hiredate),MIN(hiredate))
FROM employees
查询部门编号为90的员工个数
SELECT COUNT(*) AS "员工个数"
FROM employees
WHERE department_id = 90;
进阶6:分组查询
在实际SQL应用中,经常需要进行分组聚合,即将查询对象按一定条件分组,然后对每一个组进行聚合分析。创建分组是通过GROUP BY子句实现的。与WHERE子句不同,GROUP BY子句用于归纳信息类型,以汇总相关数据。GROUP BY的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。
引入:查询每个部门的平均工资
可以使用GROUP BY子句将表中的数据分成若干组
语法
select 分组函数,列(出现在group by的后面)from 表
【where 筛选条件】
group by 分组的列表
【order by 子句】
注意
查询列表必须特殊,要求是分组函数和group by 后出现的字段
# 总部门的平均工资
SELECT AVG(salary) AS ”工资“
from employees;
# 每个部门的平均工资(体现分组思想)
SELECT AVG(salary)
FROM employees
GROUP BY department_id;
简单的分组查询 easy!(无条件筛选)
案例1:查询每个工种的最高工资
SELECT MAX(salary),job_id
FROM employees
GROUP BY job_id;
案例2:查询每个位置上的部门个数
SELECT COUNT(*),location_id
FROM departments
GROUP BY location_id;
添加分组前筛选条件
案例1:查询邮箱中包含a字符的,每个部门的平均工资
SELECT AVG(salary) AS "工资"
FROM employees
WHERE email LIKE "%a%"
GROUP BY department_id;
案例2:查询有奖金的每个领导手下员工的最高工资
SELECT MAX(salary),manager_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id;
添加分组后筛选条件
如果你觉得复杂的话,可以分成两步骤进行完成它!
案例1:查询哪个部门的员工人数>2
思路:
1.查询每个部门的员工人数
SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id;
2.根据1的结果进行筛选,查询哪个部门的员工人数>2
HACING 新用法
放在全部后面意思指的是在之前的查找结果再进行进一步筛选
SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id
HAVING COUNT(*)>2;
案例2:查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
1.查询每个工种有奖金的员工的最高工资
SELECT MAX(salary),job_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id;
2.根据1结果继续筛选,最高工资大于12000
SELECT MAX(salary),job_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000;
案例3:查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及最低工资
SELECT manager_id,MIN(salary)
FROM employees
WHERE manager_id>102
GROUP BY manager_id
HAVING MIN(salary)>5000
添加分组前后筛选条件特点总结
数据源 位置 关键字
分组前筛选 原始表 group by子句的前面 where
分组后筛选 分组后的结果集 group by子句的后面 having
1.分组函数做条件肯定是放在having子句中
2.能分组前筛选就先考虑分组前筛选
按表达式或函数分组
案例1:按员工姓名的长度分组,查询每一组的员工个数,筛选员工人数>5的有那些?
1.查询每个长度的员工个数
回顾下 LENGTH() 的用法
SELECT COUNT(*),LENGTH(last_name) "名字长度"
FROM employees
GROUP BY LENGTH(last_name);
2.添加筛选条件
注意mysql 中 group by 和 having 后面是支持别名的,但是where 后面不支持
SELECT COUNT(*),LENGTH(last_name) "名字长度"
FROM employees
GROUP BY LENGTH(last_name)
HAVING COUNT(*)>5;
按多个字段进行分组
案例1:查询每个部门每个工种的员工的平均工资
SELECT AVG(salary),department_id,job_id
FROM employees
GROUP BY department_id,job_id;
添加排序
案例1:查询每个部门每个工种的员工的平均工资,并且按平均工资的高低显示(筛选条件:部门编号不为空,平均工资大于10000)
注意位置放置 order by ,where , group by , having
SELECT AVG(salary) AS AVG,department_id,job_id
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id,job_id
HAVING AVG > 10000
ORDER BY AVG DESC;
总结:
我觉得学习MySQL语句更多在于练习,其实概念很简单,可以很快掌握,本章节主要就是涉及分组函数和分组查询,我觉得语句顺序和语句逻辑尤为重要,然后就可以加快学习进度了,多思多练即可,没什么难学的知识点!加油!继续坚持下去!
以上是关于MySQL笔记--MySQL分组函数和分组查询的主要内容,如果未能解决你的问题,请参考以下文章