MySQL数据库,触发器、窗口函数、公用表表达式

触发器

触发器是由事件来触发某个操作(也包含INSERT、UPDATE、DELECT事件),如果定义了触发程序,当数据库执行这些语句时,就相当于事件发生了,就会自动激发触发器执行相应的操作

当对数据表中的数据执行 插入、更新和删除操作,需要自动执行一些数据库逻辑时,就可以使用触发器来实现。

触发器的创建:

格式:

例:创建触发器before_insert,向表一插入数据之前,向表二中插入日志信息。

DELIMITER $CREATE TRIGGER before_insert_triBEFORE INSERT ON test_firstFOR EACH ROWBEGININSERT INTO test_second(t_log)VALUES('before insert ……');END $DELIMITER ;

创建触发器after_insert,向表一插入数据之后,向表二中插入日志信息。

DELIMITER $CREATE TRIGGER after_insert_triAFTER INSERT ON test_firstFOR EACH ROWBEGININSERT INTO test_second(t_log)VALUES('after insert ……');END $DELIMITER ;

例:在添加员工信息时,判断员工信息是否大于他领导的薪资,如果大于,则报'HY000'的错误,使得添加失败。

-- 创建触发器DELIMITER $CREATE TRIGGER sal_check_tri2BEFORE INSERT ON emp_test_triFOR EACH ROWBEGINDECLARE mgr_sal DECIMAL(7,2);SELECT sal INTO mgr_sal FROM emp_test_triWHERE empno = NEW.mgr;IF NEW.sal > mgr_salTHEN SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = '薪资不能比领导高';END IF;END $DELIMITER ;-- 插入数据INSERT INTO emp_test_tri(empno,ename,mgr,sal)VALUES(8000,'Tom', 7788,2500);INSERT INTO emp_test_tri(empno,ename,mgr,sal)VALUES(8001,'Tom', 8000,3200);

注:触发器中的NEW表示当前正在添加的记录。OLD表示删除前、更新前的记录

查看触发器:

查看当前数据库的所有触发器的定义:

SHOW TRIGGERS;

查看当前数据库中某个数据库的定义:

SHOW CREATE TRIGGER 触发器名;

从系统库information_schema的TRIGGERS表中查询触发器的信息:

SELECT * FROM  information_schema.TRIGGERS;

删除触发器

DROP TRIGGER 触发器名;

窗口函数

窗口函数的作用类似于在查询中对数据进行分组。与分组操作不同的是,分组操作会把分组的结果聚合成一条记录,而窗口函数是将结果置于每一条数据记录中

例:查询员工信息,按部门分类,在每个员工前显示其所在部门的平均工资。

SELECT empno,ename,deptno,SUM(sal) OVER(PARTITION BY deptno) '部门平均工资'FROM emp;

可以发现,查询中确实对数据进行了分组,但是只是将每个组并列在了一起,然后在每个员工的后面显示其部门平均工资

窗口函数的语法格式:

函数 OVER (PARTITION BY 字段名 ORDER BY 字段名 ASC/DESC)

或者是

函数 OVER 窗口名 …… WINDOW 窗口名 AS (PARTITION BY 字段名 ORDER BY 字段名 ASC/DESC)

窗口的使用:

OVER括号中的分组排序规则的内容可以以一个窗口代替,最后在使用窗口的多个函数声明完后,用WINDOW 窗口名 AS (PARTITION BY 字段名 ORDER BY 字段名 ASC/DESC)指明窗口的具体规则的内容。

PARTITION BY子句:

指定窗口函数按照哪些字段分组,分组后,窗口函数在每个分组中分别执行

ORDER BY:

指定窗口函数按照那些字段进行排序,也是在组内排序

函数的分类:

序号函数:

ROW_NUMBER( )函数

ROW_NUMBER( )能够对数据中的序号进行顺序显示。按分组分别显示序号。

例:查看员工信息,以员工部门分组,在每个员工前显示其在部门的序号。每个部门中按员工工资排序。

SELECT ROW_NUMBER() OVER(PARTITION BY deptno ORDER BY sal) 序号,empno,ename,deptnoFROM emp;

也可以利用新生成的序号,在后面加上WHERE 序号 < 3,求出每个部门工资排名前三的员工信息。

RANK( )函数

使用RANK( )函数能够对序号进行并列排序,并且会跳过重复的序号(比如序号为1,1,3……)

例:查看员工信息,以员工部门分组,每个部门中按员工工资排序,并显示其在工资的排名(跳过重复的排名序号)。

SELECT empno,ename,deptno,RANK() OVER(PARTITION BY deptno ORDER BY sal) '部门工资排名'FROM emp;

与前面的ROW_NUMBER( )函数不同的是,当遇到相同的值比较时,会判为相同值的记录排序序号一样,并跳过重复的排序再计数。

DENSE_RANK( )函数

DENSE_RANK( )函数对序号进行并列排序并且不会跳过重复的序号(比如序号为1,1,2……)

例:查看员工信息,以员工部门分组,每个部门中按员工工资排序,并显示其在工资的排名(不跳过重复的排名序号)。

SELECT empno,ename,deptno,DENSE_RANK() OVER(PARTITION BY deptno ORDER BY sal) '部门工资排名'FROM emp;

与前面的RANK( )函数不同的是,不跳过重复的排序再计数。

分布函数:

PERCENT_RANK( )函数

PERCENT_RANK( )函数是等级值百分比函数。

计算方式:(rank - 1) / (rows - 1)

其中,rank的值是使用RANK( )函数产生的序号,rows的值为当前窗口的总记录数。

例:查看员工信息,以员工部门分组,每个部门中按员工工资排序,并显示其在工资的排名(跳过重复的排名序号),并显示其序号的等级值百分比。

SELECT empno,ename,deptno,RANK() OVER(PARTITION BY deptno ORDER BY sal) '部门工资排名',PERCENT_RANK() OVER(PARTITION BY deptno ORDER BY sal) '排名比例'FROM emp;

使用窗口的格式:

SELECT empno,ename,deptno,RANK() OVER w '部门工资排名',PERCENT_RANK() OVER w '排名比例'FROM emp WINDOW w AS (PARTITION BY deptno ORDER BY sal);

CUME_DIST( )函数

CUME_DIST( )函数主要用于查询小于或等于本记录的某个值的组内的记录的比例

例:查询工资小于或等于当前员工的薪资的员工的比例

SELECT empno,ename,sal,deptno,CUME_DIST() OVER(PARTITION BY deptno ORDER BY sal ASC) '比例'FROM emp;

以MILLER为例,在10号部门中员工工资小于或等于1300的员工比例为0.3333……

以CLARK为例,在10号部门中员工工资小于或等于2450的员工比例为0.6666……

前后函数

LAG(expr,n)函数

LAG(expr,n)函数返回当前行的第前n行记录的expr的值

例:查询上一个员工与当前员工的薪资的差值。

SELECT empno,ename,deptno,sal,pre_sal,sal - pre_sal diff_salFROM(SELECT empno,ename,deptno,sal,LAG(sal,1) OVER w pre_salFROM empWINDOW w AS (PARTITION BY deptno ORDER BY sal)) t;

子查询中的pre_sal即为上一个记录的薪资。将1改为2即为上两个记录的工资,找不到相应的记录结果为NULL。

首尾函数

FIRST_VALUES(expr)函数

FIRST_VALUES(expr)函数返回第一个记录的expr的值(分组内的第一个),会在每一行都显示第一个记录的expr的值。

例:

SELECT empno,ename,deptno,sal,FIRST_VALUE(sal) OVER(PARTITION BY deptno ORDER BY sal) '部门工资排名最高'
FROM emp;

LAST_VALUES(expr)函数

LAST_VALUES(expr)函数返回最后一个记录的expr的值

其他函数

NTH_VALUES(expr,n)函数

NTH_VALUES(expr,n)函数返回第n个记录的expr的值

NTILE(n)函数

NTILE(n)函数将分区中的有序数据分为n个桶,记录桶编号。

例:将员工按薪资分为三组。

SELECT NTILE(3) OVER w 桶编号,empno,deptno,ename,salFROM emp WINDOW w AS (PARTITION BY deptno ORDER BY sal);

即自动按薪资再分一个等级,按照要分的组数来均分等级

公用表表达式

公用表表达式(或通用表表达式)简称为CTE(Common Table Expressions)。CTE是一个命名的临时结果集,作用范围是当前语句。CTE可以理解为一个可以复用的子查询

公用表表达式分为普通公用表表达式和递归公用表表达式。

普通公用表表达式:

例:

WITH test_cteAS (SELECT DISTINCT deptno FROM emp)SELECT *FROM dept dJOIN test_cte eON d.deptno = e.deptno;

将查询结果放在WITH CTE名 AS ( )的括号中,就可以在下面的查询语句中将CTE当作一个表使用。可以有多个CTE,CTE可以引用其他CTE。

递归公用表表达式:

在WITH和CTE名中间插入RECURSIVE

例:

WITH RECURSIVE cteAS(-- 若UNION ALL前面的查询语句为A部分SELECT empno,ename,mgr,1 AS 第几代 FROM emp WHERE empno = 7839 -- 种子查询,设置第一代领导UNION ALL-- 若UNION ALL后面的查询语句为B部分SELECT a.empno,a.ename,a.mgr,第几代+1 FROM emp AS a JOIN cteON (a.mgr = cte.empno) -- 递归查询,找出以递归公用表表达式的人为领导的人,即找出A部分的下一代-- 执行完后,B部分变为新的A部分,继续找新的B部分,直到找不到任何记录为止。)SELECT empno,ename,第几代 FROM cte;-- 可以在此处加上WHERE子句,查询指定的第几代数。

A部分先设置查询的第一代,B部分再设置下一代的查询方法,当A、B执行完后,B会成为新的A部分,查找新的B部分,以此类推,直到找不到下一代记录为止。A、B部分用UNION ALL连接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/232534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何选择数字化转型顾问

在进行数字化转型时&#xff0c;第一步也是最重要的一步是深刻了解你的业务需求&#xff0c;这一基本流程涉及对企业的目标、挑战和抱负进行全面分析。必须提出关键问题&#xff1a;你通过数字化转型寻求哪些具体结果?主要目标是优化运营效率、提升客户体验&#xff0c;还是使…

VueDraggablePlus - 免费开源的 Vue 拖拽组件,支持 Vue2 / Vue3,还被尤雨溪推荐了

今天在网上看到尤雨溪推荐的这款拖拽组件&#xff0c;试了一下非常不错&#xff0c;同样推荐给大家。 VueDraggablePlus 是一个专为 Vue 打造的拖拽排序模块&#xff0c;基于 Sortablejs 封装&#xff0c;支持 Vue3 或 Vue 2.7&#xff0c;本月的 21 日&#xff0c;Vue 作者尤…

网络协议分析

第一章&#xff1a;Wireshark基础及捕获技巧 1.1 Wireshark基础知识回顾 1.2 高级捕获技巧&#xff1a;过滤器和捕获选项 1.3 Wireshark与其他抓包工具的比较 第二章&#xff1a;网络协议分析 2.1 网络协议分析&#xff1a;TCP、UDP、ICMP等 2.2 高级协议分析&#xff1a;HTTP…

从企业的角度看待WMS仓储管理系统的集成

随着全球化和数字化的发展&#xff0c;企业面临着越来越复杂的商业环境。为了满足高效运营的需求&#xff0c;许多企业开始寻求更先进、更集成的解决方案来优化他们的仓储流程。WMS仓储管理系统作为一种重要的解决方案&#xff0c;在企业中发挥着关键的作用。本文将从企业的角度…

CSS垂直方向布局中,子元素溢出父元素,如何处理?

默认情况下&#xff0c;父元素的高度是被子元素撑开的&#xff0c;若父元素设置了&#xff0c;就是设置多少就是多少 子元素是在父元素的内容区中排列的&#xff0c;如果子元素的大小超过了父元素&#xff0c;则子元素会从父元素中溢出, 使用overflow属性设置父元素如何处理溢…

通过外包团队迅腾文化灵活管理企业资讯内容输出,助力企业方对外信息的及时性与准确性

通过外包团队迅腾文化灵活管理企业资讯内容输出&#xff0c;助力企业方对外信息的及时性与准确性 随着信息时代的快速发展&#xff0c;企业信息的及时性和准确性对于企业的成功至关重要。外包团队迅腾文化以其灵活的管理方式&#xff0c;为企业提供了高效、准确的企业资讯内容…

速度与稳定性的完美结合:深入横测ToDesk、TeamViewer和AnyDesk

文章目录 前言什么是远程办公&#xff1f;远程办公的优势 远程办公软件横测对象远程软件的注册&安装ToDeskTeamViewerAnyDesk 各场景下的实操体验1.办公文件传输及丢包率2.玩游戏操作延迟、稳定3.追剧画质流畅度、稳定4.临时技术支持SOS模式 收费情况与设备连接数总结 前言…

开关电源测试 | 如何测试开关电源峰值负载功率?

开关电源峰值负载功率测试方法 测试设备&#xff1a; 1.电子负载&#xff1a;根据负载的额定电压和电流来选择。 2.功率计&#xff1a;需要考虑电源的额定电压和电流、测试频率等。 3.示波器&#xff1a;需要考虑测试频率和带宽等。 测试步骤&#xff1a; 1.将电源调整到正常工…

数据结构:图解手撕B-树以及B树的优化和索引

文章目录 为什么需要引入B-树&#xff1f;B树是什么&#xff1f;B树的插入分析B树和B*树B树B*树分裂原理 B树的应用 本篇总结的内容是B-树 为什么需要引入B-树&#xff1f; 回忆一下前面的搜索结构&#xff0c;有哈希&#xff0c;红黑树&#xff0c;二分…等很多的搜索结构&a…

单播、多播、广播、组播、泛播、冲突域、广播域、VLAN概念汇总

1 引言 “多播”可以理解为一个人向多个人&#xff08;但不是在场的所有人&#xff09;说话&#xff0c;这样能够提高通话的效率。如果你要通知特定的某些人同一件事情&#xff0c;但是又不想让其他人知道&#xff0c;使用电话一个一个地通知就非常麻烦&#xff0c;而使用日常…

Lua 中编写 C 函数的一些便捷技巧

零、前言 使用 Lua 时&#xff0c;在编写 C/C 函数经常需要对栈进行交互&#xff0c;而这中间更多的操作和数组、字符串相关。 一、数组操作的便捷方式 从之前分享的 “Lua 数据类型——表” 文章中知道 Lua 中的 “数组” 是以表的形式存在&#xff0c;只是他的 key 值是有…

Z-IETD-FMK;caspase-8 抑制剂 210344-98-2星戈瑞

Z-IETD-FMK是一种caspase-8抑制剂。它通过与caspase-8的活性位点结合&#xff0c;阻断其切割关键蛋白质&#xff0c;进而抑制细胞凋亡过程。该抑制剂具有高选择性、高活性、低毒性等优点。 Z-IETD-FMK通过与caspase-8的半胱氨酸残基形成共价键&#xff0c;从而抑制caspase-8的活…

谷歌发布Gemini 1.0,开启生成式AI模型新时代!

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; IT杂谈 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. Gemini的发布前期1.1 Gemini的准备1.2 DeepMnid 二. Gemini的三大杀手锏2.1 多模态能力2…

AWS RDS慢日志文件另存到ES并且每天发送邮件统计慢日志

1.背景&#xff1a;需要对aws rds慢日志文件归档到es&#xff0c;让开发能够随时查看。 2.需求&#xff1a;并且每天把最新的慢日志&#xff0c;过滤最慢的5条sql 发送给各个产品线的开发负责人。 3.准备&#xff1a; aws ak/sk &#xff0c;如果rds 在不同区域需要认证不同的…

Apache RocketMQ 5.0 腾讯云落地实践

Apache RocketMQ 发展历程回顾 RocketMQ 最早诞生于淘宝的在线电商交易场景&#xff0c;经过了历年双十一大促流量洪峰的打磨&#xff0c;2016年捐献给 Apache 社区&#xff0c;成为 Apache 社区的顶级项目&#xff0c;并在国内外电商&#xff0c;金融&#xff0c;互联网等各行…

GBASE南大通用 ADO.NET 中的事务

GBASE南大通用 ADO.NET 中支持事务&#xff0c;可以使用GBASE南大通用Connection 对象的BeginTransaction 函数开始一个事务&#xff0c;并默认使用 ReadCommitted 模式初始化。 事务中可以对单个表执行多个操作&#xff0c;或者对多个表执行多个操作&#xff0c;在事务未提交…

用vue3封装自用的echarts组件

封装的组件 目录 封装的组件在项目中使用 BaseChart.vue <script setup>import {ref,onMounted,onBeforeUnmount,watch,markRaw} from vue;import {debounce} from "/utils"; //节流函数 import * as echarts from "echarts";const emit defineEmit…

TSINGSEE青犀边缘AI计算基于车辆结构化数据的车辆监控方案

随着人工智能技术的不断发展&#xff0c;边缘AI技术逐渐成为智能交通领域的研究热点。其中&#xff0c;基于边缘AI的车辆结构化数据技术与车辆监控系统是实现智能交通系统的重要手段之一。为了满足市场需求&#xff0c;TSINGSEE青犀边缘AI智能分析网关/视频智能分析平台推出了一…

windows安装库报错

报错信息 ERROR: Command errored out with exit status 1: ‘D:\test\venv\Scripts\python.exe’ -u -c ‘import io, os, sys, setuptools, tokenize; sys.argv[0] ‘"’"‘C:\Users\aaa\AppData\Local\Temp\pip-install-j oni55ju\xxx_350c8d1094f749eb97d8f049…

《代码随想录》--二叉树(一)

《代码随想录》--二叉树 第一部分 1、二叉树的递归遍历2、二叉树的迭代遍历3、统一风格的迭代遍历代码4、二叉树的层序遍历226.翻转二叉树 1、二叉树的递归遍历 前序遍历 中序遍历 后序遍历 代码 前序遍历 class Solution {public List<Integer> preorderTraversal(T…