MySQL[尚硅谷] Summary for videos
MySQL[尚硅谷] Summary for videos
一、前置知识
- DB:数据库
- DBMS:数据库管理系统
- SQL:结构化查询语言
- 将数据放到表中,再将表放到库中,表由列组成,也称为字段,一个数据库有多个表。
- 通过修改配置文件my.ini来修改默认设置。
net start/stop mysql08(服务名)
windows下开启数据库服务。- 连接数据库方法:①通过SQL自带客户端,仅限root。②windows客户端
mysql -h主机名 -P端口号 -u用户名 -p密码
本机可省略-h -P
。退出exit
或ctrl c
。 - 每条命令用分号结尾,不区分大小写,建议关键字大写。
- DQL语言 查询
- DML语言 增删改
- DDL语言 定义
- TCL语言 控制
二、基础知识
show databases;
use test;
show tables;
show tables from a; #展示a库中的所有表
desc + 表名; #展示表的结构
select version();
windows下:mysql --version / mysql --V
# 注释
--空格 注释
/* 注释 */
show engines;
查看MySQL支持的存储引擎。- MySQL中+只能做运算符,转换失败则值为0,只要其中一方为null,结果则为null。
- MySQL索引从1开始。
IFNULL(表达式,x)
:如果表达式为null,值则为x。where
后面不支持别名。- 字符型和日期型的常量值必须用单引号引起来,数值型不需要。
isnull(x)
:是null则为1,不是null则为0。- 为表起别名之后只能用表的别名,不能用表名。
- MySQL不支持全外连接。
三、DQL语言
1. 基础查询
select 查询列表 from 表名;
- 查询列表:表中的字段、常量值、表达式、函数,查询的结果是个虚拟的表格。
- 别名建议加双引号,单引号也可以。
- 去重:
select distinct 查询列表 from 表名;
,distinct只能加一个字段名。
2. 条件查询
where
后面添加筛选条件。- 条件查询支持按条件表达式筛选(
< > = != <> <= >=
)、逻辑表达式筛选(&& || !
)、模糊查询(like / between and / in / is null / is not null
)。 %
通配符:任意多个字符,包含0个字符。_
通配符:任意单个字符。\_
:代表_
。- 指定转义:
where last_name like '_$_%' ESCAPE '$';
。 betwee and
的值包含临界值,临界值不能颠倒顺序。in
列表内的值必须统一,且不支持通配符,in ('a','c');
。<>
:不等于<=>
:安全等于,支持null,=
不支持null,需要用is null
。
3. 排序查询
select from where order by 排序列表(多个字段、单个字段、表达式、函数、别名) acs / desc 不加则默认升序;
- 一般放在最后面,
limit
除外。 by a ASC, b DESC
a升序,若a相同,则b降序。
4. 函数查询
select 函数名(实参列表) from 表
- 函数查询分为两类:单行查询与分组查询。
4.1 单行函数
4.1.1 字符函数
length()
:汉字为三个字节(utf8),length返回字节个数。contact(A,B)
:拼接 。upper()
lower()
substr/substring(' ', 7)
:从7开始后的所有字符。substr/substring(' ', 7, 3)
:从7开始的后3位字符。instr(' ', ' ')
:后面的字符串在前面的字符串中第一次出现的索引,如果未出现则为0。trim()
:去掉前后的空格。trim('a' from ' ')
:把前后的a去掉。lpad(' ', 10, '*')
:指定长度左填充,如果原字符串长度大于10,则右截断。rpad(' ', 10, '*')
:指定长度右填充,如果原字符串长度大于10,则右截断。replace(' ', 'x', 'y')
:所有的x会被替换成y。
4.1.2 数学函数
round()
:四舍五入。round(x, y)
:保留小数点后y位。ceil()
:向上取整。floor()
:向下取整。truncate()
:截断。truncate(x, y)
:保留小数点后y位。rand()
:随机产生0到1之间的小数,不会到1。mod(10, 3)
:返回10%3,与select 10%3
等效。
4.1.3 日期函数
now()
:日期+时间。curdate()
:日期。curtime()
:时间。year(now())
:年。month()
monthname()
:返回月的英文单词。day()
hour()
minute()
second()
str_to_date('9-13-2010', '%m-%d-%Y')
:将字符串转换为日期。date_format(now(), '%y年%m月%d日')
:将日期转换为字符串。
符号 | 代表 |
---|---|
%Y | 4位年 |
%y | 2位年 |
%m | 01、02月 |
%c | 1、2月 |
%d | 01、02日 |
%H | 24制小时 |
%h | 12制小时 |
%i | 00、01分钟 |
%s | 00、01秒 |
4.1.4 其他函数
version()
user()
database()
datadiff(' ', ' ')
:相差多少天。md5
:MD5形式加密。password
:返回加密形式。
4.1.5 流程控制函数
if(x, y, z)
:如果x成立,y,否则z。case
:两种形式。
1 | case 要判断的字段或者表达式 |
1 | case |
4.2 分组函数(别名:统计函数、聚合函数)
sum
、avg
、max
、min
、count
。sum、avg
:数值、忽略null、sum(distinct a)
去重、count(distinct a)
去重。max、min
:字符、数值、日期、忽略null。count
:非空个数。select count(*) from
:统计行数。select count(1) from
:统计行数,相当于加了一列1。
在MYISAM
存储引擎下,*
效率高。
在INNODB
存储引擎下,两种方法效率差不多,都比count 字段
高。- 使用分组函数一同查询的字段要求是group by后的字段。
5. 分组查询
1 | select 分组函数,列(与group by 后的列相同) |
- 分组函数做条件一定是分组后筛选。
- 能用分组前筛选尽量用分组前筛选,提高效率。
- 可以在
group by
后面添加多个字段,多个字段没有先后顺序,即按照多个字段分组。
6. 连接查询(多表查询)
select name, boyName from beauty, boys;
,显示的是笛卡尔乘积现象(表1有m行,表2有n行,则显示的即是n*m行)。- 按年代分为两种:①SQL92:在MySQL中仅仅支持内连接。②SQL99(推荐)。
- MySQL不支持全外连接。
- 按功能分分类:
①内连接(两表交集):等值连接、非等值连接、自连接(自己与自己连接)。
②外连接(一个表中有一个表中没有):左外连接、右外连接、全外连接。
③交叉连接(笛卡尔乘积)。 - SQL92仅支持内连接(MySQL中):
where 连接条件 and 筛选条件
,自连接:为表起多个别名来连接。如果为表起了别名,则查询的字段不能使用原来的表名去限定,必须使用别名。from
后面两个表的顺序可以交换。 - SQL99支持外连接与内连接与交叉连接。连接类型为内连
inner
、左外left (outer)
、右外right (outer)
、全外full (outer)
、交叉cross
,如果省略默认为内连接。如下:
1 | select 表1 别名 连接类型 |
- 外连接:一般来查询一个表中有,另一个表中没有的数据。查询结果为主表中所有的数据,如果从表中有对应的匹配,则为值;反之则为null。
- 在左外连接中,
left
左侧是主表;在右外连接中,right
右侧是主表。左外连接和右外连接中可以通过交换语句中表的顺序来转换,达到的效果相同。 - 筛选另一表中不存在的行时,最好选择筛选从表的主键。
- 全外连接结果为:主表从表都存在(交集),主表有从表没有则用null填充,主表没有从表有则用null填充。如果想去掉交集,则可以在
where
后增加主表或者从表主键为null的条件。 - SQL99中的交叉连接与SQL92中的笛卡尔乘积效果等效。
- 建议使用SQL99语法。
7. 子查询/内查询
- 外部的语句称为外查询/主查询,其他语句内部的语句称为内查询/子查询,子查询放在小括号内,子查询的执行优先于子查询的执行。
- 子查询可以放在
select
、from
、where/having
、exists
后面。 - 子查询可以根据本身的查询结果生成的虚拟表分为:①标量子查询(一行一列) ②列子查询(一列多行) ③行子查询(一行多列) ④表子查询(多列多行)。
where/having
后面可以放标量子查询(搭配单行操作符:>
、<
等)、列子查询(搭配多行操作符:in
、not in
、any/some
、all
)、行子查询(如下)。
1 | SELECT * FROM employees |
select
后面可以放标量子查询。from
后面可以放任意类型的子查询,from
后面的表要起别名。exists
(相关子查询)后面可以放任意类型的子查询。exists
后面的东西存在则为1,否则为0。语法:seists(完整的查询语句)
。
8. 分页查询
- 分页查询场景:数据一页显示不全,需要分页提交SQL请求。语法:
limit offset,size
。offset
代表要显示条数的起始索引(索引从0开始),如果需要从0开始则offset
可省略。size
代表要显示的条目个数。
9. 联合查询
语句1 union 语句2
- 将多条查询结果合并成一个结果,要求两个语句生成的虚拟表列数必须一致,列的类型和顺序爷最好一致,结果为去重的,如果不想去重,则把
union
换成union all
即可。
四、DML语言
1. 插入
insert into 表名(列名) values(一一对应);
。insert into 表名 set 列名=值, 列名=值 ... ;
。- 第一种写法可以省略列名,那么默认为所有列名,且列名顺序和表名一致。
- 第一种写法支持插入多行,多行之间
values
括号后用逗号隔开,列名的顺序可以调换,对应的值也需要调换。 - 第一种写法支持子查询:
select into 表名(列名) select ...;
,第二种写法不支持。
2. 修改
update 表名 set 列名=值, 列名=值 ...; (where 筛选条件)
。- 修改多表SQL92写法如下。
1 | update 表1 别名, 表2 别名 |
- 修改多表SQL99写法如下。
1 | update 表1 别名 |
3. 删除
delete from 表名 where limit
删除整行。truncate table 表名
不加where
把表中所有数据删除。- 删除多表SQL92写法如下。
1 | delete 表1的别名, 表2的别名 |
- 删除多表SQL99写法如下。
1 | delete 表1的别名, 表2的别名 |
truncate
效率高一点。truncate
没有返回值,delete
有返回值。truncate
删除不能回滚,delete
可以回滚。- 如果删除的表中有自增长列,删除后再插入
truncate
从1
开始,delete
从断点处开始。
五、DDL语言
- DDL语言主要用于库和表的管理。
1. 库的管理
- 库的创建:
create database【if not exits】库名
。 - 库的修改:
rename database 库名 to 新库名
(以前可以用,现在此条语句被取消)、alter database 库名 character set gbk
。 - 库的删除:
drop database【if exists】库名
。
2. 表的管理
- 表的创建如下。
1 | create table 表名( |
表的修改:
- 修改列名:
alter table 表名 change【column】列名 新列名 新类型
。 - 修改列的类型、约束:
alter table 表名 modify column 列名 类型
。 - 添加新列:
alter table 表名 add column 列名 类型【first / after 字段名】
。 - 删除列:
alter table 表名 drop column 列名
。 - 修改表名:
alter table 表名 rename to 新表名
。
- 修改列名:
表的删除:
drop table【if exists】表名
,exists
不能加在删除列,可以在加在表的创建、表的删除、库的创建、库的删除。表的复制:
- 仅仅复制表的结构:
create table 表名 like 要复制的表
。 - 复制表的结构加所有数据:
create table 表名 select * from 要复制的表
。 - 复制表的结构和部分数据:
create table 表名 select 字段1, 字段2 from 要复制的表 where 筛选条件
。 - 仅仅复制表的某些字段:
create table 表名 select 字段1, 字段2 from 要复制的表 where 0
。
- 仅仅复制表的结构:
3. 常见的数据类型
3.1 数值型
- 数值型分为:整型、小数(浮点数、定点数)。
- 整型:
tinyint
(1个字节)、smallint
(2个字节)、mediumint
(3个字节)、int(integer)
(4个字节)、bigint
(8个字节),都分为有符号和无符号两种类型。 - 如果在字段的后面加上
unsigned
,则为无符号类型;否则则默认为有符号类型。 - 如果插入的值超出整数的范围,则为临界值。
- 不设置长度则会有一个默认的长度,长度代表宽度,如果数值的长度不够会在左侧填充0,但要搭配
zerofill
使用(只支持正数)。 - 浮点数:
float(M, D)
(4个字节)、double(M, D)
(8个字节)。 - 定点数:
decimal(M, D)
(M+2个字节),也可以缩写为dec(M, D)
。 M
代表小数部分和整数部分总共的位数,D
代表小数部分的位数,代表保留D
位,遵循四舍五入。如果插入的数据超过M
和D
的限制则插入临界值。(M, D)
可省略,如果为定点数则默认为(10, 0)
,如果为浮点数,则会根据插入的数值的精度来决定精度。- 定点数精确度比浮点数高。
- 根据数据选择的数值类型越小越好,精度越小越好。
3.2 字符型
- 字符型:较短的
char
、varchar
、binary
、varbinary
;较长的text
、blob
;枚举类型enum
;集合set
。 char(M)
、varchar(M)
:M
代表最大字符数。char
是固定字符数,varchar
的字符数可以根据插入的字符数自动变化,char
效率高,但varchar
节省空间。char
的M
可以省略,默认为1,varchar
的M
不能省略。binary
、varbinary
:保存较短的二进制。字段名 enum('a', 'b', 'c')
:一次只能插入一个,保存枚举的字符,不区分大小写,如果插入A
则存为a
。字段名 set('a', 'b', 'c')
:一次可以插入多个,valuese('a,b')
,保存集合,不区分大小写。
3.3 日期型
符号 | 保存字节数 | 含义 | 性质 |
---|---|---|---|
date | 4 | 日期 | |
datetime | 8 | 日期+时间 | 范围为1000到9999 |
timestamp | 4 | 时间戳 | 范围为1970到2038,受时区和版本影响,范围小 |
time | 3 | 时间 | |
year | 1 | 年 |
4. 常见约束
- 用于限制表中的数据,为了保证表的一致性。
- 六大约束:
①非空约束not null
:保证该字段非空。
②默认约束default
:使该字段具有默认值。
③主键约束primary key
:保证该字段具有唯一性,且非空,一个表中只能有一个主键约束。
④唯一键约束unique
:保证该字段具有唯一性,但可以为空,一个表中可以有多个唯一键约束。
⑤检查约束check
:MySQL中不支持,但不报语法错误。
⑥外键约束foreign key
:用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值,在从表添加外键约束,用于引用主表中某列的值,从表中的外键要和主表中关联列的类型要求一致/兼容,主表中的关联列必须是一个主键/唯一键,删除数据时应先删除从表,再删除主表。 - 添加约束的时机:
- 创建表时。
- 修改表时。
- 约束的添加分类:
- 列级约束:六大约束语法都支持,外键约束无效果。
- 表级约束:除了非空约束、默认约束以外其余都支持。
1 | create table 表名( |
主键和唯一键都可以组合(两个列组合成主键或唯一键):
primary key(id, stuname), unique(seat, seat2)
,但不推荐,主键不允许为空,唯一键允许。检查约束:
字段名 char(1) check(字段名='男' or 字段名=‘女‘)
。默认约束:
字段名 int default 18
。外键约束:
字段名 int foreign key references 主表名(字段)
。show index from 表名
:查看表中所有的索引(主键、外键、唯一建会自动生成索引)。表级约束:
1
2
3
4
5
6
7
8
9
10
11
12
13
14create table 表名(
字段 类型 列级约束,
字段 类型 列级约束,
字段 类型 列级约束,
【constraint 约束名】 约束类型(字段名)
constraint pk primary key(字段名),#主键名字永远为primary key,即是修改也不变
constraint uq unique(字段名),
constraint ck check(字段名='男' or 字段名='女'),
constraint 引用名 foreign key(字段名) references 主表(字段名)
// 或者不加引用名,如下。默认为字段名
foreign key(字段名) references 主表(字段名)
}修改表时添加约束:
①添加列级约束:alter table modify column 字段名 int primary key
。
②添加表级约束:alter table add primary key(字段名)
。修改表时删除约束:
①alter table drop primary key
、alter table drop index 索引名
、alter table drop foreign key 字段名
。
②alter table modify column 字段名 int【null】
。关于外键约束的删除:
- 传统方式添加外键:
alter table 表名 add constraint 引用名 foreign key(字段名) referencess 主表(字段名)
。 - 级联删除:
alter table 表名 add constraint 引用名 foreign key(字段名) referencess 主表(字段名) on delete cascade
。 - 级联置空:
alter table 表名 add constraint 引用名 foreign key(字段名) referencess 主表(字段名) on delete set null
。
- 传统方式添加外键:
5. 标识列(自增长列)
- 不用手动插入值,系统提供默认的序列值。标识列的类型只能是数值型,一个表中至多一个自增长列。
auto_increment
:放在约束后面,必须和key
(主键、唯一键)搭配。set auto_increment_increment=x
:设置步长。可以用插入的方式设置初始自增长起始值。- 可以在修改表时设置或删除标识列。
六、TCL语言
事务:一个或一组SQL语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。如果单元中的某条SQL语句执行失败或产生错误,整个单元将会回滚,所有受到影响的数据将返回到事务开始前的状态。
在MySQL中用的最多的存储引擎有:innodb、myisam、memory等。其中innodb支持事务,而myisam、memory等不支持事务。
事务的ACID属性:
- 原子性:不可分割,要么都发生,要么都不发生。
- 一致性:事务必须使数据库从一个一致性状态转换到另一个一致性状态。
- 隔离性:一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
- 持久性:一旦提交,它对数据库中数据的改变是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。
事务的创建:
- 隐式事务:事务没有明显的开始和结束的标记。比如insert、update、delete语句。
- 显式事务:事务具有明显的开启和结束的标记。
- 先设置自动提交功能为禁用
set autocommit = 0; 【start transaction】
,只针对当前事务有效。 - 编写事务中的SQL语句(select、insert、update、delete)。
- 结束事务:输入命令
commit;
提交事务或者rollback;
回滚事务。
- 先设置自动提交功能为禁用
对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采用必要的隔离机制,就会产生各种并发问题:
- 脏读:对于两个事务T1,T2,如果T1读取了已经被T2更新但还没有被提交的字段,之后若T2回滚,T1读取的内容就是临时且无效的。
- 不可重复读:对于两个事务T1,T2,若T1读取了一个字段,然后T2更新了该字段之后,T1再次读取同一个字段,值就不同了。
- 幻读:对于两个事务T1,T2,若T1读取了一个字段,然后T2在该表中插入了一些新的行,T1再次读取同一个表,就会多出几行。
数据库事务的隔离性:数据库系统必须具有隔离并发运行各个事务的能力,使他们不会相互影响,避免各种并发问题。
一个事务与其他事务隔离的程度称为隔离级别,数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱。数据库提供的四种隔离级别如下。
- Oracle支持的两种隔离级别:READ UNCOMMITTED、SERIALIZABLE。Oracle默认的事务隔离级别为READ COMMITTED。MySQL支持四种事务隔离级别,MySQL默认的事务隔离级别为REPEATABLE READ。
- 每启动一个MySQL程序,就会获得一个单独的数据库连接,每个数据库连接都有一个全局变量@@tx_isolation,表示当前的事务隔离级别。查看当前的隔离级别:
select @@tx_isolation;
,设置当前MySQL连接的隔离级别:set transaction isolation level read committed;
,设置数据库系统的全局的隔离级别:set global transaction isolation level read committed;
。 savepoint 节点名
,设置保存点,rollback to 节点名
,回滚到保存点。
七、视图
- 虚拟的表,和普通表一样使用,MySQL5.1版本出现的新特性,是通过表动态生成的数据,只保存了SQL逻辑,不保存查询结果,相对于表来说占用的空间更小,但是视图一般不能增删改。
- 优点:实现了SQL语句重用;简化了复杂的SQL操作,不必知道它的查询细节;保护数据,提高安全性。
1 | create view my_vl |
视图的修改:
- 方式一:
create or replace view 视图名 as
。 - 方式二:
alter view 视图名 as
。
- 方式一:
视图的删除:
drop view 视图名, 视图名...
。视图的查看:
desc 视图名
,或者show create view 视图名
。视图的更新(数据):
- 插入:
insert into 视图名 values(值, 值...)
。 - 修改:
update 视图名 set 字段名 = 值 where 筛选条件
。 - 删除:
delete from 视图名 where 筛选条件
。
- 插入:
以下类型的视图是不能更新的:
- 包含以下关键字的SQL语句:分组函数、distinct、group by、having、union、union all。
- 常量视图。
- 含join的查询。
- from一个不能更新的视图。
- where自居的子查询引用了from字句中的表。
八、变量
- 变量分为系统变量和自定义变量。系统变量分为全局变量和会话变量,自定义变量分为用户变量和局部变量。
- 系统变量:由系统提高,属于服务器层面,如果不加global或session指定全局变量或会话变量,则默认为session会话变量。
- 查看所有的系统变量:
show global/【session】 variables
。 - 查看满足条件的部分系统变量:
show global/【session】 variables like xxx
。 - 查看指定的某个系统变量的值:
select @@global/【session】.系统变量名
。 - 为某个系统变量赋值:
set global/【session】 系统变量名=值
。或者set @@global/【session】.系统变量名=值
。 - 全局变量作用域:服务器每次启动将为所有的全局变量赋初试值,针对所有的会话连接都有效,但是不能跨重启。如果想跨重启,则需要修改配置文件。
- 会话变量作用域:仅仅针对当前会话连接有效。
- 查看所有的系统变量:
- 自定义变量:声明、赋值、使用(查看运算比较等),可以放置在任何地方。
- 用户变量作用域:仅针对当前会话有效,用于会话变量的作用域。
- 声明并初始化:
set @用户变量名=值
,set @用户变量名:=值
,select @用户变量名:=值
。 - 赋值:
- 方法一:
set @用户变量名=值
,set @用户变量名:=值
,select @用户变量名:=值
,可以跨数据类型。 - 方法二:
select 字段 into 变量名 from 表
。
- 方法一:
- 查看:
select @用户变量名
。
- 局部变量:仅仅在定义它的begin和end中有效,且必须在begin和end中的第一句话。
- 声明:
declare 变量名 类型
,declare 变量名 类型 default 值
,值要与类型一致或兼容。 - 赋值:
- 方式一:
set 局部变量名=值
,set 局部变量名:=值
,select @局部变量名:=值
,可以跨数据类型。 - 方式二:
select 字段 into 变量名 from 表
。
- 方式一:
- 查看:
select 用户变量名
。
- 声明:
- 局部变量必须限定类型,自定义变量不需要限定类型。
九、存储过程和函数
- 存储过程:一组预先编译好的SQL语句的集合,理解成批处理语句。减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率。
- 创建语法:
create procedure 存储过程名(参数列表) begin 一组合法有效的SQL语句 end
。- 参数列表:参数模式、参数名、参数类型。
- 参数模式:IN(可以作为输入,作为输入值)、OUT(可以作为输出,作为返回值)、INOUT(既可以做输入又可以做输出)。
- 如果存储过程体仅有一句话,则begin和end可以省略。
- 存储过程体的每条SQL语句的结尾要求必须加分号,存储过程的结尾可以使用delimiter重新设置。语法为
delimiter 结束标记
。
- 调用语法:
call 存储过程名(实参列表)
。例如:call myp('x', @a)
,其中@a可以提前定义,也可以不定义直接作为实参传入存储过程,但是依旧存在@a变量。 - 存储过程的删除:
drop procedure 存储过程名
,一次只能删除一个。 - 查看存储过程的信息:
show create procedure 存储过程名
。 - 很少有存储过程的修改。
- 创建语法:
- 函数:有且仅有一个返回值。存储过程适合做批量的插入更新,而函数时候做数据处理后返回一个结果。
- 创建语法:
create function 函数名(参数列表) returns 返回类型
。- 参数列表:参数名、参数类型。
- 肯定会有return语句,如果没有会报错,一般建议放在函数体的最后。
- 如果函数体仅有一句话,则begin和end可以省略。
- 函数体的每条SQL语句的结尾要求必须加分号,函数的结尾可以使用delimiter重新设置。语法为
delimiter 结束标记
。
- 调用语法:
select 函数名(实参列表)
。 - 函数的删除:
drop function 函数名
,一次只能删除一个。 - 查看函数:
show create function 函数名
。 - 很少有函数的修改。
- 创建语法:
十、流程控制结构
1. 分支结构
- if函数:实现简单的双分支,
select if(表达式1, 表达式2, 表达式3)
,可以应用在任意地方。 - case结构:
- 类型一:实现等值判断。
- 类型二:实现区间判断。
- 可以作为表达式,嵌套在其他语句中使用,可以放在任何地方。
- 如果作为独立的语句使用,那么只能放在begin和end之间。
- 相当于有break语句。
1 | case 变量/表达式/字段 |
1 | case |
- if结构:实现多重分支。
if 条件1 then 语句1; elseif 条件2 then 语句2 else 语句n end if
,只能放在begin和end之间。
2. 循环结构
- 分类:while、loop、repeat。
- 循环控制:
iterate【标签】
结束本次循环继续下一次,leave【标签】
结束当前所在循环。 【标签:】while 循环条件 do 循环体; end while 【标签】
【标签:】loop 循环体; end loop 【标签】
,可以模拟死循环。【标签:】repeat 循环体; until 结束循环的条件 end repeat 【标签】