目录

10.1函数

(1)内置函数

(2)自定义函数

1.自定义函数:

2.查看函数(所有):

3.调用函数

4.删除函数

10.2存储过程

(1)存储过程的概念

(2)存储过程的创建与执行

(3)存储过程的修改与删除

(4)存储过程的错误处理

10.3变量

(1)系统变量

(2)会话变量

(3)局部变量

(4)作用域

10.4流程控制

(1)判断语句

(2)循环语句

(3)跳转语句

10.5游标

(1)游标的作用

(2)游标的操作流程

10.6触发器

(1)触发器的概述

(2)触发器的基本操作

10.7事件

(1)事件的概述

(2)事件的基本操作

10.8预处理SQL语句


10.1函数

函数:指的是一段用于完成特定功能的代码。
使用函数时,只需关心函数的参数和返回值,就可以完成一个特定的功能。

(1)内置函数

内置函数:也称为系统函数,MySQL提供的函数,无需定义、直接使用即可。

1.substring:字符串截取(字符为单位)。

定义变量:set @cn='世界你好'; set @en='hello world';

字符串截取:select substring(@cn,1,1); select substring(@en,1,1);

结果:世  h

截取从位置1开始:mysql中字符串的下标从1开始

截取长度为一:中文没有问题,截取单位为字符。

2.char_lengh:字符长度      length:字节长度

select char_legth(@cn),char_length(@en),length(@cn),length(@en);

结果:4  11  8  11  (一个字符两个字节)

3.Instr:判断字符串是否在某个具体的字符串中存在,返回位置。

select instr(@cn,'界'),instr(@en,'ll'),instr(@cn,'拜拜');

结果:2   3  0(0为没找到)

4.lpad:左填充,将字符串按照某个指定的填充方式,填充到指定长度(字符单位)。

select lpad(@cn,20,'欢迎'),lpad(@en,20,'hello');

结果:欢迎欢迎...世界你好  hellohellhello world

5.Insert:替换,找到目标位置,指定长度的字符串,替换成目标字符串。

select insert(@en,3,3,'y');@en

结果:hey world   hello world

6.strcmp:compare,字符串比较

set @f='hello';set @s='hey';set @t='HEY';

select strcmp(@f,@s),strcmp(@s,@t),strcmp(@s,@f);

结果:-1(小)   0(相等)   1(大)

其他函数大全:

分类

函数名称

描述

三角

函数

PI()

计算圆周率

RADIANS(x)

用于将角度x转换为弧度

DEGREES(x)

用于将弧度x转换为角度

SIN(x)

正弦函数

COS(x)

余弦函数

TAN(x)

正切函数

COT(x)

余切函数

ASIN(x)

反正弦函数

分类

函数名称

描述

三角

函数

ACOS(x)

反余弦函数

ATAN(x)

反正切函数

指数

函数

SQRT(x)

求x的平方根

POW(x,y)或POWER(x,y)

幂运算函数(计算x的y次方)

EXP(x)

计算e(自然对数的底约为2.71828)的x次方

对数

函数

LOG(x)

计算x的自然对数

LOG10(x)

计算以10为底的对数

求近似值函数

ROUND(x,[y])

计算离x最近的整数;若设置参数y,与FORMAT(x,y)

功能相同

分类

函数名称

描述

求近似值函数

TRUNCATE(x,y)

返回小数点后保留y位的x(舍弃多余小数位,不进行四舍五入)

FORMAT(x,y)

返回小数点后保留y位的x(进行四舍五入)

CEIL(x)或CEILING(x)

返回大于等于x的最小整数

FLOOR(x)

返回小于等于x的最大整数

进制

函数

BIN(x)

返回x的二进制数

OCT(x)

返回x的八进制数

HEX(x)

返回x的十六进制数

ASCII(c)

返回字符c的ASCII码(ASCII码介于0~255);

分类

函数名称

描述

进制

函数

CHAR (c1,c2,c3,…)

将c1、c2、c3、…的ASCII码转换为字符,然后返回这些字符组成的字符串

CONV(x,code1,code2)

将code1进制的x变为code2进制数

其他

函数

RAND()

默认返回[0,1]之间的随机数

ABS(x)

获取x的绝对值

MOD(x,y)

求模运算,与x%y的功能相同

分类

函数名称

描述

进制

函数

CHAR (c1,c2,c3,…)

将c1、c2、c3、…的ASCII码转换为字符,然后返回这些字符组成的字符串

CONV(x,code1,code2)

将code1进制的x变为code2进制数

其他

函数

RAND()

默认返回[0,1]之间的随机数

ABS(x)

获取x的绝对值

MOD(x,y)

求模运算,与x%y的功能相同

函数名称

描述

CONVERT(x,type)

以type类型返回x

CONVERT(x USING字符集)

以指定字符集返回x数据

CAST(x AS type)

以type类型返回x

UNHEX(x)

将x转为十六进制数字,然后再转为由数字表示的字符

CONVERT()和CAST()函数的参数x可以是任何类型的表达式。
参数type的可选值为BINARAY、CHAR、DATE、DATETIME、DECIMAL、JSON、SIGNED [INTEGER]、TIME、和UNSIGNED [INTEGER]。

函数名称

描述

CHAR_LENGTH()

获取字符串的长度

LENGTH()

获取字符串占用的字节数

REPEAT()

重复指定次数的字符串,并保存到一个新字符串中

SPACE()

重复指定次数的空格,并保存到一个新字符串中

UPPER()

将字符串全部转为大写字母,与UCASE()函数等价

LOWER()

将字符串全部转为小写字母,与LCASE()函数等价

STRCMP()

比较两个字符串的大小

REVERSE()

颠倒字符串的顺序

函数名称

描述

SUBSTRING()

从字符串的指定位置开始获取指定长度的字符串。与MID()函数等价

LEFT()

截取并返回字符串的左侧指定个字符

RIGHT()

截取并返回字符串的右侧指定个字符

LPAD()

按照限定长度从左到右截取字符串,当字符串的长度小于限定长度时在左侧填充指定的字符

RPAD()

按照限定长度从左到右截取字符串,当字符串的长度小于限定长度时在右侧填充指定的字符

INSTR()

返回子串在一个字符串中第一次出现的位置。与LOCATE()和POSITION(…IN…)函数等价,但参数顺序不同。

FIND_IN_SET()

获取子串在含有英文逗号分割的字符串中的开始位置

函数名称

描述

LTRIM()

删除字符串左侧的空格,并返回删除后的结果

RTRIM()

删除字符串右侧的空格,并返回删除后的结果

TRIM()

删除字符串左右两侧的空格,并返回删除后的结果

INSERT()

从字符串的指定位置开始使用子串替换指定长度的字符串

REPLACE()

使用指定的子串替换字符串中出现的所有指定字符

CONCAT()

将参数连接成一个新字符串

CONCAT_WS()

使用指定分隔符将参数连接成一个新字符串

函数

截取开始位置

限定长度

填充字符

SUBSTRING()

自定义

自定义

不支持

LEFT()

不支持自定义,只能从左侧开始

自定义

不支持

RIGHT()

不支持自定义,只能从右侧开始

自定义

不支持

LPAD()

不支持自定义,只能从左侧开始

自定义

自定义

RPAD()

不支持自定义,只能从左侧开始

自定义

自定义

函数名称

描述

CURDATE()

用于获取MySQL服务器当前日期,与CURRENT_DATE()等价

CURTIME()

用于获取MySQL服务器当前时间,与CURRENT_TIME()等价

NOW()

用于获取MySQL服务器当前日期和时间,与LOCALTIME()、CURRENT_TIMESTAMP()和LOCALTIMESTAMP()都等价

UNIX_TIMESTAMP()

用于获取MySQL服务器当前UNIX时间戳

UNIX_TIMESTAMP(date)

将指定日期时间date转换为UNIX时间戳并返回

DATEDIFF()

判断两个日期之间的天数差距,参数日期必须使用字符串格式

函数名称

描述

DATE()

获取日期或日期时间表达式中的日期部分

TIME()

获取指定日期事件表达式中的时间部分

WEEK()

返回指定日期的周数

DAYNAME()

返回日期对应的星期名称(英文全称)

DAYOFMONTH()

返回指定日期中的天(1~31),与DAY()等价

DAYOFYEAR()

返回指定日期的天数

DAYOFWEEK()

返回日期对应的星期几(1=周日,2=周一,....7=周六)

FROM_UNIXTIME()

将指定的时间戳转成对应的日期时间格式

函数名称

描述

EXTRACT()

按照指定参数提取日期中的数据

DATE_SUB()

从日期中减去时间值(时间间隔)

DATE_ADD()

在指定的日期上添加日期时间

函数名称

作用

MD5()

使用MD5计算并返回一个32位的字符串

AES_ENCRYPT()

使用密钥对字符串进行加密,默认返回一个128位的二进制数

AES_DECRYPT()

使用密钥对密码进行解密

SHA1()或SHA()

利用安全散列算法SHA-1字符串,返回40个十六进制数字组成的字符串

SHA2()

利用安全散列算法SHA-2字符串

ENCODE()

使用密钥对字符串进行编码,默认返回一个二进制数

DECODE()

使用密钥对密码进行解码

PASSWORD()

计算并返回一个41位的密码字符串

函数名称

作用

VERSION()

用于获取当前MySQL服务实例使用的MySQL版本号

DATABASE()

用于获取当前操作的数据库,与SCHEMA()函数等价

USER()

用于获取登录服务器的主机地址及用户名,与SYSTEM_USER()和SESSION_USER()函数等价

CURRENT_USER()

用于获取该账户名允许通过哪些登录主机连接MySQL服务器

CONNECTION_ID()

用于获取当前MySQL服务器的连接ID

BENCHMARK()

重复执行一个表达式

LAST_INSERT_ID()

获取当前会话中最后一个插入的AUTO_INCREMENT列的值

函数名称

作用

JSON_ARRAY()

创建JSON数组

JSON_OBJECT()

创建JSON对象

JSON_CONTAINS()

JSON文档中是否包含路径中指定对象

JSON_CONTAINS_PATH()

JSON文档中是否包含路径中的任意数据

JSON_EXTRACT()

从JSON文档返回数据

JSON_KEYS()

从JSON文档中获取数组中的键

JSON_SEARCH()

获取JSON文档中值的路径

函数名称

作用

JSON_ARRAY_APPEND()

将数据追加到JSON文档的指定路径中

JSON_ARRAY_INSERT()

将数据插入到JSON数组指定路径前

JSON_DEPTH()

获取JSON文档的最大深度

JSON_INSERT()

将数据插入JSON文档

JSON_LENGTH()

获取JSON文档中元素的数量

JSON_MERGE_PATCH()

合并JSON文档,替换重复键的值

JSON_MERGE_PRESERVE()

合并JSON文档,保留重复的键

JSON_PRETTY()

以友好的格式打印JSON文档

函数名称

作用

JSON_REMOVE()

从JSON文档中删除数据

JSON_REPLACE()

替换JSON文档中的值

JSON_SET()

向JSON文档中插入数据

JSON_TYPE()

获取JSON值的类型

JSON_VALID()

JSON值是否有效

(2)自定义函数

用户自定义函数,是由多条语句组成的语句块,每条语句都是一个符合语句定义规范的个体,需要语句结束符——分号(;)。

MySQL一旦遇见语句结束符就会自动开始执行,但函数是一个整体,只有在被调用时才会被执行,那么在定义函数时就需要临时修改语句结束符

DELIMITER 新结束符号自定义函数
新结束符号
DELIMITER ;
自定义的新结束符号推荐使用系统非内置的符号,如$$。
DELIMITER修改语句结束符后,自定义函数中就可正常使用分号结束符,系统由于不再将分号作为语句结束符,从而不会自动执行自定义函数的SQL语句。

1.自定义函数:

CREATE FUNCTION 函数名([参数名 数据类型, …]) RETURNS 返回值类型
[BEGIN]# 函数体RETURN 返回值数据; # 数据必须与结构中定义的返回值类型一致
[END]

自定义函数包括:FUNCTION关键字函数名参数返回值类型以及函数体返回值

函数名的命名必须符合MySQL的语法规定,推荐使用字母、数字和下划线。
可选参数都是由一个参数名称(不区分大小写)和数据类型组成,它们之间使用空格分割,多个参数之间使用逗号分隔。
没有可选参数,定义函数时,函数名也必须跟上一个空的小括号();当函数有返回值时,若其数据类型与指定的类型不相同时,会进行自动类型转换。
•自定义函数体内含有多条语句时,必须使用复合语句语法BEGIN…END包裹函数体。
•该语法以BEGIN开头,以END结尾,在这两个关键字中间可以包含零条或多条SQL语句。
•经常被应用在自定义函数、存储过程、触发器或事件中。
•仅有一条语句时,可以省略BEGIN…END,但通常情况下推荐用BEGIN…END包裹。

2.查看函数(所有):

SHOW FUNCTION STATUS [like 'pattern'];

查看函数创建语句:

SHOW CREATE FUNCTION 函数名;

3.调用函数

函数定义完成,若想要它在程序中发挥作用,需要调用才能使其生效

SELECT 函数名1(实参列表), 函数名2(实参列表), …;

4.删除函数

DROP FUNCTION [IF EXISTS] 函数名;

5.函数参数

两种:定义时的参数叫形参,调用时的参数叫实参(可以是数值,也可是变量)

形参:要求必须指定数据类型

function 函数名(形参名字 字段类型) returns 数据类型

例子:

计算1~某数(10)相加的和

delimiter $$
create function display1(int_1 int) returns int
beginset @i=1;set @res=0;while @i<int_1 doset @res=@res+@i;set @i=@i+1;end while;
return @res;
end
$$

select display1(10);

select @res,@i;     --在函数内部使用@定义的变量,在函数外部也可访问。

结果:55

55  11

10.2存储过程

(1)存储过程的概念

对于SQL编程而言,存储过程是数据中的一个重要的对象,它是在大型数据库系统中一组为了完成特定功能的SQL语句集,在第一次使用经过编译后,再次调用就不需要重复编译,因此执行效率比较高

存储过程与函数的相同点在于,它们的目的都是为了可重复地执行数据库SQL语句的集合,并且都是经过一次编译后,后面再次需要时直接执行即可。

存储过程与函数的不相同点有四个,具体如下。

语法中实现的标识符不同,存储过程使用PROCEDURE,函数为FUNCTION。

存储过程在创建时没有返回值,而函数在定义时必须设置返回值。

存储过程没有返回值类型,且不能将结果直接赋值给变量;而函数定义时需要设置返回值类型,且在调用时必须将返回值赋给变量。

存储过程必须通过CALL进行调用,不能使用SELECT调用;而函数则可在SELECT语句中直接使用。

(2)存储过程的创建与执行

DELIMITER 新结束符号
CREATE PROCEDURE 过程名字([[ IN | OUT | INOUT ] 参数名称 参数类型])
BEGIN过程体
END
新结束符号
DELIMITER ;

存储过程设置参数时,在参数名前还可以指定参数的来源及用途,区别如下。

IN:表示输入参数,即参数是在调用存储过程时传入到存储过程里面使用,传入的数据可以是直接数据(如5),也可以是保存数据的变量。
OUT:表示输出参数,初始值为NULL,它是将存储过程中的值保存到OUT指定的参数中,返回给调用者。
INOUT:表示输入输出参数,即参数在调用时传入到存储过程,同时在存储过程中操作之后,又可将数据返回为调用者。

查看过程

① 查看存储过程的创建语句
SHOW CREATE PROCEDURE 过程名;
② 查看所有符合要求的存储过程
SHOW PROCEDURE STATUS [LIKE 匹配模式];

调用过程

要想存储过程发挥作用,必须使用MySQL提供的CALL语句调用
CALL 数据库名.存储过程名称([实参列表]);
实参列表传递的参数需要创建存储过程的形参相对应
当形参被指定为IN时,则实参值可以为变量或是直接数据;
当形参被指定为OUTINOUT时,调用存储过程传递的参数必须是一个变量,用于接收返回给调用者的数据。

(3)存储过程的修改与删除

修改过程

在MySQL中可以使用ALTER语句修改存储过程的特性

ALTER PROCEDURE 存储过程名称 [特征]
特征指的是存储过程需要修改哪个部分。
ALTER PROCEDURE不能更改存储过程的参数或主体。
存储过程特征选项

特征选项

描述

COMMENT '注释内容'

为存储过程设置注释信息

LANGUAGE SQL

存储过程体是SQL语句,未来可能会支持其它类型语句

CONTAINS SQL

表示子程序中包含除读或写数据的SQL语句

NO SQL

表示子程序中不包含SQL语句

READS SQL DATA

表示子程序中包含读取数据的语句

MODIFIES SQL DATA

表示子程序中包含写数据的语句

SQL SECURITY DEFINER

表示只有定义者才有权执行存储过程

SQL SECURITY INVOKER

表示调用者有权执行存储过程

删除过程

DROP PROCEDURE [IF EXISTS] 存储过程名称

(4)存储过程的错误处理

在存储过程执行期间,可以对某些特定的错误代码、警告或异常进行定义,然后再针对这些错误添加处理程序进行处理

自定义错误处理:在编写存储过程时,可以使用DECLARE语句为指定的错误声明一个名称。

DECLARE 错误名称 CONDITION FOR [错误类型]
错误类型的可选值为mysql_error_code和SQLSTATE [VALUE] sqlstate_value。
前者是数值类型表示的错误代码,如1148。

后者是5个字符长度的错误代码,如SQLSTATE '42000'。

错误的处理程序:为错误代码命名后,需要用DECLARE…HANDLER语句为其设置处理程序。

DECLARE 错误处理方式 HANDLER
FOR 错误类型 [, 错误类型] …
程序语句段
MySQL支持的错误处理方式有两种,一个为CONTINUE(遇到错误不处理,继续执行),另一个为EXIT(遇到错误时马上退出)。
程序语句段表示遇到定义的错误时,需要执行的存储过程代码段。

FOR后的错误类型可选值有6种,其中两种与DECLARE…CONDITION FOR语句的错误类型相同,另外4种类型如下。

使用DECLARE…CONDITION FOR语句声明的错误代码名称。
SQLWARNING:表示所有以01开头的SQLSTATE错误代码。
NOT FOUND:表示所有以02开头的SQLSTATE错误代码。
SQLEXCEPTION:表示除以01或02开头外的所有SQLSTATE错误代码。

10.3变量

(1)系统变量

查看系统变量

SHOW [GLOBAL | SESSION] VARIABLES
[LIKE '匹配模式' | WHERE 表达式]
GLOBAL:显示全局系统变量值,当变量没有全局值时,则不显示任何值。
SESSION:默认的修饰符,可用LOCAL替换,也可省略,用于显示当前连接中有效的系统可变值,如果变量没有会话值,则显示全局变量值。
SHOW VARIABLES时不带任何条件则可以获取当前连接中系统所有有效的变量。

查看具体变量值

select @@变量名;

修改系统变量

1.会话级别(临时)

SET 变量名 = 新值;

2.全局级别

# 语法1
SET GLOBAL 变量名 = 值;
# 语法2
SET @@GLOBAL.变量名 = 值;

全局方式修改系统变量,对所有正在连接的客户端无效,它只针对新连接的客户端永久生效

(2)会话变量

会话变量:也可称为用户变量,指的是用户自定义的变量,跟MySQL当前客户端是绑定的,仅对当前用户使用的客户端生效。

会话变量的组成:“@”符号和变量名,在定义会话变量时必须为该变量赋值。

会话变量的赋值方式:一是利用SET语句,二是在SELECT语句中利用赋值符号“:=”完成赋值,最后一种是利用SELECT…INTO语句。

定义变量

系统为了区分系统变量,规定用户自定变量必须使用一个@符号

set @变量名=值;

查看变量

select @变量名;

MySQL允许从数据表中获取数据,然后赋值给变量,有两种方式

1.边赋值边查看结果

select @变量名:=字段名,字段名from 表明;
select @变量名;

2.只有赋值不看结果

select 字段列表 from 表明 where 字段名=值 into 变量列表;

所有自定义的变量都是会话级别:当前客户端当次连接有效

所有自定义变量不区分数据库(用户级别)

(3)局部变量

DECLARE 变量名1 [, 变量名2] … 数据类型 [DEFAULT 默认值]
局部变量的名称和数据类型是必选参数,当同时定义多个局部变量时,它们只能共用同一种数据类型。
DEFAULT用于设置变量的默认值,省略时变量的初始值为NULL

局部变量的名称不区分大小写,它的命名规则与其他标识符相同,并且它的声明必须在游标或处理程序声明之前。

(4)作用域

全局变量可以在任何地方使用,局部变量只能在函数内部使用。

全局变量:使用set关键字定义,使用@符号标记

局部变量:使用delare关键字声明,没有@符号,所有局部变量的声明必须在函数体开始之前

10.4流程控制

(1)判断语句

1.MySQL中提供了两种不同的IF语法。

一种适用于SQL语句中的条件判断,

IF(条件表达式, 表达式1, 表达式2)
当条件表达式的值为TRUE时,则判断的结果返回表达式1的值,否则返回表达式2的值。
条件表达式不能是与0或NULL进行比较的表达式。

另外一种用于函数、存储过程等程序中实现复杂的SQL操作。

IF 条件表达式1 THEN 语句列表
[ELSEIF 条件表达式2 THEN 语句列表] … [ELSE 语句列表]
END IF
当条件表达式1为真时,执行对应THEN子句后的语句列表。
条件表达式1为假时,继续判断条件表达式2是否为真,若为真,则执行其对应的THEN子句后的语句列表,依次类推。
若所有条件表达式都为假,则执行ELSE子句后的语句列表。
每个语句列表必须由一个或多个SQL语句组成,且不允许为空。

2.MySQL中提供了两种不同的CASE语法

一种适用于SQL语句中的条件判断,

# 语法1
CASE 条件表达式 WHEN 表达式1 THEN 结果1
[WHEN 表达式2 THEN 结果2] ... [ELSE 结果] END
# 语法2
CASE WHEN 条件表达式1 THEN 结果1
[WHEN 条件表达式2 THEN 结果2] ... [ELSE 结果] END

另外一种用于函数、存储过程等程序中实现复杂的SQL操作。

# 语法1
CASE 条件表达式 WHEN 表达式1 THEN 语句列表
[WHEN 表达式2 THEN 语句列表] …[ELSE 语句列表]
END CASE
# 语法2
CASE WHEN条件表达式1 THEN语句列表
[WHEN 条件表达式2 THEN 语句列表] …[ELSE 语句列表]
END CASE

(2)循环语句

while循环

while条件 do要循环执行的代码;
end while;

结构标识符:为某些特定的结构进行命名,然后为的是在某些地方使用名字

基本语法:

标识名字:while条件 do要循环执行的代码;
end while[标识名字];

标识符的存在主要是为了循环体中使用循环控制。

(3)跳转语句

在mysql中没有continue和break,有自己的关键字替代:

Iterate:迭代,就是以下代码不执行,重新开始循环(continue)

Leave:离开,整个循环终止。

{ITERATE | LEAVE} 标签名;
ITERATE语句用于结束本次循环的执行,开始下一轮循环的执行操作,重新开始循环。

LEAVE语句用于终止当前循环,跳出循环体。

10.5游标

(1)游标的作用

在数据库的管理过程中,通过前面学习的SELECT语句仅能返回符合指定条件的结果集,但是没有办法对结果集中的数据进行下一行的检索或每次一条记录一条记录的单独处理等。此时,就可以利用MySQL提供的游标机制进行处理。

游标的本质是一种能从SELECT结果集中每次提取一条记录的指针。

主要用于交互式的应用程序,用户可以根据需要浏览或修改结果集中的数据。

(2)游标的操作流程

1. 定义游标

DECLARE 游标名称 CURSOR FOR SELECT语句
游标名称必须唯一,因为在存储过程或函数中可以存在多个游标,而游标名称是唯一用于区分不同游标的标识。
游标在定义时必须在错误处理程序的语句之前,局部变量声明之后。另外,SELECT语句中不能含有INTO关键字。

2.打开游标

OPEN 游标名称

3.检索数据

FETCH [[NEXT] FROM] 游标名称 INTO 变量名 [, 变量名] …
FETCH语句根据指定的游标名称检索出来的数据存放到对应的变量中。
变量名的个数必须声明游标时通过SELECT语句查询的结果集的字段个数保持一致

4.关闭游标

CLOSE 游标名称

10.6触发器

(1)触发器的概述

触发器:可以看作是一种特殊类型的存储过程。

触发器与存储过程的区别:存储过程使用时需要调用,而触发器是在预先定义好的事件(如INSERT、DELETE等操作)发生时,才会被MySQL自动调用。

创建触发器时需要与数据表相关联,当表发生特定事件(如INSERT、DELETE等操作)时,就会自动执行触发器中提前预定好的SQL代码。

功能:实现插入数据前,强制检验或转换数据等操作,或是在触发器中代码执行错误后,撤销已执行成功的操作,保证数据的安全。

触发器在使用时的优点和缺点

优点:触发器可以通过数据库中的相关表实现级联无痕更改操作;保证数据安全,进行安全校验。
缺点:触发器的使用会影响数据库的结构,同时增加了维护的复杂程度;触发器的无痕操作会造成数据在程序(如PHP、Java等)层面不可控。

(2)触发器的基本操作

1.创建触发器

CREATE TRIGGER 触发器名字 触发时机 触发事件 ON 表 FOR EACH ROW 触发顺序
BEGIN操作的内容
END

选项

可选值

描述

触发时机

BEFORE

在表中数据发生改变前的状态

AFTER

在表中数据已经发生改变后的状态

触发事件

INSERT

插入操作

UPDATE

更新操作

DELETE

删除操作

触发顺序

FOLLOWS 其他触发器名称

新触发器在现有触发器之后激活

PRECEDES 其他触发器名称

新触发器在现有触发器之前激活

对于每张数据表来说,每个触发事件只允许创建一个触发器。
一张数据表根据触发时机的不同最多支持6个触发器。

2.查看触发器

SHOW TRIGGERS [{FROM | IN} 数据库名称] [LIKE '匹配模式' | WHERE 条件表达式]
当未通过FROM或IN指定数据库时,SHOW TRIGGERS获取的是当前选择的数据库下所有的触发器,WHERE用于指定查看触发器的条件。
LIKE子句的使用比较特殊,它用于匹配触发器作用的数据表,而非触发器名称。

3.删除触发器

DROP TRIGGER [IF EXISTS] [数据库.]触发器名称
利用“数据库.触发器名称”的方式可以删除指定数据库下的触发器
当省略“数据库.”时则删除当前选择的数据库下的触发器,若没选择数据库则系统会报错。

10.7事件

(1)事件的概述

概念:MySQL中的事件,指的是在某个特定的时间根据计划让其自动完成指定的任务或每隔多长时间根据计划做一次指定的任务。

功能:事件是由MySQL提供的特殊事件调度程序执行与管理的,它适用于每隔一段时间就有固定需求的操作任务(如创建表、删除数据等)。

触发器与事件的区别:前者仅针对某个表产生的事件(INSERT、UPDATE、DELETE)执行特定的任务,而后者是根据时间的推移触发设定的任务,并且操作对象可以是多张数据表。

(2)事件的基本操作

查看事件调度器是否开启

SHOW VARIABLES LIKE 'event_scheduler';

开启事件调度器

SET GLOBAL event_scheduler = ON;

创建事件

CREATE EVENT [IF NOT EXISTS] 事件名称
ON SCHEDULE 时间与频率
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT '事件的注释']
DO 事件执行的任务主体

事件名:不区分大小写,且必须是一个最大长度不超过64个字符的有效标识符。

ON SCHEDULE 时间与频率:定义事件开始、结束、持续的时间,执行的频率。

ON COMPLETION:用于定义事件一旦过期是否被立即删除,默认值为“NOT PRESERVE”表示删除,设置为PRESERVE表示不删除。

ENABLEDISABLE:可指定当前创建的事件是否可用,默认为ENABLE表示可用,DISABLE表示禁用。

COMMENT:用于为事件设置注释,方便阅读与维护。

DO:后设置事件发生时执行的SQL语句,当SQL语句为多条时,需要放在BEGIN…END中。

CREATE EVENT语句后的时间与频率的设置可实现事件仅执行一次

AT 时间戳 [+ INTERVAL  时间间隔 时间单位] …
时间戳必须包括日期和时间。
时间间隔可以是任意的数字。
通过“+ INTERVAL 时间间隔 时间单位”任意组合时间间隔。
事件中时间与频率的设置最常使用的就是执行定期的重复操作
EVERY时间间隔 时间单位
[STARTS 时间戳 [+ INTERVAL时间间隔 时间单位] …]
[ENDS 时间戳 [+ INTERVAL时间间隔 时间单位] …]
EVERY用于指定事件的执行频率。
STARTS指定事件何时开始重复。

ENDS指定事件何时结束重复。

查看事件

① 查看该事件的相关信息

SHOW EVENTS

② 查看事件的创建语句信息

SHOW CREATE EVENT 事件名

修改事件

ALTER EVENT event_name
[ON SCHEDULE 时间与频率]
[ON COMPLETION [NOT] PRESERVE]
[RENAME TO 新事件名称]
[ENABLE | DISABLE]
[COMMENT '事件的注释']
[DO 事件执行的任务主体]

删除事件

DROP EVENT [IF EXISTS] 事件名称

10.8预处理SQL语句

准备预处理语句

预处理的SQL语句:有一定限制的,原因在于不是所有的SQL都可以被编译。

举例1(不符合):查看警告和错误的语句以及与警告和错误相关的系统变量等。

举例2(符合):常用增、删、改、查的语句以及大部分的SHOW语句。

PREPARE 预处理语句名称 FROM 预处理的SQL语句
预处理语句名称:不区分大小写,用于标识预处理的SQL模板,在后面进行执行或释放预处理语句时使用;
预处理的SQL语句:是一个字符串或包含SQL语句的会话变量,在此SQL模板中“?”作为需动态改变的数据信息,但不能表示SQL关键字或标识符。
•当预处理语句的名称已存在时,若再次创建同名的预处理语句,则系统会先释放原来的语句,然后再重新创建。
•为防止同时创建太多的预处理语句,可以通过max_prepared_stmt_count系统变量限定预处理的最多数量。
•PREPARE语句可以在存储过程中使用,但是不能在自定义函数或触发器中使用。

执行预处理语句

EXECUTE 预处理语句名称 [USING @变量名 [, @变量名] …]

释放预处理语句

{DEALLOCATE | DROP} PREPARE 预处理语句名称

预处理SQL语句属于会话级别的操作,因此它仅适用于创建预处理语句的当前用户会话,不适用于其他会话。同时在会话结束后,即使不执行DEALLOCATE或DROP语句,创建的预处理语句也会被自动释放。

MySQL入门第十天(数据库编程)相关推荐

  1. QT入门第十四天 串口通信协议+收发数据+波特率+数据位+停止位+奇偶校验+串口识别射频RFID的卡号

    QT入门第十四天 串口通信[QT入门第十四天 串口通信协议+收发数据+波特率+数据位+停止位+奇偶校验+串口识别射频RFID的卡号 第一章 常见的硬件通信接口协议 [1]硬件通信接口协议 [2]使用串 ...

  2. 2021-11-23----韩顺平Java入门第十四天

    韩顺平Java入门第十四天(排序.查找) 1.排序     1).排序的介绍:排序是将多个数据,依指定的顺序进行排列的过程.     2).内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序 ...

  3. QT入门第十天 QT安装和使用alsa库和jpeg库实现音视频录制

    QT入门第十天QT安装和使用alsa库和jpeg库实现音视频录制 第一章 ALSA库的移植和使用 1.ALSA简介 2.移植ALSA (1)移植步骤 3.把移植好的库下载到开发板配置 4.使用移植好的 ...

  4. 2021-11-16----韩顺平Java入门第十天

    韩顺平Java入门第十天 1.swith分支结构     基本语法     流程图     快速入门 //请编写一个程序,该程序可以接收一个字符, //比如:a,b,c,d,e,f,g a 表示星期一 ...

  5. window.addeventlistener 不能调用方法_Java入门第十四课:如何定义”方法“

    第十四课,学习定义方法.一个对象包含三种最常见的成员:构造器.Field和方法.Field用于定义状态数据,而方法是行为特征的抽象. 那么什么是方法呢? 在Java中,方法就是用来完成解决某件事情或实 ...

  6. 前端简单入门第十八讲 使用jQuery实现表格的隔行换色

    还记得之前我使用JavaScript来实现表格的隔行换色效果吗?如果读者初次翻阅本文,可记得看看前端简单入门第十二讲 使用JavaScript完成后台数据展示表格的隔行换色!现在我就来使用jQuery ...

  7. python编程入门第3版pdf-Python编程入门第3版PDF电子书免费下载

    本文档的主要内容详细介绍的是Python编程入门第3版PDF电子书免费下载. Python是一种解释型.面向对象.动态数据类型的高级程序设计语言,自20世纪90年代初诞生至今,逐渐被广泛应用于处理系统 ...

  8. python编程入门第3版pdf-Python编程入门第三版

    Python编程入门第三版PDF下载.Python编程入门第三版PDF是一款为Python编程人员制作的一款专业的Python编程从业基础教程,大量的实战例子让你轻松驾驭各种场景! Python编程入 ...

  9. 【SDL游戏编程入门第十六卷】输出中文SDL_ttf以及设置中文标题

    一.前言 从本卷开始,代码做了一定的简化,去掉了不必要的封装,尽量每个模块以讲述功能为主,让示例更加浅显易懂 本卷介绍使用 SDL_ttf 输出中文,以及如何设置中文标题. 二.SDL_ttf 输出中 ...

最新文章

  1. CentOs7中resourcemanager启动不了
  2. spring五:获取容器中对象信息
  3. tensorflow教程 开发者指南——评估器 estimator(tensorflow官方推荐使用的编程API)
  4. 已触发了一个断点 vs_VSCode源码分析-断点调试
  5. html5页面主题,HTML5页面开发笔记
  6. Java小白进阶笔记(1)-重新认识Java
  7. Bootstrap 字体图标Glyphicons
  8. 简单完整的Python小爬虫教程
  9. two pointers(双指针思想)
  10. windows的消息机制
  11. 为什么要有升余弦滤波器和无码间串扰?
  12. 解决在iOS复制失败问题 iOS/Android通用
  13. 列表推导式[x for x in range(n)]
  14. 音量公式_家庭影院功放功率与音量之间的秘密
  15. mysql之从入门到删库跑路
  16. 拒绝焦虑状态:TA爱我吗?
  17. Ubuntu下解压rar的分卷文件 faster_rcnn_models.part1.rar
  18. 原形网络(Prototypical Networks)基于PyTorch的实现
  19. 显卡更新+pytorch安装
  20. 双硬盘好还是纯固态好学计算机专业,固态硬盘虽好,但是和机械硬盘相比还是有其“不足之处”...

热门文章

  1. 盘古开源资讯:夯实产业基础,打造汽车电子芯片产业高地
  2. Arcgis中给nodata的值设为空
  3. 可近似看作直线的是_全国高中数学联赛模拟试题5及答案
  4. 50行Python代码,一键获取微博热点!
  5. Python利用PyQt5制作一个获取网络实时数据NBA数据播报GUI
  6. TASKCTL5.0线上支付购买授权
  7. chrome14-使用snippets辅助debugging
  8. IT运维和自动化运维以及运维开发有啥不同?能解释下吗?
  9. 要闻君说:又一家云服务关停,原来是网易;MongoDB又爆泄露大新闻;Google 的中国版搜索引擎项目其实仍在继续...
  10. 程序员职业发展路线图(完整版+珍藏版)