目录
- SQL语言分类
- SQL语言规范
- 数据处理之查询
- 子查询
- 数据处理之增删改
- 常见函数
- 创建和管理表
- 约束和分页
- 事物
- 视图
- 存储过程和函数
- 触发器
- 流程控制
参考/来源
SQL语言分类
DML(Data Manipulation Language)
数据操纵语句,用于添加、删除、修改、查询数据库记录,并检查数据完整性
(1)INSERT:添加数据到数据库中
(2)UPDATE:修改数据库中的数据
(3)DELETE:删除数据库中的数据
(4)SELECT:选择(查询)数据
DDL(Data Definition Language)
数据定义语句,用于库和表的创建、修改、删除。
(1)CREATE TABLE:创建数据库表
(2)ALTER TABLE:更改表结构、添加、删除、修改列长度
(3)DROP TABLE:删除表
(4)CREATE INDEX:在表上建立索引
(5)DROP INDEX:删除索引
DCL(Data Control Language)
数据控制语句,用于定义用户的访问权限和安全级别。
(1)GRANT:授予访问权限
(2)REVOKE:撤销访问权限
(3)COMMIT:提交事务处理
(4)ROLLBACK:事务处理回退
(5)SAVEPOINT:设置保存点
(6)LOCK:对数据库的特定部分进行锁定
SQL语言规范
(1)不区分大小写
(2)每句话用;或\g结尾
(3)各子句一般分行写
(4)关键字不能缩写也不能分行
(5)用缩进提高语句的可读性
数据处理之查询
基本的SELECT语句
(1)别名
- 紧跟列名
- 也可以在列名和别名之间加入关键字‘AS’,别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写。
(2)字符串
- 字符串可以是 SELECT 列表中的一个字符,数字,日期。
- 日期和字符只能在单引号中出现。
- 每当返回一行时,字符串被输出一次。
过滤和排序数据
(1)过滤
使用WHERE 子句,将不满足条件的行过滤掉。
WHERE 子句紧随 FROM 子句。
(2)where子句中的比较运算
操作符 | 含义 |
---|---|
= | 等于(不是==) |
> | 大于 |
>= | 大于、等于 |
< | 小于 |
<= | 小于等于 |
<>、!= | 不等于 |
between … and … | 两个值之间(含边界) |
in (set) | 在列表中的值 |
like | 模糊查询 |
is null | 空值 |
and | 逻辑并 |
or | 逻辑或 |
not | 逻辑否 |
(3)排序 ORDER BY子句
使用 ORDER BY 子句排序
ASC(ascend): 升序
DESC(descend): 降序ORDER BY 子句在SELECT语句的结尾。
- 多个列排序时,按照ORDER BY 列表的顺序排序
分组函数
(1)作用
分组函数作用于一组数据,并对一组数据返回一个值。
(2)组函数类型
AVG() 平均值
COUNT() 计数,记录符合某条件的记录个数
MAX() 最大值
MIN() 最小值
SUM() 求和
(3)组函数类型语法
非法使用组函数
• 不能在 WHERE 子句中使用组函数。
• 可以在 HAVING 子句中使用组函数
(4)分组数据: GROUP BY 子句
- 可以使用GROUP BY子句将表中的数据分成若干组。
- 在SELECT 列表中所有未包含在组函数中的列都应该包含在 GROUP BY 子句中。
- 包含在 GROUP BY 子句中的列不必包含在SELECT 列表中
- 可以使用多个列同时分组
(5)过滤分组: HAVING 子句
使用 HAVING 过滤分组:
行已经被分组。
使用了组函数。
满足HAVING 子句中条件的分组将被显示
多表查询
(1)where链接
连接 n个表,至少需要 n-1个连接条件。 例如:连接三个表,至少需要两个连接条件。
select table1.column, table2.column
form table1, table2
where table1.columu1 = table2.column2;
- 在where子句中写入连接条件
- 在表中有相同列时,在列名之前加上表名前缀
(2)ON子句连接
• 自然连接中是以具有相同名字的列为连接条件的。
• 可以使用 ON 子句指定额外的连接条件。
• 这个连接条件是与其它条件分开的。
• ON 子句使语句具有更高的易读性。
(3)Join子句连接
分类:
mysql内连接 [inner] join on
外连接
左外连接 left [outer] join on
右外连接 right [outer] join on
图解:
(4)驱动表
驱动表,指多表关联查询时,第一个被处理的表,亦可称之为基表,然后再使用此表的记录去关联其他表。驱动表的选择遵循一个原则:在对最终结果集没影响的前提下,优先选择结果集最少的那张表作为驱动表。
LEFT JOIN 一般以左表为驱动表(RIGHT JOIN一般则是右表 ),INNER JOIN 一般以结果集少的表为驱动表,如果还觉得有疑问,则可用 EXPLAIN 来找驱动表,其结果的第一张表即是驱动表。 你以为 EXPLAIN 就一定准吗 ? 执行计划在真正执行的时候是可能改变的! 绝大多少情况下是适用的,特别是 EXPLAIN。
(5)联表算法
MySQL 的联表算法是基于嵌套循环算法(nested-loop algorithm)而衍生出来的一系列算法,根据不同条件而选用不同的算法:
在使用索引关联的情况下,有 Index Nested-Loop join 和 Batched Key Access join 两种算法;
在未使用索引关联的情况下,有 Simple Nested-Loop join 和 Block Nested-Loop join 两种算法。
Simple Nested-Loop
简单嵌套循环,简称 SNL;逐条逐条匹配
Block Nested-Loop
缓存块嵌套循环连接,简称 BNL,是对 INL 的一种优化;一次性缓存多条驱动表的数据,然后拿 Join Buffer 里的数据批量与内层循环读取的数据进行匹配
Index Nested-Loop
索引嵌套循环,简称 INL,是基于被驱动表的索引进行连接的算法;驱动表的记录逐条与被驱动表的索引进行匹配,避免和被驱动表的每条记录进行比较,减少了对被驱动表的匹配次数
SQL的执行顺序
这里以select
为例
FROM # 对左右两张表执行笛卡尔积,产生第一张表v1。行数为n*m (n为左表的行数,m为右表的行数)
<left_table>
ON # 根据ON的条件逐行筛选v1,特结果插入v2中
<join_condition>
<join_type>
JOIN # 添加外部行,如果指定了LEFT JOIN(LEFT OUTER JOIN),则先追历一追左表的每一行,其中不在v2的行会被插入到vt2,该行的剩余字段将被填充为NULL,形成vt3;如果指定了RIGHT JOIN也是同理。但如果指定的是INNER JOIN,则不会添加外部行,上述插入过程被忽略,vt2=vt3
<right_table>
WHERE # 对vt3进行条件过滤。满足条件的行被输出到v4
<where_condition>
GROUP BY
<group_by_list>
HAVING
<having_condition>
SELECT # 取出Vt4的指定字段到vt5
DISTINCT
<select_list>
ORDER BY
<order_by_condition>
LIMIT
<limit_number>
子查询
描述子查询可以解决的问题。
- 定义子查询。
- 列出子查询的类型。
- 书写单行子查询和多行子查询。
概念
定义
出现在其他语句内部的select语句,称为子查询或内查询
内部嵌套其他select语句的查询,称为外查询或主查询
select first_name from employees where
department_id in(
select department_id from departments
where location_id=1700
)
注意事项
- 子查询要包含在括号内。
- 将子查询放在比较条件的右侧。
- 单行操作符对应单行子查询,多行操作符对应多行子查询。
解决的问题
子查询类型
单行子查询
只返回一行
使用单行比较操作符
=
>
>=
<
<=
<>
语法
可以使用组函数、HAVING子句
对于子查询中的空值,不返回任何行
多行子查询
返回多行
使用多行比较操作符
in/not in
any some
all
ANY
ALL
数据处理之增删改
插入数据
mysql中常用的三种插入数据的语句:
insert into表示插入数据,数据库会检查主键,如果出现重复会报错;
replace into表示插入替换数据,需求表中有PrimaryKey,或者unique索引,如果数据库已经存在数据,则用新数据替换,如果没有数据效果则和insert into一样;
insert ignore表示,如果中已经存在相同的记录,则忽略当前新数据;
日期和字符应该使用单引号包括
插入空值
插入指定的值
从其他表中拷贝数据
更新数据
删除数据
常见函数
详细参考
字符函数
大小写控制函数
字符控制函数
- 对于CONCAT函数,还有concat_ws()函数、group_concat,详见CONCAT函数相关
数学函数
日期函数
- now 获取当前日期
- str_to_date 将日期格式的字符转换成指定格式的日期
- date_format 将日期转换成字符
流程控制函数
窗口函数
窗口:记录集合
窗口函数:在满足某些条件的记录集合上执行的特殊函数,对于每条记录都要在此窗口内执行函数。有的函数随着记录的不同,窗口大小都是固定的,称为静态窗口;有的函数则相反,不同的记录对应着不同的窗口,称为滑动窗口。
窗口函数和普通聚合函数的区别:
- 聚合函数是将多条记录聚合为一条;窗口函数是每条记录都会执行,有几条记录执行完还是几条。
- 聚合函数也可以用于窗口函数。
窗口函数的基本用法:
函数名 OVER 子句
over关键字用来指定函数执行的窗口范围,若后面括号中什么都不写,则意味着窗口包含满足WHERE条件的所有行,窗口函数基于所有行进行计算;如果不为空,则支持以下4中语法来设置窗口。
- window_name:给窗口指定一个别名。如果SQL中涉及的窗口较多,采用别名可以看起来更清晰易读;
- PARTITION BY 子句:窗口按照哪些字段进行分组,窗口函数在不同的分组上分别执行;
- ORDER BY子句:按照哪些字段进行排序,窗口函数将按照排序后的记录顺序进行编号;
- FRAME子句:FRAME是当前分区的一个子集,子句用来定义子集的规则,通常用来作为滑动窗口使用。
示例
mysql> SELECT * -> FROM( -> SELECT -> ROW_NUMBER() OVER (PARTITION BY stu_id ORDER BY score DESC) AS score_order1, -> RANK() OVER (PARTITION BY stu_id ORDER BY score DESC) AS score_order2, -> DENSE_RANK() OVER (PARTITION BY stu_id ORDER BY score DESC) AS score_order3, -> stu_id, lesson_id, score -> FROM t_score) t -> WHERE stu_id = 1 AND score_order1 <= 3 AND score_order2 <= 3 AND score_order3 <= 3 -> ; +--------------+--------------+--------------+--------+-----------+-------+ | score_order1 | score_order2 | score_order3 | stu_id | lesson_id | score | +--------------+--------------+--------------+--------+-----------+-------+ | 1 | 1 | 1 | 1 | L005 | 98 | | 2 | 1 | 1 | 1 | L001 | 98 | | 3 | 3 | 2 | 1 | L004 | 88 | +--------------+--------------+--------------+--------+-----------+-------+
ROW_NUMBER():顺序排序——1、2、3
RANK():并列排序,跳过重复序号——1、1、3
DENSE_RANK():并列排序,不跳过重复序号——1、1、2
创建和管理表
- 创建数据库
- 创建表
- 描述各种数据类型
- 修改表的定义
- 删除,重命名和清空表
创建数据库
命名规则
- 数据库名不得超过30个字符,变量名限制为29个
- 必须只能包含A-Z, a-z, 0-9,_,共63个字符
- 不能在对象名的字符间留空格
- 必须不能和用户定义的其他对象名重名
- 必须保证你的字段没有和保留字、数据库系统或常用方法冲突
- 保持字段名和类型的一致性,在命名字段并为其指定数据类型的时候一定要保证一致性。假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了
语句
# 创建数据库
create database mydb;
# 删除数据库
drop database accounts;
# 查看所有数据库
show databases;
# 使用某个数据库表
use tablename;
创建表
注意:
在创建MySQL数据库和表时,数据库名、表名和字段名外面的符号**”`”,不是单引号,而是英文输入法的反单引号,同键盘‘~’**同一位置。
是为了避免你的表名和字段名 和数据库SQL中的关键字冲突。但也可以不加。
此外,需要注意,有部分程序员喜欢从网页上拷贝别人博客中的SQL脚本,在拷贝-粘贴的过程中容易将反单引号不经意间变为单引号,从而造成导入SQL脚本错误,请大家在开发时特别小心!!!
查看表结构时除了使用
describe table
,也可以简写为desc table
mysql> describe wxusers; +------------+--------------+------+-----+-------------------+-----------------------------------------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+-------------------+-----------------------------------------------+ | id | int | NO | PRI | NULL | auto_increment | | nick_name | varchar(50) | NO | | NULL | | | avatar_url | varchar(500) | NO | | NULL | | | openId | varchar(100) | NO | UNI | NULL | | | phone | varchar(20) | NO | UNI | NULL | | | user_id | int | YES | | NULL | | | created | timestamp | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED | | updated | timestamp | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP | +------------+--------------+------+-----+-------------------+-----------------------------------------------+ 8 rows in set (0.01 sec) mysql> desc wxusers; +------------+--------------+------+-----+-------------------+-----------------------------------------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+-------------------+-----------------------------------------------+ | id | int | NO | PRI | NULL | auto_increment | | nick_name | varchar(50) | NO | | NULL | | | avatar_url | varchar(500) | NO | | NULL | | | openId | varchar(100) | NO | UNI | NULL | | | phone | varchar(20) | NO | UNI | NULL | | | user_id | int | YES | | NULL | | | created | timestamp | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED | | updated | timestamp | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP | +------------+--------------+------+-----+-------------------+-----------------------------------------------+ 8 rows in set (0.00 sec)
常用数据类型
一些注意点:
在int后面的括号的数字,并不影响可存储最大数据的大小,都是使用4字节来进行存储
一般int后面的数字,配合
zerofill
一起使用才有效CREATE TABLE `user` ( `id` int(4) unsigned zerofill NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; INSERT INTO `user` (`id`) VALUES (1),(10),(100),(1000); mysql> select * from user; +------+ | id | +------+ | 0001 | | 0010 | | 0100 | | 1000 | +------+
关于数据库的时间字段
MySQL 数据库中常见的日期类型有 YEAR、DATE、TIME、DATETIME、TIMESTAMEP。因为业务绝大部分场景都需要将日期精确到秒,所以在表结构设计中,常见使用的日期类型为DATETIME 和 TIMESTAMP
类型 DATETIME 最终展现的形式为:
YYYY-MM-DD HH:MM:SS
,固定占用 8 个字节。从 MySQL 5.6 版本开始,DATETIME 类型支持毫秒,DATETIME(N)
中的 N 表示毫秒的精度。可以将
DATETIME
初始化值设置为当前时间,并设置自动更新当前时间的属性register_date DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), last_modify_date DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
TIMESTAMP
为时间戳类型,其实际存储的内容‘1970-01-01 00:00:00
到现在的毫秒数。在 MySQL 中,由于类型TIMESTAMP
占用 4 个字节,因此其存储的时间上限只能到2038-01-19 03:14:07
。从 MySQL 5.6 版本开始,类型TIMESTAMP
也能支持毫秒。与DATETIME
不同的是,若带有毫秒时,类型TIMESTAMP
占用 7 个字节,而DATETIME
无论是否存储毫秒信息,都占用 8 个字节。
TIMESTAMP
最大的优点是可以带有时区属性,参数time_zone
指定了当前使用的时区,默认为SYSTEM
使用操作系统时区。mysql> SET time_zone = '+08:00' # 中国的时区 mysql> SET time_zone = 'Asia/Shanghai'; # 直接设置地点
- 综上,推荐使用DATATIME类型
varchar(M)的M是说字符个数,而不是字节,最大为16383
具体底层原理,还有一些复杂,可以看看这篇文章
使用子查询创建表
修改表
ALTER TABLE 语句
可以实现:
- 向已有的表中添加列
- 修改现有表中的列
- 删除现有表中的列
- 重命名现有表中的列
追加一个新列
修改一个列
删除一个列
重命名一个列
总结如下:
- ALTER TABLE 表名 ADD 列名/索引/主键/外键等;
- ALTER TABLE 表名 DROP 列名/索引/主键/外键等;
- ALTER TABLE 表名 ALTER 仅用来改变某列的默认值;
- ALTER TABLE 表名 RENAME 列名/索引名 TO 新的列名/新索引名;
- ALTER TABLE 表名 RENAME TO/AS 新表名;
- ALTER TABLE 表名 MODIFY 列的定义但不改变列名;
- ALTER TABLE 表名 CHANGE 列名和定义都可以改变。
删除表
清空表
改变对象的名称
约束和分页
- 描述约束
- 创建和维护约束
- 数据库分页
约束
什么是约束
- 为了保证数据的一致性和完整性,SQL规范以约束的方式对表数据进行额外的条件限制。
- 约束是表级的强制规定
- 可以在创建表时规定约束(通过 CREATETABLE 语句),或者在表创建之后也可以(通
过 ALTER TABLE 语句)
约束分类
- 根据约束数据列的限制,约束可分为:
单列约束:每个约束只约束一列
多列约束:每个约束可约束多列数据 - 根据约束的作用范围,约束可分为:
列级约束只能作用在一个列上,跟在列的定义后面
表级约束可以作用在多个列上,不与列一起,而是单独定义
NOT NULL约束
非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。
Null类型特征:
类型的值都可以是null,包括int、float等数据类型
空字符串””不等于null,0也不等于null创建not null 约束
create table emp( id int(10) not null; name varchar(20) not null default 'abc'; sex char null; );
取消not null 约束
alter table emp modify sex varchar(30) null;
UNIQUE约束
唯一约束,允许出现多个空值:NULL
同一个表可以有多个唯一约束,多个列组合的约束。在创建唯一约束的时候,如果不给唯一约束名称,就
默认和列名相同。MySQL会给唯一约束的列上默认创建一个唯一索引
添加唯一约束
删除约束
alter table user drop index uk_name_pwd
PRIMARY KEY约束
主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值
如果是多列组合的主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别上创建。
MySQL的主键名总是PRIMARY,当创建主键约束时,系统默认会在所在的列和列组合上建立对应的
唯一索引。删除主键约束
alter table emp5 drop primary key;
添加主键约束
alter table emp5 add primary key(name, pws);
修改主键约束
alter table emp5 modify id int primary key
FOREIGN KEY约束
外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。
从表的外键值必须在主表中能找到或者为空。当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据,然后才可以删除主表的数据。
还有一种就是级联删除子表数据。
注意:外键约束的参照列,在主表中引用的只能是主键或唯一键约束的列
同一个表可以有多个外键约束
创建外键约束
创建多列外键组合,必须使用表级约束
删除外键约束
alter table emp drop foreign key emp_dept_id_fk;
增加外键约束
alter table emp add [CONSTRAINT emp_dept_id_fk] foreign key(dept_id) references dept(dept_id)
CHECK约束
分页
limit分页
- 背景
查询返回的记录太多了,查看起来很不方便,怎么样能够实现分页查询呢? - 分页原理
所谓分页显示,就是将数据库中的结果集,一段一段显示出来需要的条件
分页实现
事物
- 事务的概念和特性
- 事务的隔离级别
- 事务的案例演示
简介
(1)概念
事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚。所有受到影响的数据将返回到事物开始以前的状态;如果单元中的所有SQL语句均执行成功,则事物被顺利执行。
(2)存储引擎和事物
- 通过show engines;来查看mysql支持的存储引擎。
- 在mysql中用的最多的存储引擎有:innodb,myisam ,memory 等。其中innodb支持事务,而myisam、memory等不支持事务
事物的特点
事务的ACID(acid)属性
- 原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 - 一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态 - 隔离性(Isolation)
事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 - 持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响
事物的使用
- 以第一个 DML 语句的执行作为开始
- 以下面的其中之一作为结束:
COMMIT 或 ROLLBACK 语句
DDL 或 DCL 语句(自动提交)
用户会话正常结束
系统异常终了
数据库的隔离级别
(1)事物与事物
- 对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题:
脏读: 对于两个事务 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段.
之后, 若 T2 回滚, T1读取的内容就是临时且无效的.
不可重复读: 对于两个事务T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段.
之后, T1再次读取同一个字段, 值就不同了.
幻读: 对于两个事务T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插 入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.
- 数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题.
- 一个事务与其他事务隔离的程度称为隔离级别. 数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就越好, 但并发性越弱.
(2)数据库的隔离级别
(3)设置隔离级别
- 每启动一个 mysql 程序, 就会获得一个单独的数据库连接. 每个数据库连接都有一个全局变量 @@tx_isolation, 表示当前的事务隔离级别.
- 查看当前的隔离级别: ·SELECT @@tx_isolation·;
- 设置当前 mySQL 连接的隔离级别:
set transaction isolation level read committed;
- 设置数据库系统的全局的隔离级别:
set global transaction isolation level read committed;
视图
- 什么是视图
- 创建或修改视图
- 删除视图
- 查看视图
概念
(1)什么是视图
(2)视图的好处
- 重用sql语句
- 简化复杂的sql操作,不必知道它的查询细节
- 保护数据,提高安全性
操作视图
(1) 创建和修改
视图的可更新性和视图中查询的定义有关系,以下类型的视图是不能更新的。
- 包含以下关键字的sql语句:
分组函数、distinct、group by、having、union或者union all
- 常量视图
- Select中包含子查询
- join
- from一个不能更新的视图
- where子句的子查询引用了from子句中的表
(2) 删除视图
(3) 查看视图
存储过程和函数
- 什么是存储过程和函数
- 使用存储过程和函数的好处
- 创建存储过程和函数
- 修改存储过程和函数
- 调用存储过程和函数
- 查看存储过程和函数
什么是存储过程和函数
- 存储过程和函数:
事先经过编译并存储在数据库中的一段sql语句的集合。 - 使用好处:
简化应用开发人员的很多工作
减少数据在数据库和应用服务器之间的传输
提高了数据处理的效率
创建存储过程和函数
修改、删除、查看存储过程和函数
调用存储过程和函数
- 举例使用场景:
触发器
详细内容参考:MySQL | 触发器,MySQL数据库触发器讲解与案例
基本概念
触发器是一种特殊类型的存储过程,它不同于存储过程,主要是通过事件触发而被执行的,即不是主动调用而执行的;而存储过程则需要主动调用其名字执行
触发器:trigger,是指事先为某张表绑定一段代码,当表中的某些内容发生改变(增、删、改)的时候,系统会自动触发代码并执行。
语法
create trigger 触发器名字 触发时间 触发事件 on 表 for each row
begin
-- 触发器内容主体,每行用分号结尾
end
流程控制
(1)case结构——作为表达式
(2)case结构——作为独立的语句
(3)循环结构