首页
学习
活动
专区
圈层
工具
发布

带你学MySQL系列 | 困扰MySQL初学者的分组聚合查询,我终于讲明白了!

1.分组查询的原理图 对上述原始数据,按照DEPARTMENT_ID(员工id)分组统计SALARY(薪水)的平均值。 上述原理写成代码,应该怎么写呢?...也就是说,你使用的是sum()函数,就会组内求和;当你使用的是avg()函数,就会组内求平均值;当你使用的是count()函数,就会进行组内计数;当你使用的是max()函数,就会进行组内求最大值;你使用的是...观察上图,有一点你需要记住,你用表中的字段A进行分组后,一般就需要对表中的其它字段,使用聚合函数,这样意义更大,而不是还对字段A使用聚合函数,没啥太大意义。 我们再思考下面这个问题!...习题二:查询每个部门最高工资大于3000的部门编号和最高工资。 ③ 分组前筛选和分组后筛选合用 习题:查询1981年入职的,不同部门间工资的平均值大于2000的部门编号和平均值。...7.group by和order by,一对老搭档 习题一:查询每个部门的员工的平均工资,按照平均工资降序。 习题二:查询每个部门的员工的平均工资,按照平均工资升序。

1.6K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【数据库设计和SQL基础语法】--查询数据--聚合函数

    示例 计算员工薪水的平均值: SELECT AVG(salary) AS average_salary FROM employees; 计算特定产品价格的平均值: SELECT AVG(price) AS...AVG 函数是 SQL 中用于计算数值平均值的重要聚合函数。通过对指定列应用 AVG 函数,可以轻松获取数据列的平均值,对于统计和分析数值型数据非常有用。...SUM: 计算每个分组中某列的总和。 AVG: 计算每个分组中某列的平均值。 MIN: 找出每个分组中某列的最小值。 MAX: 找出每个分组中某列的最大值。...,并显示每个员工相对于部门的工资排名: SELECT employee_id, department_id, salary, AVG(salary) OVER (PARTITION BY department_id...*避免 SELECT : 只选择需要的列,而不是使用 SELECT *,以减少数据传输和提高查询效率。 表结构设计 范式化 vs.

    3.3K10

    【数据库设计和SQL基础语法】--查询数据--聚合函数

    示例 计算员工薪水的平均值: SELECT AVG(salary) AS average_salary FROM employees; 计算特定产品价格的平均值: SELECT AVG(price) AS...AVG 函数是 SQL 中用于计算数值平均值的重要聚合函数。通过对指定列应用 AVG 函数,可以轻松获取数据列的平均值,对于统计和分析数值型数据非常有用。...SUM: 计算每个分组中某列的总和。 AVG: 计算每个分组中某列的平均值。 MIN: 找出每个分组中某列的最小值。 MAX: 找出每个分组中某列的最大值。...,并显示每个员工相对于部门的工资排名: SELECT employee_id, department_id, salary, AVG(salary) OVER (PARTITION BY department_id...*避免 SELECT : 只选择需要的列,而不是使用 SELECT *,以减少数据传输和提高查询效率。 表结构设计 范式化 vs.

    2.6K10

    MySQL数据库:第七章:分组查询

    分组后条件 ⑤ order by 排序列表 ⑥ 特点: 1、查询列表往往是:分组函数和分组后的字段 换句话说,和分组函数一同查询的字段,一般就是分组后的字段 2、分组查询的筛选有两种:分组前筛选和分组后筛选...3、分组查询可以通过单个字段,也可以通过多个字段,中间用逗号隔开 #1)简单的分组 #案例1:查询每个工种的员工平均工资 SELECT AVG(salary) 平均工资,job_id FROM employees...WHERE email LIKE '%a%' GROUP BY department_id; #案例2:查询有奖金的每个领导手下员工的平均工资 SELECT AVG(salary) 平均工资,manager_id...查询各 job_id 的员工工资的最大值,最小值,平均值,总和,并按 job_id 升序 SELECT MAX(salary) 最大值,MIN(salary) 最小值,AVG(salary) 平均值,SUM...查询所有部门的编号,员工数量和工资平均值,并按平均工资降序 SELECT department_id,COUNT(*) 个数,AVG(salary) 平均工资 FROM employees GROUP

    1.3K10

    【重学 MySQL】三十七、聚合函数

    这组行可以是表中的所有行,也可以是满足特定条件的行(通过WHERE子句指定)。此外,聚合函数经常与GROUP BY子句结合使用,以便对结果集进行分组,并对每个组分别计算聚合值。...AVG() 作用:计算数值列的平均值。...用法:SELECT AVG(column_name) FROM table_name; 示例:SELECT AVG(salary) FROM employees; 计算employees表中所有员工的平均薪水...计算平均值:AVG()函数用于计算平均值,如平均薪资、平均成绩等。 查找极值:MAX()和MIN()函数用于找出某列的最大值和最小值,如最高分、最低分、最高销售额等。...注意事项 当聚合函数与GROUP BY子句一起使用时,它们会对每个组分别计算聚合值。 聚合函数通常忽略NULL值,但COUNT(*)除外,它会计算包括NULL值在内的所有行数。

    80421

    Mysql常用sql语句(12)- group by 分组查询

    group by 一般都会结合Mysql聚合函数来使用 如果需要指定条件来过滤分组后的结果集,需要结合 关键字;原因:where不能与聚合函数联合使用 having group by 的语法格式 GROUP...group by + group_concat()的栗子 group_concat()可以将分组后每个组内的值都显示出来 select department,group_concat(username)...可以看到,按department部门分组 ,然后查看每个部门都有哪些员工的名字;还是很便捷的 group by +聚合函数的栗子 有什么聚合函数?...count():统计记录的条数 sum():字段值的总和 max():字段值的最大值 min():字段值的最小值 avg():字段值的平均值 具体的栗子 # count统计条数 select count...group by + with rollup的栗子 with rollup用来在所有记录的最后加上一条记录,显示上面所有记录每个字段的总和(不懂的直接看栗子) select GROUP_CONCAT(username

    5.9K21

    【MySql】聚合函数&&group by&&OJ题目

    聚合函数 MySQL中的聚合函数用于对数据进行计算和统计,常见的聚合函数包括下面列举出来的聚合函数: 函数 说明 COUNT([DISTINCT] expr) 返回查询到的数据的数量...SUM([DISTINCT] expr) 返回查询到的数据的总和,不是数字没有意义 AVG([DISTINCT] expr) 返回查询到的数据的平均值,不是数字没有意义 MAX([DISTINCT...] expr) 返回查询到的数据的最大值,不是数字没有意义 MIN([DISTINCT] expr) 返回查询到的数据的最小值,不是数字没有意义 对于上面所列举出来的聚合函数,下面我们通过一些案例来进行对聚合函数的运用...SALGRADE工资等级表 如何显示每个部门的平均工资和最高工资 显示每个部门的平均工资和最高工资 select deptno,max(sal) 最高,avg(sal) 平均 from emp...显示每个部门的每种岗位的平均工资和最低工资 select deptno,job, avg(sal) 平均,min(sal) 最低 from emp group by deptno,job; 显示平均工资低于

    61110

    MySQL单表&约束&事务

    (字段) 计算指定列的最小值 avg(字段) 计算指定列的平均值 需求: 1 查询员工的总数 2 查看员工总薪水、最高薪水、最小薪水、薪水的平均值 3 查询薪水大于4000员工的个数 4 查询部门为...’教学部’的所有员工的个数 5 查询部门为’市场部’所有员工的平均薪水 SQL实现 #1 查询员工的总数 -- 统计表中的记录条数 使用 count() SELECT COUNT(eid) FROM...,因为count函数忽略了空值 -- 所以使用时注意不要使用带有null的列进行统计 SELECT COUNT(dept_name) FROM emp; #2 查看员工总薪水、最高薪水、最小薪水、薪水的平均值...-- sum函数求和, max函数求最大, min函数求最小, avg函数求平均值 SELECT SUM(salary) AS '总薪水', MAX(salary) AS '最高薪水', MIN(salary...sex; # 分组需要和聚合函数一起使用进行统计才有意义 #1.查询所有部门信息 #2.查询每个部门的平均薪资 #3.查询每个部门的平均薪资, 部门名称不能为null #1.

    1.9K30

    2-SQL语言中的函数

    分类: sum 求和,avg 平均值,max 最大值,min 最小值 特点: sum,avg可以处理数值型数据,max,min,count可以处理任何类型数据 以上几个分组函数都会自动忽略null值...可以和distinct搭配使用 # 分组函数 /* 分类:sum 求和,avg 平均值,max 最大值,min 最小值 特点: 1. sum,avg可以处理数值型数据,max,min,count可以处理任何类型数据...可以和distinct搭配使用 */ # sum求和 SELECT SUM(salary) FROM employees; # avg求平均值 SELECT AVG(salary) FROM employees...'%A%' GROUP BY department_id; # 查询哪个部门员工个数大于2(添加分组后的筛选) /* 这里不是利用employees表中的原数据进行筛选, 而是根据筛选后的结果进行二次筛选...`department_id`; # 外连接 /* 用于查询一个表中有,另一个表中没有的记录 特点: 外连接的查询结果为主表中的所有记录 如果表中有和它匹配,则显示匹配的值 如果没有匹配值

    3.7K10

    MySQL 中那些鲜为人知但功能强大的内置函数

    IFNULL() 函数:对 NULL 字段赋默认值产品经理对于随机抽取的员工信息感到满意,但他还有进一步的需求。他希望查看部分员工的生日信息,如果生日字段为空,则需要显示“保密,未提供”。...这时,你可能想到薪水表 salary 中存放的是每个员工不同任职阶段的薪水情况,根据员工号 GROUP BY 分组之后,每组对薪水字段求平均值即可。...可是产品经理希望同时获取所有员工的平均薪资,这是一个比较麻烦的点。...,除了有每位员工在各个任职阶段的平均薪水外,还在最后一行列出了所有员工的平均薪水:+--------+-------------+| emp_no | avg(salary) |+--------+--...结合咱们刚刚讲到的 内置函数 IFNULL(),你能够很方便地将这个 NULL 值显示为特定内容的,比如显示为“员工平均薪水”。这样,你提供的数据也会超出他的预期。

    36510

    Oracle分析函数二——函数用法

    )排序,并按order by的值(hire_date)进行累计统计 --该平均值由当前员工和与之具有相同经理的前一个和后两个三者的平均数得来 --Partition by Order by首先按相应的值...(manager_id,hire_date)排序,并按order by的值(hire_date)进行累计统计 --该平均值由当前员工和与之具有相同经理,并且雇用时间在该员工时间之前的50天以内和在该员工之后的...并按order by的值(hire_date)进行累计统计 --该平均值由当前员工和与之具有相同经理,并且雇用时间在该员工时间之前的50天以内和在该员工之后的150天之内员工的薪水的平均值 --range...(manager_id,hire_date)排序,并按order by的值(hire_date)进行累计统计 --该平均值由当前员工和与之具有相同经理的平均值 --每行对应的数据窗口是从第一行到最后一行...--Partition by Order by首先按相应的值(manager_id,hire_date)排序,并按order by的值(hire_date)进行累计统计 --该平均值由当前员工和与之具有相同经理的平均值

    71010

    MySQL进阶实战:窗口函数 VS 聚合函数,性能与场景全对比

    二、基础概念回顾 2.1 聚合函数简介 聚合函数是用于对一组值执行计算并返回单一值的函数,常见的有: SUM():求和 COUNT():计数 AVG():平均值 MAX():最大值 MIN():最小值...计算每个部门的平均工资。...四、典型场景对比 4.1 需求一:获取每个部门最高工资的员工信息 聚合函数写法(需子查询): SELECT e.* FROM employees e JOIN ( SELECT department_id...PARTITION BY department_id ORDER BY salary DESC) AS rnk FROM employees ) t WHERE rnk = 1; 4.2 需求二:统计员工工资的部门平均值...需求三:计算每个员工相对于部门的工资环比(前一行) SELECT employee_id, department_id, salary, salary - LAG(salary) OVER

    71610

    如何在SQL中高效使用聚合函数、日期函数和字符串函数:实用技巧与案例解析

    聚合函数 函数 说明 COUNT([DISTINCT] expr) 返回查询到的数据的 数量 SUM([DISTINCT] expr) 返回查询到的数据的 总和,不是数字没有意义 AVG([DISTINCT...] expr) 返回查询到的数据的 平均值,不是数字没有意义 MAX([DISTINCT] expr) 返回查询到的数据的 最大值,不是数字没有意义 MIN([DISTINCT] expr) 返回查询到的数据的...) EMP员工表 DEPT部门表 SALGRADE工资等级表 如何显示每个部门的平均工资和最高工资 select deptno,avg(sal),max(sal) from EMP group by deptno...; 显示每个部门的每种岗位的平均工资和最低工资 select avg(sal),min(sal),job, deptno from EMP group by deptno, job; 显示平均工资低于...实战OJ 牛客:批量插入数据 牛客:找出所有员工当前薪水salary情况 牛客:查找最晚入职员工的所有信息 牛客:查找入职员工时间排名倒数第三的员工所有信息 查找薪水记录超过15条的员工号emp_no

    80500

    MySQL窗口函数让报表统计效率提升80%(附避坑)

    你是不是也遇到过这些场景:想统计各部门薪资Top3员工、计算月度销售额累计值、给订单按时间排名…… 用传统子查询或关联查询写出来的SQL又长又难维护,性能还拉垮?...排名统计(ROW_NUMBER/RANK/DENSE_RANK)案例 需求:给每个部门的员工按薪资从高到低排名,区分3种排名函数的差异。...分组TopN(各部门薪资 Top2)案例 需求:筛选出每个部门薪资最高的2名员工 -- 方案:窗口函数+子查询(MySQL8.0+支持) WITH emp_rank AS ( SELECT...前后行数据关联(LAG/LEAD)案例 需求:计算每个员工入职时间与同部门上一个员工的入职时间差(环比分析常用)。...窗口函数适用场景汇总 排名类:ROW_NUMBER/RANK/DENSE_RANK(TopN、排名统计) 聚合类:SUM/AVG/MAX/MIN(累计求和、移动平均) 偏移类:LAG/LEAD(环比分析

    14010

    MySQL高级查询技巧:分组、聚合、子查询与分页【MySQL系列】

    配合聚合函数(如 COUNT()、SUM()、AVG() 等)使用,可以实现对每个分组的统计。...; 2.2 多字段分组 示例:统计每个部门中每个职位的员工数量 SELECT department_id, job_id, COUNT(*) AS employee_count FROM employees...函数 说明 COUNT() 统计数量 SUM() 求和 AVG() 平均值 MAX() 最大值 MIN() 最小值 GROUP_CONCAT() 将组内字段连接为字符串 3.1 COUNT() SELECT...四、HAVING:对分组后的结果进行过滤 4.1 区别 WHERE 与 HAVING WHERE 是对 原始数据 进行筛选 HAVING 是对 分组后的结果 进行筛选 4.2 示例:只显示员工数大于5的部门...employees) AS diff_from_avg FROM employees; 5.2 WHERE 中的子查询 示例:查询工资高于公司平均值的员工 SELECT * FROM employees

    49810

    常见SQL知识点总结,建议收藏!

    举例 查找每个部门中薪水最高的前 3 名员工。 另一个示例Employee_salary表 当一个SQL问题要求计算“TOP N”时,我们可以使用ORDER BY或排名函数来回答问题。...但在这个示例中,它要求计算“每个 Y 中的 TOP N X”,这强烈暗示我们应该使用排名函数,因为我们需要对每个分区组中的行进行排名。...以下查询恰好能找到 3 名薪水最高的员工,而不论他们的关系如何,如下: WITH T AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY department_id...要避免由重复项导致的潜在问题,一种简单方法是始终使用 ID 列唯一地标识不同的记录。 举例 使用 Employee_salary 表查找每个部门所有员工的总薪水。...例如:你可以谈论对问题和数据的理解,说明你计划如何解决问题,为什么使用某些函数而不是其他选项,以及正在考虑哪些极端情况。

    85210

    Oracle函数学习(单行函数,多行函数)

    ,数值函数,日期函数) –特点1:不改变真实数据,只是对数据做了进一步修饰或者处理显示。...–特点2:可以和字段混合使用 –使用:select 字段名, 函数名(字段名),字段名…from 表名 –字符函数: –查询所有的员工信息,员工姓名小写显示。...select empno,INITCAP(ename) 首字母大写的姓名,lower(ename),job from emp –数值函数:对数值类型的数据进行运算 –伪表:真实存在的表,是为了方便进行数据的验证而临时存在的表...,除非分组 –max(字段名) 返回该字段的最大值 –min(字段名) 返回该字段的最小值 –sum(字段名) 返回该字段的和 –avg(字段名) 返回该字段的平均值 –count –count...select avg(sal) from emp –查看所有的员工工资之和 select sum(sal) from emp –查询公司有多少员工 select count() from emp

    98530
    领券