MySQL——聚合函数和group by分组的使用
文章目录
- MySQL——聚合函数和group by分组的使用
- 1、聚合函数介绍
- 2、GROUP BY 分组
- 3、常见的聚合函数
- 4、SQL执行顺序
MySQL——聚合函数和group by分组的使用
1、聚合函数介绍
SQL聚合函数计算一组数据的集合并返回单个值。
除 COUNT 以外,聚合函数忽略空值,如果COUNT函数的应用对象是一个确定列名,并且该列存在空值,此时COUNT仍会忽略空值。
因为聚合函数对一组值进行操作,所以它通常与SELECT语句的GROUP BY子句一起使用,以计算为每个分组提供信息的度量。
2、GROUP BY 分组
分组是使用数据库时必须处理的最重要任务之一。 要将行分组,使用GROUP BY子句。
GROUP BY子句是SELECT语句的可选子句,它根据指定列中的匹配值将行组合成组,每组返回一行。
GROUP BY子句的语法:
SELECTcolumn1,column2,GROUP_FUNCTION (column3)
FROMtable1
WHEREa = b
GROUP BYcolumn1,column2
HAVINGc = d
ORDER BYcolumn2 DESC;
在SELECT子句中包含聚合函数不是强制性的。 但是,如果使用聚合函数,它将计算每个组的汇总值。
需要强调的是,在对行进行分组之前应用WHERE子句,而在对行进行分组之后应用HAVING子句。 换句话说,WHERE子句应用于行,而HAVING子句应用于分组。
要对组进行排序,请在GROUP BY子句后添加ORDER BY子句。
GROUP BY子句中出现的列称为分组列。 如果分组列包含NULL值,则所有NULL值都汇总到一个分组中,因为GROUP BY子句认为NULL值相等。
3、常见的聚合函数
函数名称 | 作用 |
---|---|
MAX | 查询指定列的最大值 |
MIN | 查询指定列的最小值 |
COUNT | 统计查询结果的行数 |
SUM | 求和,返回指定列的总和 |
AVG | 求平均值,返回指定列数据的平均值 |
AVG/ SUM 只适用于数值类型的字段(或变量)
MAX / MIN 适用于数值类型、字符串类型、日期时间类型的字段(或变量)
使用COUNT(*)、COUNT(1)、COUNT(具体字段) 哪个效率更高:
如果使用的是MyISAM存储引擎,则三者效率相同,都是O(1)
如果使用的是InnoDB存储引擎,则三者效率 COUNT(*) = COUNT(1) >COUNT(字段)
使用实例
-- AVG 计算每个部门的平均工资
SELECT e.department_id,department_name, ROUND(AVG(salary), 0) avg_salary
FROM employees e
JOIN departments d on e.department_id = d.department_id
GROUP BY department_name
ORDER BY department_name;-- SUM 返回每个部门中所有员工的总薪水
SELECT department_id, SUM(salary)
FROM employees
GROUP BY department_id;-- MAX / MIN 返回每个部门中员工的最低和最高薪水
SELECT department_name, MIN(salary) min_salary,MAX(salary) max_salary
FROM employees e
JOIN departments d on e.department_id = d.department_id
GROUP BY department_name
ORDER BY department_name;-- COUNT 返回每个部门的人数并根据部门名升序
SELECT department_name, COUNT(*) headcount
FROM employees e
JOIN departments d on e.department_id = d.department_id
GROUP BY department_name
ORDER BY department_name;-- 查询最低薪资大于6000的各个部门的信息、最高薪资和平均薪资
select e.department_id,department_name,min(salary) min_salary,max(salary) max_salary,round(avg(salary),2) average_salary
from employees e
join departments d on e.department_id = d.department_id
GROUP BY e.department_id
having min_salary > 6000
order by department_id ;-- 查找人数大于5的部门
SELECT e.department_id,department_name,COUNT(employee_id) headcount
FROM employees e
JOIN departments d ON d.department_id = e.department_id
GROUP BY e.department_id
HAVING headcount > 5
ORDER BY headcount DESC;#1.where子句可否使用组函数进行过滤?
-- 不可以#2.查询公司员工工资的最大值,最小值,平均值,总和
select max(salary),min(salary),avg(salary),sum(salary) from employees;#3.查询各job_id的员工工资的最大值,最小值,平均值,总和
select job_id, max(salary),min(salary),avg(salary),sum(salary)
from employees
group by job_id;#4.选择各个job_id具有的员工人数
select job_id,count(*)
from employees
group by job_id;#5.查询员工最高工资和最低工资的差距(DIFFERENCE)
select max(salary) - min(salary) DIFFERENCE
from employees;#6.查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内
select emp.employee_id,emp.manager_id, min(emp.salary) min_salary
from employees emp
join employees mang
on emp.manager_id = mang.employee_id
group by emp.manager_id
having min_salary >= 6000;
-- 或
select employee_id,manager_id, min(salary) min_salary
from employees
where manager_id is not null
group by manager_id
having min_salary >= 6000;#7.查询所有部门的名字,location_id,员工数量和平均工资,并按平均工资降序
select department_name,location_id,count(employee_id),round(avg(salary),2) avg_salary
from departments d
left join employees e on e.department_id = d.department_id
group by department_name
order by avg_salary desc;#8.查询每个工种、每个部门的部门名、工种名和最低工资
select department_name,job_id,min(salary)
from employees e
right join departments d on e.department_id = d.department_id
group by job_id, d.department_id;
4、SQL执行顺序
SELECT 语句的完整结构(SQL99)
select 去重 要查询的字段 from 表(注意:表和字段可以取别名)
xxxx join 要连接的表 on 等值判断(顺序:先on再where)
where (具体的值/子查询,不包含聚合函数的过滤条件)
group by(通过那个子段来分组)
having (过滤分组后的信息,条件和where一样,位置不同,包含聚合函数的过滤条件)
order by(通过哪个字段排序)
limit (分页)
SQL语句的执行顺序
MySQL——聚合函数和group by分组的使用相关推荐
- SELECT执行过程,MySQL聚合函数,多行分组函数,GROUP BY HAVING,详细完整可收藏
文章目录 1.聚合函数介绍 2.五个常用聚合函数 3.GROUP BY 4.HAVING 5.SELECT的执行过程 1.聚合函数介绍 聚合函数作用于一组数据,并对一组数据返回一个值.聚合函数不能嵌套 ...
- 10 MySQL聚合函数数据分组
目录 聚合函数 一.聚合函数定义: 二.聚合函数类型: 三.使用聚合函数的原则: 四.聚合函数说明 1.AVG 和 SUM 函数: 注意:AVG.SUM函数只对数字类型做处理,其他类型返回0: 1.1 ...
- mysql聚合函数count用法_MySQL中聚合函数count的使用和性能优化技巧
本文的环境是Windows 10,MySQL版本是5.7.12-log 一. 基本使用 count的基本作用是有两个: 统计某个列的数据的数量: 统计结果集的行数: 用来获取满足条件的数据的数量.但是 ...
- Mysql 聚合函数嵌套使用
Mysql 聚合函数嵌套使用 目的:Mysql 聚合函数嵌套使用 聚合函数不可以直接嵌套使用,比如: max(count(*)) 但是可以嵌套子查询使用(先分组取出count值, 再将count值倒序 ...
- 选择列表中的列……无效,因为该列没有包含在聚合函数或 GROUP BY 子句中
今天用SQL Server尝试实现一个SQL语句的时候,报了如标题所示的错误,通过在百度里面搜索,并亲自动手实现,终于发现问题所在,现在把它记录下来. 语句如下: select [OrderID],[ ...
- mysql单列去重复group by分组取每组前几条记录加order by排序
<div class="post"><h1 class="postTitle"><a id="cb_post_title ...
- 选择列表中的列'sc.cno'无效,因为该列没有包含在聚合函数或者group by 字句中《SQL中的group by该怎么用?》
1.SQL Server中,子查询不能返回多个值 2.子查询中不能包含ORDER BY子句 3.group by 可以将查询结果按某一列或多列的值进行分组.group by 一般是和聚合函数一起搭配使 ...
- mysql 聚合函数嵌套,Mysql 聚合函数嵌套使用操作
聚合函数不可以直接嵌套使用,比如: max(count(*)) 但是可以嵌套子查询使用 eg: 注:后面那个 as 必须要写 select max(total) from ( select count ...
- 选择列表中的列 '.......' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
错误:消息 8120,级别 16,状态 1,第 51 行 选择列表中的列 'Employee.EmployeeID' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中. 题目:查询最低收入 ...
最新文章
- 一文回顾深度学习十年发展
- selenium模拟H5触摸滑动之-TouchAction
- 论文浅尝 | SPARQL 语言的 ASK 查询表达性研究进展
- Python 分布式文件系统 Mongodb GridFS
- day16 java的访问控制权限
- c# mysql 连接
- android sim卡分析,Android 判断SIM卡属于哪个移动运营商详解及实例
- Spring boot设置文件上传大小限制
- 团队项目计划、人员安排以及开发方法
- 数字栅格地图矢量化及三维显示教程
- win7蓝牙热点自动断开
- 大学生破译周鸿祎手机号 李开复放 橄榄枝
- C语言实现简单的五子棋
- 深入浅出理解视频编码H.264结构
- Mysql数据库基础知识总结,结构分明,内容详细
- Cpu、核、Java Runtime.getRuntime().availableProcessors()
- 自己动手做一款蓝牙小车
- MySQL数据库基础知识,基础操作详细整理
- Linux 安装并配置 OpenLDAP 新编(1)快速入门指南
- JAVA学习笔记—JAVA SE(四)JAVA核心库类(下)
热门文章
- 文献阅读09期:基于ADMM方法的柔性负载实时定价
- 一、Python的应用场景
- 外贸知识通俗教程(中)
- 2023届秋招图像算法岗面经记录(TPlink(普联)、潮州三环、中电十所、科大讯飞、旷视、超参数、虹软、大华、速腾聚创、中兴、哲库、字节、OPPO、百度、之江实验室、蚂蚁、Intel、小米)
- 巨坑警告!程序员去银行写代码千万别去分行
- 欲借“菜篮子”生意赴美上市,叮咚买菜能解生鲜电商近渴吗?
- 骁龙660是32位还是64位_微信有32位与64位,很多人不知道~
- 2022保密教育线上培训考试 04
- 11_JavaScript数据结构与算法(十一)树
- ComboxBox 调整字体