Mysql 常用 sql 语句 - 快速查询
1.mysql 基础
1.1 mysql 交互
1.1.1 mysql 连接
mysql.exe -hPup
- h:host, default: localhost
- P:port, default: 3306
- u:username
- p:password(如果需要的话)
eg:mysql.exe -hlocalhost -P3306 -uroot -p123456
1.1.2 mysql 客户端发送指令
1.1.3 服务器接收 sql 指令,处理并返回结果
1.1.4 客户端接收并显示结果
1.1.5 断开连接(释放资源,服务器并发限制)
exit
quit
\q
1.2 mysql 数据库服务器
在刚学习的阶段,没有办法了解服务器内部的对象,只能粗略的去分析数据库服务器内部的结构
mysql 服务器内部对象分成了四层:
系统(DBMS)->数据库(DB)-> 数据表(TABLE)-> 字段(FIELD)
2.SQL 基本操作
SQL 基本操作根据操作对象分为三类:库操作,表操作(字段操作),数据操作
一个小操作:
注释:
-- 注释,记住必须有空格在 -- 后面
# 注释
2.1.库操作
2.1.1 新增数据库
create database name [库选项];
库选项:用来约束数据库,分为两个选项
字符集设定:charset/character set 具体字符集(数据存储的编码格式)
一般为 gbk ,utf8
数据库名字不能使用关键字(已经被使用的字符)或者保留字
如果必须使用关键字或保留字,请使用反引号 ``,记住是英文
可以创建中文数据库,但是最好不要这样
不过可以设置字符集
set names gbk
那么,创建数据库后发生了什么?
1.在数据库系统中增加了对应的数据库信息
2.会在保存数据的文件下:Data 目录,创建一个对应的文件夹,文件夹名字同数据库的名字
(myisam 存储引擎:3.每个数据库下都有一个 opt 文件,保存该数据库的库选项)
2.1.2 查看数据库
查看所有数据库
show databases; #
模糊查询
show databases like 'pattern'; #
_ 单个字符
% 多个字符
\ 转义
查看数据库创建语句
show create database name;
2.1.3 更新数据库
数据库名字不可以修改
数据库修改仅限库选项:字符集和校对集(校对集依赖字符集)
alter database name charset [库选项];
charset/character set [=] 字符集
collate 校对集
2.1.4 删除数据库
drop database database_name;
当删除数据库后,发生了什么?
(1) 数据库内部看不到对应的数据库
(2)在对应的数据库存储的文件夹内:数据库名字对应的文件也被删除(级联删除,数据表和数据都不见了)
删除数据库最好先备份再删除
2.2 表操作
表与字段是密不可分的
2.2.1 选择数据库
数据表是依赖于数据库的,数据库管理数据表,对数据表的任何操作度必须指定表所属的数据库
(1)隐式指定数据库(在每次连接后指定一次即可)
use database_name;
(2) 显示指定数据库(后面讲)
其实就是在数据表的名字前显示指定数据库:database_name.table_name
2.2.2 新增表
2.2.2.1 表
create table [if not exists] table_name(
field_name1 field_type field_properties,
field_name2 field_type field_properties,
field_name3 field_type field_properties
)[表选项];
(关于字段类型 field_type 和字段属性 field_properties,请查看2.6 及 2.7)
if not exists:字面意思
表选项:控制表的表现
字符集:charset/character set 具体字符集 -- 保证表中数据的字符存储
校对集:collate
存储引擎:以后再说,很重要,现在通用且默认 innodb 存储引擎
显式指定数据库:
create table database_name.table_name()[表选项];
创建数据表的 SQL 指令执行后,发生了什么?
(1)指定数据库下已经存在对应的表
(2)在 data 目录下对应数据库文件夹下创建对应的文件:table_name.ibd
2.2.2.2 字段 field
field_name field_type field_properties extra
2.2.3 查看表
查看所有的表
show tables;
查看部分表
show tables like 'pattern';
查看表创建语句
show create table table_name[\g][\G]
查看表字段
desc table_name;
describe table_name;
show columns from table_name
其它所支持的 show 语句还有:
show status; # 用于显示广泛的服务器状态信息
show grants; # 用来显示授予用户的安全权限
show errors/show warnings; # 用来显示服务器错误或警告信息
2.2.4 修改数据表
表包括其本身和字段
2.2.4.1 修改表本身
(1) 修改表名字
rename table old_table_name to new _table_name;
(2) 表选项:字符集 校对集 存储引擎
alter table table_name 表选项 = 值
eg:alter table table_name charset = utf8;
alter table table_name engine = myisam;
2.2.4.2 修改表字段
字段的修改:新增,修改,重名,删除
修改表,字段增加:
alter table table_name add [column] field_name data_type field_properties position;
position:位置
first
after field_name:在某个字段后面
[]:默认最后一个字段后
修改表,修改字段:
alter table table_name modify field_name data_type field_properteis posititon;
修改表,字段重命名:
alter table table_name change old_field_name new_field_name data_type;
修改表,字段删除:
alter table table_name drop field_name;
如果表中已经有数据,那么字段删除,该字段对应的所有数据都会删除
2.2.4.3删除表
drop table table_name;
当删除表的指令后发生了什么?
(1)在表空间中,没有了指定的表,也没有数据了
(2)对应数据库的文件夹下该数据表文件也没有了
2.3 数据操作
2.3.1 新增数据
基本语法
(1)给全表字段插入数据,不需要指定字段列表,但是数据值的顺序必须与设计字段的顺序一致。凡是非数值数据,都需要使用引号
insert into table_name values()[,values()];
(2) 指定字段列表
insert into table_name (fields) values ()[,()];
进阶
1.在数据插入时,假设主键对应的值已经存在,那么插入一定会失败。
即主键冲突
主键冲突:更新操作
insert into table_name (fields:include primary) values ()
on duplicate key update
field = field_value;
主键冲突:替换
replace into table_name (fields) values ()[,()];
2.蠕虫复制
从已有的数据中获取数据,然后将数据又进行新增数据:数据成倍增加
表结构的复制
create table table_name like origin_table_name;
先查出数据,然后将查处的数据新增
insert into table_name (fields)
select */fields from origin_table_name;
蠕虫复制意义:
1.从已有表拷贝数据到新表中
2.可以迅速的让表中的数据膨胀到一定的数量级:测试表的压力以及效率
2.3.2 查看数据
这是一个复杂的问题,但是很重要
基本:
select */fields from table_name where condition;
2.3.2.1完整:
select [select 选项] */fields [字段别名] from 数据源
where condition
group by
having
order by
limit
(1) select 选项(对所有字段):
all: 默认,保留所有结果
distinct:去除结果中的重复值
(2) 字段别名
eg: select
id [as] 学号,
name [as] 姓名,
gender [as] 性别,
from student;
(3) 数据源:
数据的来源,关系型数据库的来源都是数据表,本质上只要保证数据类似二维表,最终都可以作为数据源
数据源种类:单表数据源,多表数据源,查询语句的结果
单表数据源:
select * from table_name;
多表数据源:
select * from table_name ……;
子查询:数据的来源是一条查询语句
错误实例:
select * from (select * from table_name);
(4) where
用来判断筛选数据
返回结果:0 false 1 true
判断条件:
比较运算符:> < >= <= != <> =,like,between,in
逻辑运算符:&& || !
and or not
通配操作符: like(搜索区分大小写)
%
_
正则表达式:mysql 中正则表达式不区分大小写,若要区分,使用 binary
regexp
where 原理:
where 是唯一一个直接从磁盘获取数据时就开始判断条件
(5) group by fields [asc/desc]
根据某个字段分组统计
统计函数:
count/max/min/avg/sum
count:不能统计 null
多字段分组:
对分组结构中的某个字段进行字符串连接
group_concat
回溯统计
with rollup
(6) having
进行条件判断
(7) order by fields [asc/desc]
排序,根据某个字段进行升序或降序
(8) limit
限制数量
从行0开始
方案1:只用来限制长度,数据量
方案2:限制起始位置和结束位置,主要用来实现分页,为用户节省时间,提交服务器响应效率,减少时间的浪费
2.3.3 修改数据
在实际使用中,是不应该直接修改数据的!!!
update table_name set field = value [where condition]; -- 一般都有 where 条件
修改不一定会成功,因为有可能没有修改的数据
进阶:
update table_name set field = field_value [where condition][limit num];
2.3.4 删除数据
delete from table_name [where condition] limit[num];
数据的删除是不会改变表结构的,因此自增长是不会改变的
清空表,重置自增长
truncate table_name;
2.4 中文数据问题
中文数据问题本质上是字符数据集的问题
所有的数据库服务器表现的一些特性都是通过服务器端的变量来保存:系统先读取自己的变量,看看应该怎么表现
//查看服务器到底吃瘪那些字符集
show character set;
服务器和字符集有关的变量
show variables like 'character_set%';
修改变量:会话级别
set variable_name = value;
set names gbk;--->character_set_client character_set_results character_set_connection(字符集转变的中间者,如果统一了效率更高,不统一也没问题)
2.5 校对集
校对集即比较字符的规则
_bin:binary 二进制,从左往右一位一位比较
_cs:case sensitive 大小写敏感
_ci:case imsensitive 大小写不敏感
查看数据库所支持的校对集:show collation;
2.6 字段类型
字段类型大致可分为:数值型 字符串型 日期时间型
2.6.1 数值型
2.6.1.1 整数型
field_type(display_length) [unsigned]
tinyint:1B -128/0 ~ 127/255
smallint:2B
mediumint:3B
int:4B
bigint:8B
display_length:显示宽度,不能改变数据实际大小,当数据不够显示宽度时,会自动让数据变成对应的显示宽度,通常需要搭配一个前导显示宽度,不改变值大小,zerofill(零填充),若加入零填充,则自动改变为无符号类型
若是需要无符号类型,则:
field_type unsigned
2.6.1.2 小数型
(1)浮点型:精度有限,而且会丢失精度
float:单精度,4B,精度范围大概为7位,3.4028^38
float(m,d):m代表总长度,d 代表小数长度
double:双精度,8B,精度范围大概15位,1,7026^308
注意:
浮点型数据的插入,整数部分不能超出长度;小数部分可以超出长度,小数部分会四舍五入到指定长度
浮点数一定会进行四舍五入(超出精度范围):浮点数如果因为系统进位导致超出指定的长度,那么系统也允许成立
(2)定点型:精度固定,不会丢失精度
定点型:绝对的保证整数部分不会四舍五入,也就是不会丢失精度;小数部分理论上也不会丢失精度
decimal(m,d):m,d同上
插入时,整数部分不能超出长度(包括用户插入和系统进位),小数部分可以超出长度,但是会四舍五入到指定长度
2.6.2 日期时间类型
(1)datetime:日期时间,8B,格式:YYYY-mm-dd HH:MM:ss,表示范围从1000到9999年,有 0 值,0000-00-00 00:00:00
(2)date:日期,3B,就是 datetime 中 date 部分
(3)time:时间,3B,指定的某个区间之间,正负都可以
(4)year:年份,1B,两种形式,year(2)和year(4):1901-2156
(5) timestamp:;类似于时间戳,4B,从1970年开始的格式与 datetime 完全相同。不能为空,有默认值,所在记录被更新则自动更新
2.6.3 字符串类型
2.6.3.1 定长字符串
char:在定义结构的时候,就已经确定了最终数据的存储长度
char(length):
length 可以存储的长度,单位为字符,最大长度可以为255
2.6.3.2 变长字符串
varchar:再分配空间的时候,按照最大空间分配,但实际上最终用了多少,是根据具体的数据来确定
varchar(length):
length 表示字符长度,理论长度是65536个字符,实际上会多出1到2个字节来确定实际长度
varchar(10):utf8,存储10个汉字,那么实际空间分配10*3+1=31个字节
定长磁盘空间比较浪费,但是效率高,如果数据基本上确定长度,就使用定长。如身份证,电话号码,手机号码
变长磁盘空间比较节省,但是效率低,如果数据不能确定长度。如姓名、地址。
2.6.3.3 文本字符串
如果数据量非常大,通常说超过255个字符就会使用文本字符串
文本字符串根据存储的数据格式进行分类:text blob
text:存储文字,二进制数据实际上都市存储路径
blob:存储二进制数据(通常不用)
text/blob 10B
2.6.3.4 枚举字符串
enum 选项量最大65535,类似于单选
eg:enum('male','female','unknown')
枚举作用:
限定数据
节省存储空间:枚举实际上存储的是数值
枚举原理:枚举在进行数据规范的时候,系统会自动建立一个数字与枚举元素的对应关系(关系放到日志中),然后在进行数据插入的时候,系统将字符转换成对应的数字存储,然后再进行数据提取的时候,系统自动将数制转换成对应的字符串显示
2.6.3.5 集合字符串
set 集合和枚举很相似,但是类似于多选
set 中每一个元素都代表一个二进制位
2.6.4 Mysql 记录长度
mysql 中规定:任何一条记录最长不能超过 65535 个字节
若有字段为空,则空属性最多占用1B
text 文本字符串不占用记录长度:额外存储。但是 text 也是记录的一部分,故需要10个字节来保存位置和长度
text:10B
2.7 字段属性
2.7.1 空属性 null/not null
由于 Mysql 默认 null,实际上应该要保证所有的数据都不应该为空,空数据没有意义
2.7.2 列描述 comment
专门用来描述字段,会根据创建语句保存
2.7.3 默认值 default
2.7.4 主键 primary key
一张表最多只有一个主键,主键对应的字段不能为空,不能重复
(1)增加主键
第一种:创建表时直接在字段后面添加主键属性
create table primary_key(
id int(10) primary key,
name varchar(30) not null
)charset utf8;
第二种:创建表时,在所有字段后,使用 primary key 属性
create table primary_key_second(
no int(10) not null,
name varchar(30) not null,
age tinyint(3) zerofill not null,
primary key (no,name)
)charset utf8;
一个表不可能有两个主键,故这张表有一个复合主键(no,name)
第三种:创建表后,额外追加主键,可以通过修改表字段,也可以直接追加
alter table a add primary key(field_names);
eg:
create table a(
aa int(11) not null,
bb int(10) not null
)charset utf8;
alter table a add primary key (aa,bb);
若表中已有数据,且想要添加主键约束的字段数据已经重复的话,那么不能添加主键约束
(2)查询主键
例如查询没有主键的表是可以的,但是要熟悉 mysql 架构,以后再谈。
(3)修改主键
主键不能修改,只能删除原先主键后,在新增主键
(4)删除主键
alter table table_name drop primary key;
2.7.5 唯一键 unigue key
可以解决表重有多个字段需要唯一性约束
唯一键与主键差不多,但是允许自动为空,且可以是多个
(1)增加唯一键
(2)查询唯一键
可以用创建表结构语句来查看
(3)修改/删除唯一键
alter table table_name drop index field;
2.7.6 自增长 auto increment
当对应的字段自己可以自动赋予某个值时,就可以使用自增长
特性:
自增长通常跟主键搭配
自增长字段必须是索引
自增长字段必须为整数
一张表最多只能有一个自增长字段
当插入记录时,自增长字段被赋予默认,忽略或null 时则触发自增长 ;如果自增长字段被赋予了值后,下一次自增长会从最大值后继续自增加
自增长涉及到字段改变,必须先删除自增长,然后再增加
关于自增长的变量
show variables like 'auto_increment%';
两个变量
auto_increment_increment 1
auto_increment_offset 1
2.7.7 外键 foreign key
外键在一张表中可以有多个
增加外键
foreign key (field) references foreign_table_name(field);
alter table table_name add [constraint custom_foreign_name] foreign key (field) references foreign_table_name (field);
修改/删除外键
不能够修改外键
alter table table_name drop foreign key custom_foreign_name
查看外键
查看表创建语句
外键作用
子表:约束子表数据增加和修改操作。如果对子表进行写入行时,如果对应外键的值在父表中找不到,那么写入操作失败
父表:父表外键进行删除和修改操作时,如果外键对应数据已经被子表所引用,那么不能操作
外键条件
1.外键要存在,必须保证表存储引擎是 innodb,若不是 innodb,可以创建,但是没有约束效果
2.外键字段的字段类型必须与父表的主键类型完全一致
3.一张表中的外键名字不能重复
4.增加外键的字段(数据已经存在),必须保证数据与外表主键要求对应
外键约束:
即外键作用
我们可以自己定制对外键的约束
约束模式:
district:严格模式,父表不能删除或者更新
cascade:级联模式,父表操作,对应子表关联的数据也跟着操作
set null:置空模式,父表操作后,对应子表外键置空
foreign key (field) references foreign_table_name (field) on delete set null on update cascade;
2.8 索引
系统根据某种算法,将已有的数据(未来坑内新增的数据),单独创建一个文件:文件能够实现快速的匹配数据,并且能够快速地找到对应表中的记录
意义
提升查询数据的效率
约束数据的有效性
增加索引的劣势:索引本身会产生索引文件,会非常耗费磁盘空间
如果某个字段需要作为查询的条件经常使用或数据有效性约束,可以使用索引
Mysql 中提供了多种索引:
主键索引:primary key
唯一键索引:unique key
全文索引:fulltext index
普通索引:index
2.9 连接查询
将多张表进行记录的连接
最终结果:记录数有可能变化,字段数一定会增加
连接查询的意义:在用户查看数据的时候,需要显示的数据来自多张表
连接查询:join
使用方式:左表 join 右表
2.9.1 交叉连接
cross join,也可以叫做笛卡儿积
2.9.2 内连接
左表 [inner] join 右表 [on condition]
可以使用 where 代替 on
2.9.3 外连接
以某张表为主,去除里面所有的记录,然后与另一张表进行连接,不管能不能匹配上条件,最终都会保留。能匹配:正确保留,不能匹配:置空
外连接:以某张表为主
left join on
right join on
2.9.4 自然连接
natural join,自动匹配连接条件(同名字段)
内链接或外连接也可以模拟自然连接
left join using (field)
2.10 联合查询
将多次查询,在记录上进行拼接
基本语法
将多条 select 语句构成:每一条 select 语句获取的字段书必须严格一致(但是字段类型无关)
select statement
union [union 选项]
select statement
union 选项:
all
distinct:默认
意义:
1.查询同一张表,需求不同
2.多表查询:多张表结构完全一样,数据结构也一样,也就是分表查询
注意:在联合查询中,使用 order by 必须使用();并且,若要有效使用,则要搭配 limit
2.11 子查询
在某一个查询结果之上进行的
按位置分类:
from 子查询
where 子查询
exists 子查询
按结果分类:根据子查询得到的数据结果进行分类
标量子查询:一行一列
列子查询:一列多行
行子查询,一般 一行多列(也可以多行多列)
表子查询:多行多列,出现位置是在 from 之后
all,any,some
select *
from student
having
age =
(select max(age) from student group by age)
and
height =
(select max(height) from student
group by height)
3.mysql 高级知识(对于开发人员来说)
3.1 视图 view
是一种有结构没结果的虚拟表
有结构:有行有列
没结构:不存放真实数据
虚拟表的结构来源是基表
3.1.2 视图结构的操作
3.1.2.1 创建视图
create view view_name as select statement;
如果创建多表视图的话,有可能导致字段名字重复,因此对重复字段取别名
3.1.2.2 查看视图
查看视图结构:和表一样
eg:
show create view view_name;
3.1.2.3 使用视图
视图执行:本质封装 select 语句
3.1.2.4 修改视图
视图本身不可修改,但是视图来源是可以修改的
alter view view_name as new_select_statement
3.1.2.5 删除视图
drop view view_name;
3.1.3 视图数据的操作
可以操作,但是有很多限制
3.1.3.1 数据新增
(1)多表视图不能新增数据
(2)单表视图插入的字段必须有基表中所有不能为空的字段,或者没有默认值的字段
3.1.3.2 数据删除
(1)多表视图不能删除数据
(2)单表视图能够删除数据
3.1.3.3 更新数据
无论单表还是多表,都可以更新数据
with check option,如果对视图在新增的时候,限定了某个字段,那么在对视图进行数据更新的时候,系统会进行验证
3.1.4 视图算法
系统对视图以及外部查询视图的 select 语句的一种解析方式
分类:
undefined:未定义,默认,这不是一种实际使用算法,而是告诉系统自己办
temptable:临时表算法,系统限制性使徒的 select 语句,后执行外部查询语句
merge:合并算法,系统先将试图对应的 select 语句与外部查询视图的 select 语句进行合并,然后执行,效率高
算法指定:
create create algorithm = algorith_name view view_name as selct statement;
算法选择:如果视图的 select 语句中会包含一个查询子句,而且很有可能顺序比外部的查询语句要靠后,一定要使用算法 temptable,其它请款可以不用指定
3.1.5 视图意义
1.简化复杂查询,节省SQL语句:将一条复杂的查询语句使用试图进行保存,以后可以对视图进行操作
2.数据安全,提供额外的安全层:视图操作主要针对查询的,如果对视图结果进行处理,不会影响基表数据(相对安全)
3.有助于限制对特定用户的数据访问,视图往往是大项目中使用,而且是多系统使用:可以对外提供有用的数据,但是隐藏关键数据,数据安全
4.视图可以提供计算列
5.向后兼容
缺点:
1.性能:从数据库视图查询数据可能会很慢,特别是如果视图是基于其他视图创建的。
2.表依赖关系:将根据数据库的基础表创建一个视图。每当更改与其相关联的表的结构时,都必须更改视图。
3.2 事务安全
事务:一系列要发生的连续操作
事务安全:一种保护连续操作同时满足实现的一种机制
事务安全的意义:保证数据操作的完整性
3.2.1 事务操作
3.2.1.1 自动事务,默认
在 mysql 中:默认都是自动事务控制
系统通过autocommit变量控制
show variables like 'autocommit';
关闭自动提交:set autocommit = 0;
通常都会使用自动事务
3.2.1.2 手动事务
(1) 开启事务
告诉系统以下所有的操作的不要立即执行,而是先放到事务日志中
(2)进行事务操作
(3)关闭事务:选择性的将日志文件中的操作结果保存到数据库中或者直接清空事务日志(原来操作全部清空)
a) 提交事务 commit:同步数据库,操作成功
b) 回滚事务 rollback:清空事务日志
3.2.2 事务原理
事务开启之后,所有的操作都会临时保存到事务日志中,事务日志只有在得到 commit 命令才会同步到数据表,其他任何请款都会清空(rollback 断开 连接)
3.2.3 回滚点
在某个成功的操作完成之后,后续的操作有可能成功有可能失败,前面操作成功,可以在当前成功的位置,设置回滚点
设置回滚点: savepoint point_name;
回到混滚点:rollback point_name;
3.2.4 事务特性
ACID
A:atomic 原子性,事物的整个操作是一个整体,不可分割,要么全部成功,要么全部失败
C:consitency,一致性,事务操作前后,数据表中的数据没有变化
I:isolation,隔离性,事务操作是相互隔离不受影响的
D:durability,持久性,数据一旦提交,不可改变,永久的改变数据
锁机制:innodb 默认是行锁,但是如果在事务操作的过程中,没有使用到索引,那么就会上升到表锁,全表检索
3.3 变量
3.3.1 系统变量
系统变量控制服务器的表现的
1)查看系统变量
show variables [like 'pattern'];
2)查看系统变量值
select @@variable_anem;
select @@version,@@autocommit;
3)修改系统变量
会话级别(临时):
set variable = variable_value;
set @@variable = value;
全局级别:永久生效,对所有客户端
set global variable = value;
已连接的客户端对于档次修改是无效的,必须重新连接才可以生效
3.3.2 自定义变量
所有自定义变量都是会话级别,当前客户端单次连接有效。所有自定义变量不区分数据库(用户级别)
1)创建系统变量
set @variable := value;
方案一:边赋值边看结果
set @variable := field from datasource;
方案二:
select field... from datasource into variables;
2) 查看变量
select @variable
3.4 触发器 trigger
时限为某种那个表绑定号一段代码,当表中的某些内容发生改变的时候(增删改),系统自动触发代码,执行
触发器:事件类型 触发时间 触发对象
事件类型:增删改
触发时间:before after
触发对象:表重每一条记录
一张表中只能拥有一种出发时间的一种类型的触发器,一张表最多能有6个触发器
3.4.1 创建触发器
在 mysql 中:没有大括号,度使用对应的字符表示
触发器基本语法:
delimiter custom_token;
create trigger trigger_name trigger_time trigger_type on table_name for each row
begin --代表左大括号,开始
里面就是触发器的内容:每行内容必须使用语句结束符
end -- 代表右大括号,结束
custom_token
delimeter ;
eg:
delimiter /
create trigger after_order after insert on `order` for each row
begin
update goods set inv = inv - 10 where new.goods_id;
end
/
delimiter ;
3.4.2 查看触发器
show triggers [like 'pattern'];
show create trigger trigger_name;
information.triggers 触发器保存的表
3.4.3 修改/删除触发器
触发器不能修改
drop trigger trigger_name;
3.4.4 触发器记录
触发器记录:不管触发器是否触发了,只要当某种操作准备执行,系统就会将当前要操作的记录的状态保存到 old 中,操作之后的可能状态保存给 new
3.4.5 SQL 代码执行结构
3.4.5.1 if
if then
else
end if
3.4.5.2 while
while condition do
statement
end while;
iterate 类似 continue
leave 类似 break
loop_name while condition do
leave/iterate loop_name;
end whiel;