首页 > 数据库 >mysql --聚合函数的学习

mysql --聚合函数的学习

时间:2024-04-03 17:01:03浏览次数:19  
标签:salary 聚合 -- employees mysql department GROUP id SELECT

聚合函数
1. 常见的聚合函数
        1.1 AVG /SUM:只适用于数值类型的字段(或变量)
        1.2 MAX/MIN:适用于数值类型、字符串类型、时间日期类型的字段(或变量)
        1.3 COUNT 
        1.3.1 作用:计算指定字段在查询结构中出现的个数(不包含NULL值的)
        #如果计算表中有多少条记录,如何实现?
        #方式1:COUNT(*)
        #方式2:COUNT(1)
        #方式3:COUNT(具体字段) : 不一定对!
        1.3.2 注意:计算指定字段出现的个数时,是不计算null值的。
        SELECT count(commission_pct)
        FROM employees;

        SELECT commission_pct
        FROM employees
        WHERE commission_pct IS NOT NULL;
        1.3.3 公式:avg = sum / count 
        公司平均奖金率
        SELECT avg(ifnull(commission_pct,0))
        FROM employees;

2. GROUP BY 的使用 
        查询部门的平均工资
        SELECT department_id,avg(salary)
        FROM employees
        GROUP BY department_id 
        
        SELECT job_id,department_id,AVG(salary)
    FROM employees
    GROUP BY job_id,department_id;
        #错误的!
        SELECT department_id,job_id,AVG(salary)
        FROM employees
        GROUP BY department_id;

        #结论1:SELECT中出现的非组函数的字段必须声明在GROUP BY 中。
        #      反之,GROUP BY中声明的字段可以不出现在SELECT中。
        #结论2:GROUP BY 声明在FROM后面、WHERE后面,ORDER BY 前面、LIMIT前面
        #结论3:MySQL中GROUP BY中使用WITH ROLLUP
        SELECT department_id,avg(salary) avg_sal
        FROM employees
        GROUP BY department_id with ROLLUP
        #需求: 查询各个部门的平均工资,按照平均工资的升序排列
        SELECT department_id,avg(salary) avg_sal
        FROM employees
        GROUP BY department_id 
        ORDER BY avg_sal ASC
        
3. HAVING 的使用,作用是用来过滤数据的
要求1:如果过滤条件中使用了聚合函数,则必须使用HAVING来替换WHERE。否则,报错。
要求2:HAVING 必须声明在 GROUP BY 的后面。
        #练习查询各个部门中最高工资比10000高的部门 
        SELECT department_id, max(salary) max_sal
        FROM employees
        GROUP BY department_id
        HAVING max_sal > 10000
要求3: 开发中,我们使用having 的前提是SQL 中使用了group by 
        #练习:查询部门id为10,20,30,40这4个部门中最高工资比10000高的部门信息
        方法1:
        SELECT department_id, max(salary) max_salary
        FROM employees
        WHERE department_id in (10,20,30,40)
        GROUP BY department_id
        having max_salary > 10000
        
        方法2:
        SELECT department_id, max(salary) max_sal
        FROM employees
        GROUP BY department_id
        HAVING max_sal > 10000 and department_id in (10,20,30,40);
#结论:当过滤条件中有聚合函数时,则此过滤条件必须声明在HAVING中。
#当过滤条件中没有聚合函数时,则此过滤条件声明在WHERE中或HAVING中都可以。但是,建议大家声明在WHERE中。

/*
  WHERE 与 HAVING 的对比
1. 从适用范围上来讲,HAVING的适用范围更广。 
2. 如果过滤条件中没有聚合函数:这种情况下,WHERE的执行效率要高于HAVING
*/

#4. SQL底层执行原理
#4.1 SELECT 语句的完整结构
/*

#sql92语法:
SELECT ....,....,....(存在聚合函数)
FROM ...,....,....
WHERE 多表的连接条件 AND 不包含聚合函数的过滤条件
GROUP BY ...,....
HAVING 包含聚合函数的过滤条件
ORDER BY ....,...(ASC / DESC )
LIMIT ...,....


#sql99语法:
SELECT ....,....,....(存在聚合函数)
FROM ... (LEFT / RIGHT)JOIN ....ON 多表的连接条件 
(LEFT / RIGHT)JOIN ... ON ....
WHERE 不包含聚合函数的过滤条件
GROUP BY ...,....
HAVING 包含聚合函数的过滤条件
ORDER BY ....,...(ASC / DESC )
LIMIT ...,....


*/

#4.2 SQL语句的执行过程:
#FROM ...,...-> ON -> (LEFT/RIGNT  JOIN) -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> 
# ORDER BY -> LIMIT


#1.where子句可否使用组函数进行过滤? 
no
#2.查询公司员工工资的最大值,最小值,平均值,总和
select max(salary) max_sal, min(salary) min_sal, avg(salary) avg_sal, sum(salary) sum_sal
FROM employees;
#3.查询各job_id的员工工资的最大值,最小值,平均值,总和
select job_id,max(salary) max_sal, min(salary) min_sal, avg(salary) avg_sal, sum(salary) sum_sal
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 manager_id, min(salary)
FROM employees 
GROUP BY manager_id
HAVING min(salary) > 6000 and manager_id is not NULL;
# 7.查询所有部门的名字,location_id,员工数量和平均工资,并按平均工资降序
SELECT department_name, location_id , count(employee_id),avg(salary) avg_sal
FROM employees RIGHT JOIN departments
ON employees.`department_id`=departments.`department_id`
GROUP BY department_name, location_id
ORDER BY avg_sal 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 department_name,job_id
        

 

标签:salary,聚合,--,employees,mysql,department,GROUP,id,SELECT
From: https://www.cnblogs.com/clairedandan/p/18113083

相关文章

  • 港美股股票配资系统搭建Gangguhk
    股票配资系统是由拥有10年项目开发经验的资深技术人员,针对股票配资市场情况及股票投资者需要而精心研发,可同时运行于手机端、电脑端的多屏杠杆融资风控管理系统。功能包括自设配资额度、交易管理、客户管理、警戒平仓、系统监控、风险控制、数据同步等,可对接虚拟盘或实盘操作,是......
  • 如何让 LLM 应用性能登峰造极
    作者:云中江树微信:zephyr_ai社区:langgpt.ai好久没写文章了,本文为LangGPT社区技术分享系列的第三篇文章,在上一篇讲了提示链(PromptChain)后,很多朋友期待我谈谈微调等其他内容,因着各种原因一直没能落笔。最近看了OpenAI开发者大会“HowtoMaximizeLLMPerformance”......
  • 你真的会写侧边栏收起动画吗?
    业务背景侧边栏的展开与收起,是非常常见的前端交互.下面这段代码是个基础版的demo,使用html+tailwind编写的<buttonid="toggle-btn"type="button">toggle</button><divclass="w-[500px]h-[300px]flex"><sectionclass="flex-1h-fullbg-gray-5......
  • 印度股票交易系统搭建
    印度股票交易系统可支持多品类金融产品交易,包括港股、美股、日韩股以及其他市场。参照国际投行操作及经验构建以用户为中心的业务系统,快速迭代、符合现代投资发展趋势的核心业务系统,是行业领先的交易终端系统。Websocket实时推送证券市场和交易行情。配备专业的技术开发团队,FIX......
  • openGauss 企业级增强特性
    企业级增强特性数据分区数据分区是数据库产品普遍具备的功能。在openGauss中,数据分区是对数据按照用户指定的策略对数据做的水平分表,将表按照指定范围划分为多个数据互不重叠的部分(Partition)。openGauss支持:范围分区(RangePartitioning)功能,即根据表的一列或者多列,将要插入表......
  • 代码随想录 Day35 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球
    860.柠檬水找零 classSolution{public:boollemonadeChange(vector<int>&bills){intfive=0,ten=0,twenty=0;for(intbill:bills){//情况一if(bill==5)five++;//情况二......
  • openGauss 逻辑复制
    逻辑复制可获得性本特性自openGauss1.0.0版本开始引入。特性简介openGauss提供逻辑解码功能,将物理日志反解析为逻辑日志。通过DRS等逻辑复制工具将逻辑日志转化为SQL语句,到对端数据库回放,达到异构数据库同步数据的功能。目前支持openGauss数据库与MySQL数据库、Oracle数据库......
  • 自学python能干些什么副业,自学python能做什么工作
    前言大家好,小编来为大家解答以下问题,有人自学python成功赚钱了吗,自学python能干些什么副业,现在让我们一起来看看吧!自学Python找工作主要看自己的学习能力,自学能力很强学完并精通当然可以工作,不过对于大多数人而言一般都挺难,学习不成系统,遇到问题没人解决很容易放弃半途而......
  • WebKit简单介绍
    WebKit是一个开源的浏览器网页排版引擎,起源于苹果公司,最初是为了开发Safari浏览器而创建的。WebKit主要包含两个核心组件:WebCore和JavaScriptCore。WebCore:主要负责解析HTML文档、样式表(CSS)以及处理DOM树结构。它基于KDE项目的KHTML引擎,并进行了大量改进和优化。WebCore将HTM......
  • openGauss 慢SQL发现
    慢SQL发现可获得性本特性自openGauss1.1.0版本开始引入。特性简介本功能是一个SQL语句执行时间预测工具,通过模板化方法,实现在不获取SQL语句执行计划的前提下,依据语句逻辑相似度与历史执行记录,预测SQL语句的执行时间。客户价值工具不需要用户提供SQL执行计划,对数据库性能不......