MySQL基础之触发器,函数,存储过程

2024-06-22 17:38

本文主要是介绍MySQL基础之触发器,函数,存储过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1 MySQL触发器

2 存储过程

2.1 创建存储过程

2.2 变量

2.2.1 存储过程内使用变量

2.2.2 赋值变量

2.2.3 变量作用域

2.3 查看并使用存储

2.3.1 查看调用

2.3.2 存储过程控制语句

2.4 修改删除存储

3 函数

3.1 创建函数

3.2 查看并使用

3.3 修改删除函数

3.4 自带基本函数

3.4.1 字符串类

3.4.2 数学类

3.4.3 日期时间类

3.4.4 系统信息函数

3.4.5 窗口函数

3.4.5.1 排序类

3.4.5.2 获取下一行Lead

3.4.5.3 获取上一行Lag

3.4.5.4 SUM()


1 MySQL触发器

触发器创建:

create trigger trigger_namebefore|after trigger_event on TableName for each row trigger_stmt;

参数说明:

  • trigger_event : 就是insert|update|delete
  • trigger_stmt : 就是要执行的操作
  • for each row : 表示任何一条记录上的操作满足触发事件都会触发该触发器

创建触发器包含多条执行语句:

delimiter $$  
此处操作时说在触发器内部要用分号结束操作,为了不和系统分号;冲突就修改用$$
create trigger trigger_name before|after trigger_event on TableName for each row begininsert into log_table()...;insert into log1_table()....;end
delimiter ;
把结束操作符合还修改为原来的分号 ;

触发器查看:
show triggers;触发器删除:
drop trigger trigger_name;


2 存储过程

2.1 创建存储过程

CREATE PROCEDURE procedure_name([procedure_paramter[,…]])[characteristic…] routine_body

参数说明:

  • procedure_paramter:参数表示存储过程的参数,为[ IN | OUT | INOUT ] <参数名> <类型> ,in:输入类型,out:输出类型,inout:输入输出类型
  • characteristic:表示存储过程的特性:如language SQL等
  • routine_body:表示存储过程序的sql语句

示例例子

delimiter $$
create procedure procedure_name (参数[可选])
begin select * from temp_table;
end$$
delimiter ;

2.2 变量

2.2.1 存储过程内使用变量

在 MySQL中使用declare声明变量,语法:

delcare var_name type [default vaule];
示例例子
declare employee_sal int default 1000;

2.2.2 赋值变量

在MySQL中通过关键字set或select ... into...来给变量赋值
set var_name=expr[,...];或者使用select ... into...语句实现赋值,语法如下:

select field_name into var_name from table_name where conditon ;
示例例子
SELECT 'Hello World' into @x;  

存储过程中使用的例子

delimiter $$
CREATE PROCEDURE proc1(OUT s int)  BEGIN SELECT COUNT(*) INTO s FROM user;  END $$  
delimiter ;set @s :=0;//给一个用户变量赋值
CALL proc1(@s);//执行存储过程
select @s;//查看结果

2.2.3 变量作用域

内部的变量在其作用域范围内享有更高的优先权,当执行到end时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储过程外再也不能找到这个申明的变量,但是可以通过out参数或者将其值指派给会话变量来保存其值。

DELIMITER //  
CREATE PROCEDURE proc3()  begin declare x1 varchar(5) default 'outer';  begin declare x1 varchar(5) default 'inner';  select x1;  end;  select x1;  end;  //  
DELIMITER ;  

点击了解MySQL用户变量、系统变量、局部变量的理解

2.3 查看并使用存储

2.3.1 查看调用

查看存储过程:

show procedure status where db='数据库名' 查看状态信息
show create procddure procedure_name 查看定义信息查看当前数据库中存储过程
SELECT * FROM mysql.proc WHERE db='数据库名'; 
select * from information_schema.routines where routine_schema='数据库名'; 

调用存储

CALL  procedure_name ( [  parameter  [ ,  ...  ] ] )

2.3.2 存储过程控制语句

if-then -else语句

DELIMITER //  CREATE PROCEDURE proc2(IN parameter int)  begin declare var int;  set var=parameter+1;  if var=0 then insert into t values(17);  end if;  if parameter=0 then update t set s1=s1+1;  else update t set s1=s1+2;  end if;  end;  //  
DELIMITER ;

case语句

DELIMITER //  
CREATE PROCEDURE proc3 (in parameter int)  begin declare var int;  set var=parameter+1;  case var  when 0 then   insert into t values(17);  when 1 then   insert into t values(18);  else   insert into t values(19);  end case;  end;  //  
DELIMITER ; 

循环语句
while ···· end while语句

DELIMITER //  
CREATE PROCEDURE proc4()  begin declare var int;  set var=0;  while var<6 do  insert into t values(var);  set var=var+1;  end while;  end;  //  
DELIMITER ; 

repeat···· end repeat:
它在执行操作后检查结果,而while则是执行前进行检查

DELIMITER //  CREATE PROCEDURE proc5 ()  begin   declare v int;  set v=0;  repeat  insert into t values(v);  set v=v+1;  until v>=5  end repeat;  end;  //  
DELIMITER ; 

loop ·····end loop:
loop循环不需要初始条件,这点和while 循环相似,同时和repeat循环一样不需要结束条件, leave语句的意义是离开循环。

DELIMITER //  CREATE PROCEDURE proc6 ()  begin declare v int;  set v=0;  LOOP_LABLE:loop  insert into t values(v);  set v=v+1;  if v >=5 then leave LOOP_LABLE;  end if;  end loop;  end;  //  
DELIMITER ; 

ITERATE迭代
ITERATE : 通过引用复合语句的标号,来从新开始复合语句,在MySQL的LOOP,WHILE和REPEAT语句中,当想再次执行循环主体时,可以使用ITERATE语句,即:当不满足条件时,要继续执行的意思
LABLES 标号:标号可以用在begin repeat while或者loop 语句前,语句标号只能在合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步

DELIMITER //  CREATE PROCEDURE proc10 ()  begin declare v int;  set v=0;  LOOP_LABLE:loop  if v=3 then   set v=v+1;  ITERATE LOOP_LABLE;  end if;  insert into t values(v);  set v=v+1;  if v>=5 then leave LOOP_LABLE;  end if;  end loop;  end;  //  
DELIMITER ; 

2.4 修改删除存储

修改存储过程:

alter procedure procedure_name [sql语句]

删除存储过程:

drop procedure procedure_name;

3 函数

3.1 创建函数

在MySQL中创建函数通过SQL语句CREATE Function来实现,其语法形式如下:

CREATE FUNCTION function function_name([function_paramter[,…]])
[returns 数据类型][characteristic…] routine_body

参数说明:

  • procedure_paramter:与存储过程相比,不需要有in或者out或者inout声明
  • characteristic:表示存储过程的特性:如language SQL等
  • routine_body:表示存储过的的sql语句

创建函数示例

DELIMITER $$
CREATE FUNCTION func_employee_sal (empno INT(11))RETURNS DOUBLE(10,2)
COMMENT'查询某个雇员的工资'
BEGINRETURN (SELECT salFROM t_employeeWHERE t_employee.empno=empno);
END$$
DELIMITER ;

3.2 查看并使用

查看函数:

show function status查看状态信息
show create function function_name查看定义信息

调用函数

select function_name ( [  parameter  [ ,  ...  ] ] )

3.3 修改删除函数

修改存储过程:

alter function function_name [sql语句]

删除存储过程:

drop function function_name;

3.4 自带基本函数

3.4.1 字符串类

查找字符集
CHARSET(str); //返回字串字符集查询长度
LENGTH (string ); //string长度  按照字节来统计的
char_length(); //按照字符来统计的连接字串
CONCAT (string2 [,... ]); //连接字串
concat_ws(',','2021','04'); //是带连字符的字符串连接比较字符串
STRCMP (string1 ,string2 ); //逐字符比较两字串大小,(实际是ascii码值比较)查找字符串
find_in_set('mysql','order,mysql,sql'); //是在集合中查找字符串位置
field('mysql','oracle','sql server','mysql'); //查找第一个字符串在后面跟随字符串中匹配的位置
INSTR (string ,substring ) //返回substring首次在string中出现的位置,不存在返回0,这和LOCATE的双参数形式相同,除非参数的顺序被颠倒
LOCATE (substring , string [,start_position ] ) ;//同INSTR,但可指定开始位置,
position(str1 in str); //position(substr IN str)是 LOCATE(substr,str)同义词截取字符串
LEFT (string2 ,length ); //从string2中的左边起取length个字符
right(str,num); //从右边指定位置截取字符串
SUBSTRING (str , position [,length ]) //从str的position开始,取length个字符, 注:mysql中处理字符串时,默认第一个字符下标为1,即参数position必须大于等于1 
mid(str,num,len); //和substring同义
TRIM([[BOTH|LEADING|TRAILING] [padding] FROM]string2); //去除指定位置的指定位置空格
ltrim(str); //去除左边空格
rtrim(str); //去除右边空格填充替换字符串
insert(str,pos,len,newstr); //指定位置和长度替换
replace(str,substr,newstr); //用新字符串替换原字符串中子字符串
LPAD (string ,length ,pad ); //重复用pad加在string开头,直到字串长度为length
RPAD (string ,length ,pad); //在string后用pad补充,直到长度为length
REPEAT (string ,count ); //重复count次
SPACE(count); //生成count个空格读取文件
LOAD_FILE (file_name ); //从文件读取内容大小写转换
UCASE (string2 ); //转换成大写
upper(s);//转换为大写
lower(s);//转换为小写
lcase(s);//转换为小写

3.4.2 数学类

ABS (number2 ); //绝对值
BIN (decimal_number ); //十进制转二进制
ceil(x);//向上取整
CEILING (number2 ); //向上取整
CONV(number2,from_base,to_base); //进制转换
FLOOR (number2 ); //向下取整
FORMAT (number,decimal_places ); //保留小数位数
HEX (DecimalNumber ); //转十六进制
注:HEX()中可传入字符串,则返回其ASC-11码,如HEX('DEF')返回4142143,也可以传入十进制整数,返回其十六进制编码,如HEX(25)返回19
LEAST (number , number2 [,..]); //求最小值
MOD (numerator ,denominator ); //求余
POWER (number ,power ); //求指数
RAND(); //随机数 ,返回[0,1)之间的小数
RAND([seed]);//当调用一个整数参数时,RAND()使用该随机数发生器种子值。每次在给定值种子生成,RAND()会产生一个可重复的一系列数字
SQRT(number2); //开平方
truncate(x,y); //对x进行小数点后y位的舍取
ROUND (number [,decimals ]); //四舍五入,decimals为小数位数]

注:ROUND函数返回类型并非均为整数,如:

(1)默认变为整形值
mysql> select round(1.23);  
+-------------+  
| round(1.23) |  
+-------------+  
|           1 |  
+-------------+  
1 row in set (0.00 sec)  mysql> select round(1.56);  
+-------------+  
| round(1.56) |  
+-------------+  
|           2 |  
+-------------+  
1 row in set (0.00 sec) 可以设定小数位数,返回浮点型数据
mysql> select round(1.567,2);  
+----------------+  
| round(1.567,2) |  
+----------------+  
|           1.57 |  
+----------------+  
1 row in set (0.00 sec) 
SIGN (number2 ) //

3.4.3 日期时间类

获取时间
NOW (); //当前时间  日期+时间
SYSDATE();//取的是动态的实时时间  日期+时间
localtime();//日期+时间
localtimestamp();//日期+时间
CURRENT_DATE ( ); //当前日期
curdate(); //当前日期
CURRENT_TIME ( ); //当前时间
curtime(); //当前时间
CURRENT_TIMESTAMP ( ); //当前时间戳
FROM_UNIXTIME(毫秒值/1000,'%Y-%m-%d %T');//毫秒值转换成日期数据类型
UNIX_TIMESTAMP(日期);//日期转秒值 若要毫秒需要乘以1000计算日期和时间函数:
ADDTIME (date2 ,time_interval ); //将time_interval加到date2
DATE (datetime ); //返回datetime的日期部分
DATEDIFF(date1,date2);//比较两个日期的天数
DATE_ADD (date2 , INTERVAL d_value d_type ); //在date2中加上日期或时间
DATE_SUB (date2 , INTERVAL d_value d_type ); //在date2上减去一个时间
DATE_FORMAT(date,'日期格式');//用于一不同格式显示日期、时间数据
DAY (date); //返回日期的天
DAYNAME (date ); //英文星期
DAYOFWEEK (date ); //星期(1-7) ,1为星期天
DAYOFMONTH(datetime) //月的第几天
DAYOFYEAR (date ); //一年中的第几天
EXTRACT (interval_name FROM date ) //从date中提取日期的指定部分
FROM_DAYS(天数);//从TO_DAYS的天数中获取日期
MAKEDATE (year ,day ) //给出年及年中的第几天,生成日期串
MAKETIME (hour ,minute ,second ) //生成时间串
MONTHNAME (date ) //英文月份名
SEC_TO_TIME (seconds ) //秒数转成时间
STR_TO_DATE (string ,format ) //字串转成时间,以format格式显示
TO_DAYS(date);//返回从0年(公元1年)至当前日期总天数
TIMEDIFF (datetime1 ,datetime2 ) //两个时间差
TIME_TO_SEC (time ) //时间转秒数
WEEK (date_time [,start_of_week ]) //第几周
YEAR (datetime ) //年份
HOUR(datetime) //小时
LAST_DAY(date) //date的月的最后日期
MICROSECOND(datetime) //微秒
MONTH(datetime) //月
MINUTE(datetime) //分返回符号,正负或0时间和时区转换
DATE_FORMAT (datetime ,FormatCodes ) //使用formatcodes格式显示datetime
CONVERT_TZ (datetime2 ,fromTZ ,toTZ ); //转换时区

3.4.4 系统信息函数

登陆后使用 \h可以查看mysql的帮助信息
\s 获取当前MySQL实例信息
version():获取版本号信息
database():数据库名
user():用户名
last_insert_id():获取最近插入的id值
password(str):对密码进行加密

3.4.5 窗口函数

窗口函数不能直接用于WHERE子句,这是因为窗口函数需要在数据分组后进行计算。因此,它们原则上只能在SELECT子句中使用。然而,可以通过使用子查询的方式,先对满足WHERE条件的数据进行筛选,然后再在这些过滤后的数据上应用窗口函数。

3.4.5.1 排序类

mysql8.0中有相关的内置函数,而且考虑了各种排名问题:

  • row_number(): 同记录不同名,相当于行号,例如3000、2000、2000、1000排名后为1、2、3、4
  • rank(): 同记录同名,有跳级,例如3000、2000、2000、1000排名后为1、2、2、4
  • dense_rank(): 同薪同名,无跳级,例如3000、2000、2000、1000排名后为1、2、2、3
  • ntile(): 分桶排名,即首先按桶的个数分出第一二三桶,然后各桶内从1排名,实际不是很常用

另外这三个函数必须要要与其搭档over()配套使用,over()中的参数常见的有两个,分别是

  • partition by,按某字段切分
  • order by,与常规order by用法一致,也区分ASC(默认)和DESC,因为排名总得有个依据
3.4.5.2 获取下一行Lead

LEAD() 函数是一个窗口函数,用于获取指定列的下一行值。它的语法如下:

LEAD(expression, offset, default_value) OVER (PARTITION BY partition_expression ORDER BY sort_expression)

  • expression:要获取下一行值的列或表达式。
  • offset:可选参数,表示要获取的下一行相对于当前行的偏移量,默认为 1。
  • default_value:可选参数,在没有下一行时返回的默认值,默认为 NULL
  • PARTITION BY partition_expression:可选子句,用于将结果集分区并在每个分区内进行计算。如果不指定该子句,则整个结果集被视为一个分区。
  • ORDER BY sort_expression:可选子句,用于对结果集进行排序。

LEAD() 函数在查询结果集中根据指定的排序条件获取下一行值。它可以用于比较相邻行之间的差异、计算行与下一行之间的差值等操作。

SELECT column_name, LEAD(column_name) OVER (ORDER BY column_name) AS next_value
FROM table_name;
3.4.5.3 获取上一行Lag

概念:LAG 函数用于获取当前行之前的指定行数的数据。

用途:常用于计算两个相邻行之间的差异,如计算销售额的增长率、学生成绩的提升情况等。

LAG(expression, offset, default) OVER (  [PARTITION BY partition_expression, ... ]  ORDER BY sort_expression [ASC | DESC], ...  
)

参数说明

  • expression:要获取的列或表达式。
  • offset:要获取的行数,可以是正数、负数或0。正数表示获取当前行之前的行数,负数表示获取当前行之后的行数,0表示获取当前行。默认为1,表示上一行。
  • default:可选参数,表示当获取的行不存在时,返回的默认值。如果省略,默认为 NULL。
  • PARTITION BY:可选,用于将数据分成不同的分区或组,每个分区内部都有自己独立的窗口。
  • ORDER BY:指定窗口内的排序顺序。

示例

SELECT id,salesperson,month,sales,LAG(sales, 1) OVER (PARTITION BY salesperson ORDER BY month) AS previous_month_sales
FROM sales;
3.4.5.4 SUM()

SUM 作为一个聚合函数,当与窗口子句(OVER())结合使用时,它就变成了一个窗口函数,可以对一个窗口内的值进行求和。SUM() 窗口函数用于对一组数据进行累加。

SUM(expression) OVER (  [PARTITION BY partition_expression, ... ]  [ORDER BY sort_expression [ASC | DESC], ...]  [ROWS BETWEEN window_start AND window_end]  
)

参数说明

  • expression:要计算总和的列或表达式。
  • PARTITION BY:可选。它将结果集分成多个分区,并为每个分区独立计算窗口函数。
  • ORDER BY:可选。它定义了窗口内的行的顺序。
  • ROWS BETWEEN window_start AND window_end:定义了窗口的框架,即哪些行应该被包括在窗口内。如果不指定,则默认为 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(对于 SUM 通常使用 ROWS 而不是 RANGE)。

假设你想查看每位销售人员截至当前月份的累计销售额。

SELECT id,salesperson,month,sales,SUM(sales) OVER (PARTITION BY salesperson ORDER BY month) AS cumulative_sales
FROM sales;

这篇关于MySQL基础之触发器,函数,存储过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1084961

相关文章

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

C/C++的编译和链接过程

目录 从源文件生成可执行文件(书中第2章) 1.Preprocessing预处理——预处理器cpp 2.Compilation编译——编译器cll ps:vs中优化选项设置 3.Assembly汇编——汇编器as ps:vs中汇编输出文件设置 4.Linking链接——链接器ld 符号 模块,库 链接过程——链接器 链接过程 1.简单链接的例子 2.链接过程 3.地址和

mysql索引四(组合索引)

单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引;组合索引,即一个索引包含多个列。 因为有事,下面内容全部转自:https://www.cnblogs.com/farmer-cabbage/p/5793589.html 为了形象地对比单列索引和组合索引,为表添加多个字段:    CREATE TABLE mytable( ID INT NOT NULL, use

mysql索引三(全文索引)

前面分别介绍了mysql索引一(普通索引)、mysql索引二(唯一索引)。 本文学习mysql全文索引。 全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用【分词技术】等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。 在MySql中,创建全文索引相对比较简单。例如:我们有一个文章表(article),其中有主键ID(

mysql索引二(唯一索引)

前文中介绍了MySQL中普通索引用法,和没有索引的区别。mysql索引一(普通索引) 下面学习一下唯一索引。 创建唯一索引的目的不是为了提高访问速度,而只是为了避免数据出现重复。唯一索引可以有多个但索引列的值必须唯一,索引列的值允许有空值。如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该使用关键字UNIQUE,把它定义为一个唯一索引。 添加数据库唯一索引的几种

mysql索引一(普通索引)

mysql的索引分为两大类,聚簇索引、非聚簇索引。聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引则不同。聚簇索引能够提高多行检索的速度、非聚簇索引则对单行检索的速度很快。         在这两大类的索引类型下,还可以降索引分为4个小类型:         1,普通索引:最基本的索引,没有任何限制,是我们经常使用到的索引。         2,唯一索引:与普通索引

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

【操作系统】信号Signal超详解|捕捉函数

🔥博客主页: 我要成为C++领域大神🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 如何触发信号 信号是Linux下的经典技术,一般操作系统利用信号杀死违规进程,典型进程干预手段,信号除了杀死进程外也可以挂起进程 kill -l 查看系统支持的信号

【服务器运维】MySQL数据存储至数据盘

查看磁盘及分区 [root@MySQL tmp]# fdisk -lDisk /dev/sda: 21.5 GB, 21474836480 bytes255 heads, 63 sectors/track, 2610 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesSector size (logical/physical)