一、下载
https://downloads.mysql.com/archives/community/
二、安装
1.将下载的mysql的zip文件解压;
2.配置环境变量
3.在mysql文件夹下创建my.ini文件(注意替换路径位置)
[mysqld]
basedir=D:\mysql\mysql-8.0.22-winx64\
datadir=D:\mysql\mysql-8.0.22-winx64\data
port=3306
#skip-grant-tables
4.管理员身份打开cmd窗口,并进入安装mysql的bin文件夹
cd /d D:\mysql\mysql-8.0.22-winx64\bin
mysqld -install #安装mysql
mysqld --initialize-insecure --user=mysql #初始化数据文件
net start mysql #启动mysql服务
mysql -u root -p #登录mysql(初始账号root,无密码)
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; #修改密码为123456
exit #退出
net stop mysql #停止mysql服务
三、卸载
1.去mysql的安装目录找到my.ini
文件,找到datadir=F:\mysql\mysql-8.0.22-winx64\data
2.控制面板->程序->程序和功能->卸载或更改程序->卸载mysql
3.删除F:\目录下的mysql文件夹
四、SQL语句
1.概念
Structured Query Language
结构化查询语言
其实就是定义了操作所有关系型数据库的规则,每一种数据库操作的方式存在不一样的地方,称为’方言’。
2.SQL通用语法
-
SQL语句可以单行或多行书写,以分号结尾;
-
可使用空格和缩进来增强语句的可读性;
-
MySQL数据库的SQL语句不分大小写,关键字建议使用大写;
-
注释:
单行注释
-- 注释内容(必须有空格)
或者#注释内容(mysql特有)
多行注释
/*注释*/
3.SQL分类
五、常用SQL命令
#服务启动和停止
net start mysql #启动mysql服务
net stop mysql #停止mysql服务
#登录
mysql -uroot -p123456 #登录mysql
#系统查询命令
select now(); #查询当前时间
select version(); #查询mysql版本
select user(); #查询当前用户
show engines; #查看所有的存储引擎
set names 字符集名称; #修改字符集
##数据库相关操作
show databases; #查询所有的数据库名称
use 数据库名称; #使用某个数据库
show tables from 数据库名称; #查询其它数据库中的所有数据表
alter database 库名称 character set gbk; #修改库字符集
show tables; #查看的那个库的所有数据表
select database(); #查看当前使用的数据库
rename database 库名称 to 新库名称; #修改库名称,不够安全,已启用
drop database 库名称; #删除数据库
#数据表相关操作
desc 表名; #查看表结构
alter table 表名 rename 新表明; #修改表名
alter table 表名 add column 列名 列描述; #添加列
alter table 表名 change column 原列名 新列名 列类型; #修改列名
alter table 表名 drop column 列名; #删除列
alter table 表名 modify 列名 列类型; #修改列类型
alter table 表名 change 原列名 新列名 列类型;
drop table 表名; #删除表
create table 表1名称 like 表2名称; #复制表2的表结构并创建表1
create table 表1名称 select * from 表2名称; #复制表我所有数据到表1
create table 表1名称 select 部分列 from 表2名称 where 条件; #复制表2的部分列部分数据到表1
show index from 表名 #显示索引
DISTINCT
去除重复元素
条件运算符:< > = !=(或者<>) 不等于 >= <=)
逻辑运算符:and or not 或者 && || !
模糊查询:like between and in is null
通配符:% 任意多个字符,包含0个字符 _ 任意单个字符
转义:escape '$' 指定$为转义符
安全等于:<=>
可以判断null值
IFNULL(列名,默认值)
如果列名为空,则列名为默认值
六、常见函数
1.单行函数
1.1 字符函数
length 获取参数值的字节个数(不同的字符集返回值不同)
length('')
concat 拼接字符串
concat('','','',...)
upper、lower 大小写转换
upper('') lower('')
substr、substring 截取字符
substr('',startIndex) #从startIndex开始截取
substr('',startIndex,length) #截取从startIndex开始,长度为length的字符串
注意:数据库中的索引是从1开始的
instr 返回指定字符串在原字符串中出现的索引,如果找不到返回0
instr('','')
trim 去除前后空格
trim('') #去除前后空格
trim('' from '') #去除第二个参数中前后所有的第一个参数的字符串
lpad、rpad 用指定的字符实现左、右填充指定的长度
lpad('',length,'') rpad('',length,'')
replace 替换
replace)('str','from_str','to_str')
1.2 数学函数
round 四舍五入
round(1.65) #2
round(4.567,2) #小数点后保留两位 4.57
ceil 向上取整,返回>=改参数的最小整数
ceil(4.01) #5
ceil(-1.02) #-1
floor 向下取整
floor(9.99) #9
floor(-3.01) #-4
truncate 截断
truncate(1.999,1) #1.9
mod 取余
mod(10,3) #1
1.3 日期函数
now 查询当前系统日期+时间
now()
curdate 返回当前系统日期,不包含时间
curdate()
curtime 返回当前系统时间,不包含日期
curtime()
year,month,day 获取日期指定部分
year(now()) #年
month(now()) #月
monthname(now()) #月的英文名称
day(now()) #日
str_to_date 将日期格式的字符转换成指定格式的日期
str_to_date('9-13-1999','%m-%d-%Y') #1999-09-13
date_format 将日期转换成字符串
date_format('2018/6/6','%Y年%m月%d日') #2018年06月06日
1.4 其他函数
version 查看当前版本
database 查看当前数据库
user 查看当前用户
1.5 流程控制函数
if 实现if else的效果
select if(10>5,'大','小')
case
case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1 #如果是语句需要加分号
when 常量2 then 要显示的值2或语句2
...
else 要显示的值n或语句n
end
case #类似多重if
when 条件1 then 要显示的值1或语句1 #如果是语句需要加分号
when 条件1 then 要显示的值2或语句2
...
else 要显示的值n或语句n
end
2.分组函数
功能:用作统计使用,又称聚合函数或统计函数或组函数。
分类:sum求和、avg平均值、max最大值、min最小值、count计算个数
参数类型:
- sum、avg一般用于处理数值型,max、min、count可以处理任何类型;
- 以上分组函数都忽略null值;
- 可以和distinct搭配,实现去重的运算;
- count(*),count(1)统计多少行;
- 和分组函数一同查询的字段要求是group by后的字段;
- 分组函数做条件肯定是放在having子句中的,能用分组前筛选的,就优先考虑分组前筛选。
七、连接查询(又称多表查询)
1.分类
按年代分类:
- sql92标椎:仅仅支持内连接
- sql99标椎(推荐):支持内连接+外连接(左外和右外)+交叉连接
按功能分类:
-
内连接(inner)(交集)(inner可以省略)
等值连接
1.多表等值连接的结果为多表的交集部分
2.n表连接,至少需要n-1个连接条件
3.多表的顺序没有要求
4.一般需要为表起别名
5.可以搭配前面介绍的所有子句使用,比如排序、分组等
非等值连接
自连接
-
外连接
左外连接(left [outer])
右外连接(right [outer])
全外连接(full [outer])
-
交叉连接(cross join)
八、子查询
1.定义:
出现在其它语句中的select语句称为子查询或内查询。外部的查询语句称为主查询或外查询。
2.分类:
按子查询出现的位置:
相关子查询 select后面(仅仅支持标量子查询)、from后面(支持表子查询)、where或having后面(支持标量子查询、列子查询、行子查询)、exists后面(相关子查询)(结果只为1或0,表示是否存在)
按结果集的行列数不同:
标量子查询(结果集只有一行一列)
列子查询(结果集只有一列多行)
行子查询(结果集只有一行多列)
表字查询(结果及一般为多行多列)
多行比较操作符
操作符 | 含义 |
---|---|
IN / NOT IN | 等于列表中的任意一个 |
ANY | SOME | 和子查询返回的某一个值比较(大于最小的) |
ALL | 和子查询返回的所有值比较(大于最大的) |
九、分页查询
1.语法
limit offset,size; #offset要显示条目的起始索引(起始索引从0开始),size每页显示的数目
limit语句放在查询语句的最后
limit (page-1) * size,size
十、联合查询(union)
union:联合 合并:将多条查询语句的结果合并成一个结果
SELECT * FROM student WHERE id=1
UNION
SELECT * FROM student WHERE id=2
UNION
SELECT * FROM student WHERE id=3;
特点:
- 要求多条查询语句的查询列数是一致的;
- 要求多条查询语句的每一列的类型和顺序最好一致;
- union默认去重,使用union all可以包含重复项。
十一、插入语句
#方式一 支持插入多行,支持子查询
insert into 表名 (字段1、字段2、...) values (值1、值2、...)
#方式二 不支持插入多行
insert into 表名 set 字段1=值1,字段2=值2,...
#删除表
truncate table 表名; #清空表包括自增长列,不能加where条件
delete from 表名 where 条件; #truncate删除没有返回值,delete有返回值
☆☆ #truncate删除不能回滚,delete删除可以回滚
十二、数据类型
1.数值类型
1.1 整数类型
特点:
- 默认有符号(使用unsigned设置无符号)
- 插入的数值超出了整型的范围,回报out of range异常,并且插入临界值
- 如果不设置长度,会有默认的长度,,长度代表显示的最大宽度,如果不够会用0在左边填充,但必须搭配zerofill使用
1.2 小数类型
浮点型:
float(M,D)
double(M,D)
定点型:
decimal(M,D)
特点:
- M代表整数部位+小数部位,D代表小数部位
- M和D都可以省略,如果是decimal,则默认decimal(10,0),如果是float和double,则会根据插入的数值的精度来决定
- 定点型的精确度较高,如果要求插入数值的精度较高如货币运算等则考虑使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WFVDbu8y-1622101622943)(数值类型.png)]
2.字符串类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gdAPxEYU-1622101622945)(字符串类型.png)]
enum、set、binary、varbinary扩展
enum #枚举 如果插入的值不存在枚举列,则插入空字符串
create table test(
sex enum('男','女')
);
insert into test values('男');
set #和enum类似,可以保存0~64个成员,但set一次可以选取多个成员,而枚举只能选一个
create table season(
sex set('春','夏','秋','东')
);
insert into season values('春,夏');
#BINARY 保存较短的二进制
#BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
3.日期类型
datetime和timestamp比较
字节 | 范围(年) | 时区的影响 | |
---|---|---|---|
datetime | 8 | 1000-9999 | 无 |
timestamp | 4 | 1970-2038 | 有 |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e0zdLFJm-1622101622946)(日期时间类型.png)]
十三、常见约束
1.分类
1.1 not null
非空约束,用于保证该字段的值不能为空
修改表时添加:alter table 表名 modify column 列名 列类型 not null;
修改表时删除:alter table 表名 modify column 列名 列类型 null;
1.2 default
保证该字段有默认值
修改表时添加:alter table 表名 modify column 列名 列类型 default 默认值;
修改表时删除:alter table 表名 modify column 列名 列类型;
1.3 primary key
主键
用于保证该字段的值具有唯一性,并且非空
修改表时添加:alter table 表名 modify column 列名 列类型 primary key;
或者:alter table 表名 add primary key(列名);
修改表时删除:alter table 表名 modify column 列名 列类型;
或者:alter table 表名 drop primary key;
1.4 unique
唯一
保证该字段具有唯一性,可以为空
修改表时添加:alter table 表名 modify column 列名 列类型 unique;
或者:alter table 表名 add unique(列名);
修改表时删除:alter table 表名 drop index 约束名;
1.5 check
检查约束(mysql不支持)
用于限制列中值得范围,比如年龄
1.6 foreign key
外键
用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值
主表的关联列必须是一个key(一般是主键或唯一)
修改表时添加:alter table 从表名 add [constraint 外键名称] foreign key(外键列名) references 主表名(关联id);
修改表时删除:alter table 表名 drop foreign key 约束名;
列级约束:
直接在字段名和类型后面追加约束类型即可,只支持默认、非空、主键、唯一
修改表时添加:alter table 表名 modify column 列名 列类型 约束;
表级约束:
除了非空、默认
,其他的都支持
foreign key(外键列) references 外键表名(关联列名)
写在创建表的最后面
修改表时添加:alter table 表名 add [constraint 约束名] 约束类型(列名) [外键的引用]
主键和唯一约束比较:
保证唯一性 | 是否允许为空 | 一个表中可以有多少个 | 是否允许组合 | |
---|---|---|---|---|
主键 | √ | × | 最多有一个 | √,但不推荐 |
唯一 | √ | √ | 可以有多个 | √,但不推荐 |
2.标识列(自增长列)
2.1 定义(AUTO_INCREMENT)
可以不用手动的输入值,系统提供默认的序列值。
2.2 设置
set auto_increment_increment = 3; #设置每次增长的步长为3
insert into student(id,name) values(10,''); #手动设置起始值为10,后面的都会自动增长
2.3 特点
- 标识列不一定和主键搭配,但要求是一个key
- 一个表最多只能有一个标识列
- 标识列的类型只能是数值型
2.4 修改表时设置标识列
修改表时添加标识列:
alter table 表名 modify column 列名 列类型 key类型 auto_increment
修改表时删除标识列:
alter table 表名 modify column 列名 列类型
;
十四、事务
1.定义
一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全都不执行。
2.特性(ACID)
- **原子性(Atomicity)**原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
- **一致性(Consistency)**事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
- 隔离性(lsolation) 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
- 持久性(Durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
3.事务的创建
3.1 隐式事务
**定义:**事务没有明显的开启和结束的标记。比如insert、update、delete
语句。
3.2 显式事务
**定义:**事务具有明显的开启和结束的标记。
**前提:**必须先设置自动提交功能为禁用。
#1.开启事务
set autocommit=0; #禁用autocommit
show variables like 'autocommit'; #查看autocommit状态是否禁用
start transaction; #可选
#2.编写事务中的sql语句
...
#3.结束事务
commit; #提交事务
rollback; #回滚事务
4.数据库的隔离级别
4.1 事务并发问题
- 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据。
- 不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
- 幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
4.2 事务隔离级别
select @@tx_isolation; #查看隔离级别(mysql5版本)
select @@transaction_isolation; #查看隔离级别(mysql8版本)
隔离级别 | 描述 |
---|---|
READ UNCOMMITTED(读未提交数据) | 允许事务读取为被其他事务提交的变更,脏读、可重复读和幻读的问题都会出现 |
READ COMMITED(读已提交数据) | 只允许事务读取已经被其他事务提交的变更,可以避免脏读,但不可重复读和幻读问题仍然出现 |
REPEATABLE READ(可重复读) | 确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其它事务对这个字段进行更新,可以避免脏读和不可重复读,但幻读的问题仍然存在 |
SERIALIZABLE(串行化) | 确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其它事务对该表执行插入,更新和删除操作,所有并发问题都可以避免,但性能十分低下 |
Oracle支持的两种事务级别:READ COMMITED,SERIALIZABLE。默认隔离级别:SERIALIZABLE
Mysql支持4中隔离级别,默认隔离级别为:REPEATABLE READ
SET GLOBAL|SESSION TRANSACTION ISOLATION LEVEL 隔离级别; #设置全局|回话隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ UNCOMMITTED(读未提交数据) | √ | √ | √ |
READ COMMITED(读已提交数据) | × | √ | √ |
REPEATABLE READ(可重复读) | × | × | √ |
SERIALIZABLE(串行化) | × | × | × |
4.3 savepoint保存点
#搭配rollback使用,只会滚到保存点,保存点之前的sql依然会执行
set autocomit=0;
start transaction;
sql语句1...;
savepoint as a;
sql语句2...;
rollback to a;
十五、视图
1.定义
MySQL 视图(View)是一种虚拟存在的表,同真实表一样,视图也由列和行构成,但视图并不实际存在于数据库中。行和列的数据来自于定义视图的查询中所使用的表,并且还是在使用视图时动态生成的,只保存了sql逻辑,不保存查询结果。
2.创建与修改
#创建
CREATE VIEW <视图名> AS <SELECT语句>; #创建视图
CREATE OR REPLACE VIEW <视图名> AS <SELECT语句>; #如果不存在就创建,存在就修改
#修改
ALTER VIEW <视图名> AS <SELECT语句>; #修改视图
#删除
DROP VIEW <视图名>,<视图名>,... #删除视图
3.使用
select * from <视图名>;
4.特点
- 重用sql语句
- 简化复杂的sql操作,不必知道它的查询细节
- 保护数据,提高安全性
5.视图数据的更新
5.1 插入
insert into 视图名 values('',...);
5.2 修改
update 视图名 set ...;
5.3 删除
delete from 视图名 where ...;
具备以下特点的视图不允许修改操作:
①包含以下关键字的sql语句:分组函数、distinct、group by、having、union或者union all;
②常量视图;
③select中包含子查询;
④join;
⑤from 一个不能更新的视图;
⑥where子句的子查询引用了from子句中的表
十六、存储过程
1.变量
1.1 分类
1.1.1 系统变量
**定义:**变量是由系统提供的,不是用户定义,属于服务器层面。
语法:
show variables; #查看所有系统变量
show global|session variables; #查看全局|回话变量
show global|session variables like ''; #查看满足条件的系统变量
select @@[global|session][.]系统变量名; #查看某个指定的变量
set [global|session] 系统变量名 = 值; #设置系统变量值
set @@[global|session][.]系统变量名 = 值; #设置系统变量名
#不写作用范围,默认session
-
全局变量
作用域:服务器每次启动将为所有的全局变量赋初始值,针对所有的回话(连接)有效,但不能跨重启。
-
会话变量
作用域:仅仅针对于当前回话(连接)有效。
1.1.2 自定义变量
-
用户变量(声明必须初始化)
作用域:针对当前回话(连接)有效,同于回话变量的作用域
使用:
#1.声明并初始化(三种方式)
set @用户变量名=值;
set @用户变量名 := 值;
select @用户变量名 := 值; #select只支持:=赋值
#2.赋值(更新用户变量的值)
##方式1:通过set或select
set @用户变量名=值;
set @用户变量名 := 值;
select @用户变量名 := 值; #select只支持:=赋值
##方式2:通过select into(select查出来的必须是一个值)
select 字段 into @用户变量名 from 表名;
#3.使用
#查看
select @用户变量名;
-
局部变量(可以只声明,不赋值)
作用域:仅仅在定义它的begin end中有效,且为第一句话。
使用:
#1.声明 declare 变量名 类型; #只声明 declare 变量名 类型 default 值; #声明并赋予默认值 #2.赋值 ##方式1:通过set或select set 变量名=值; set 变量名 := 值; select @变量名 := 值; #select只支持:=赋值(必须加@) ##方式2:通过select into(select查出来的必须是一个值)
select 字段 into 变量名 from 表名;
#3.使用
select 局部变量名;
#### 2.存储过程和函数
##### 2.1 存储过程
###### 2.1.1 定义
一组预先编译好的SQL语句的集合。
###### 2.1.2 作用
减少了编译次数并且减少了数据库服务器的连接次数,提高了效率。
###### 2.1.3 创建与使用:
```shell
#创建
DELIMITER $$ #设置结束标记
create procedure 存储过程名(参数列表)
begin
end$$
#参数列表包含3部门 参数模式 参数名 参数类型
#参数模式:IN OUT INOUT
#IN 该参数可以作为输入,也就是说改参数需要调用方法传入值
#OUT 该参数可以作为输出,也就是作为返回值
#INOUT 该参数既可以作为输入又可以作为输出
#调用
call 存储过程名(实参列表);
#删除
drop procedure [if exists] 存储过程名;
#查看存储过程的结构
show create procedure 存储过程名;
2.1.4 注意
1.如果存储过程仅仅只有一句话,`BEGIN END` 可以省略。
2.存储过程中的每条sql语句的结尾要求必须加分号。
3.存储过程的结尾可以使用 `DELIMITER` 重新设置。语法:`DELIMITER 结束标记`
2.2 函数
2.2.1 定义
自定义函数是一种与存储过程十分相似的过程式数据库对象。它与存储过程一样,都是由 SQL 语句和过程式语句组成的代码片段,并且可以被应用程序和其他 SQL 语句调用。
2.2.2 创建与使用
#创建
DELIMITER $$ #设置结束标记
create function 函数名(参数列表) returns 返回类型
begin
函数体
return 值;
end$$
#调用
select 函数名(参数列表);
#查看函数结构
show create function 函数名;
#删除
drop function [if exists] 函数名;
2.2.3 注意
- 参数列表包含两部分:参数名、参数类型
- 函数体肯定会有return语句,如果没有会报错
- 如果return语句没有放在函数体的最后也不报错,但不建议
- 当函数体中只有一句话,则可以省略
between end
- 使用
delimiter
设置结束标记
2.2.4 存储过程与函数的区别
- 存储过程:可以有0个返回,也可以有多个返回,适合做批量插入,批量更新。
- 函数:有且仅有一个返回,适合做处理数据后返回一个结果,不允许返回结果集。
3.流程控制结构
3.1 顺序结构:程序从上往下依次执行
3.2 分支结构
3.2.1 if函数
功能:实现简单的双分支。
语法:
select if(表达式1,表达式2,表达式3);
#如果表达式1成立,则返回表达式2的值,否则返回表达式3的值
3.2.2 if结构
功能:实现多重分支。
应用:只能放在begin end
中。
语法:
if 条件1 then 语句1;
else if 条件2 then 语句2;
...
[else 语句n;]
end if;
3.2.3 case函数
特点:
- 可以作为表达式,嵌套在其他语句中使用,可以放在任何地方
- 可以作为独立的语句去使用,只能放在
begin end
中
#类似java中的switch语句,一般用于等值判断
case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1 #如果是语句需要加分号
when 常量2 then 要显示的值2或语句2
...
else 要显示的值n或语句n
end
#类似java中的多重if语句,一般用于实现区间判断
case
when 条件1 then 要显示的值1或语句1 #如果是语句需要加分号
when 条件1 then 要显示的值2或语句2
...
else 要显示的值n或语句n #可以省略,如果else省略了,且所有when都不满足,返回null
end
3.3 循环结构
分类:
while
loop
repeat
循环控制:
iterate
类似于continue
继续,结束本次循环,继续下一次leave
类似于break
跳出,结束当前所在循环
语法:
#while
[标签:] while 循环条件 do #先判断再循环
循环体;
end while [标签];
#loop
[标签:] loop #没有条件的死循环
循环体;
end loob [标签];
#repeat
[标签:] repeat #先执行再判断 类似do...while
循环体;
until 结束循环的条件
end repeat [标签];
*:只能放在begin end
中。
语法:
if 条件1 then 语句1;
else if 条件2 then 语句2;
...
[else 语句n;]
end if;
3.2.3 case函数
特点:
- 可以作为表达式,嵌套在其他语句中使用,可以放在任何地方
- 可以作为独立的语句去使用,只能放在
begin end
中
#类似java中的switch语句,一般用于等值判断
case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1 #如果是语句需要加分号
when 常量2 then 要显示的值2或语句2
...
else 要显示的值n或语句n
end
#类似java中的多重if语句,一般用于实现区间判断
case
when 条件1 then 要显示的值1或语句1 #如果是语句需要加分号
when 条件1 then 要显示的值2或语句2
...
else 要显示的值n或语句n #可以省略,如果else省略了,且所有when都不满足,返回null
end
3.3 循环结构
分类:
while
loop
repeat
循环控制:
iterate
类似于continue
继续,结束本次循环,继续下一次leave
类似于break
跳出,结束当前所在循环
语法:
#while
[标签:] while 循环条件 do #先判断再循环
循环体;
end while [标签];
#loop
[标签:] loop #没有条件的死循环
循环体;
end loob [标签];
#repeat
[标签:] repeat #先执行再判断 类似do...while
循环体;
until 结束循环的条件
end repeat [标签];