目录
1.演示事务
编辑 1.1 read-uncommitted
1.2 read-committed
1.3 repeatable read
1.4 幻读
1.5 serializable
1.6 savepoint
2 变量
2.1 语法
2.2 举例
3 存储过程和函数
3.1 特点和语法
3.2 举例
4.函数
4.1 语法
4.2 举例
5 流程控制
5.1 分支结构
5.1.1 语法
5.1.2 举例
5.2 循环结构
5.2.1 语法
5.2.2 举例
1.演示事务
通过命令行进行事务的演示
首先重启事务
查看当前默认隔离级别
执行事务
1.1 read-uncommitted
再开启一个链接登录修改隔离级别 read-uncommitted;
查看表发现此时已经将'zhangwuji' 改成了‘john’
回滚之后再去查看 发现幻读。
总结: 脏读,不可重复读和幻读都不能避免
1.2 read-committed
修改事务
开启事务
再另一个窗口里面修改隔离级别
查看隔离级别 变成了张无忌
将蓝色的部分提交,重新查看黑色的部分,结果和上一次不一样,出现了不可重复读。
总结: 避免了脏读,但是不可重复读和幻读依旧可以出现
1.3 repeatable read
修改两个隔离级别
修改,蓝色的部分提交。发现两次一样
最后把黑色部分提交了,发现结果才发生了改变。
可以解决脏读,不可重复读,不能解决幻读
1.4 幻读
重新开启一个事务 update 此时没有执行
同时在黑色里面开启一个事务,插入数据
此时发现修改了3行,原来本意是修改两行
1.5 serializable
此隔离级别可以解决以上所有情况的问题
使用幻读来举例:
此时黑色的部分出现了阻塞。只有蓝色阻塞才能开始
总结
1.6 savepoint
只能搭配rollback 使用。
2 变量
2.1 语法
分类
一、系统变量
说明:变量由系统提供的,不用自定义
语法:
①查看系统变量
show 【global|session 】variables like ''; 如果没有显式声明global还是session,则默认是session
②查看指定的系统变量的值
select @@【global|session】.变量名; 如果没有显式声明global还是session,则默认是session
③为系统变量赋值
方式一:
set 【global|session 】 变量名=值; 如果没有显式声明global还是session,则默认是session
方式二:
set @@global.变量名=值;
set @@变量名=值;
1、全局变量
服务器层面上的,必须拥有super权限才能为系统变量赋值,作用域为整个服务器,也就是针对于所有连接(会话)有效2、会话变量
服务器为每一个连接的客户端都提供了系统变量,作用域为当前的连接(会话)
二、自定义变量
说明:
1、用户变量
作用域:针对于当前连接(会话)生效
位置:begin end里面,也可以放在外面
使用:①声明并赋值:
set @变量名=值;或
set @变量名:=值;或
select @变量名:=值;②更新值
方式一:
set @变量名=值;或
set @变量名:=值;或
select @变量名:=值;
方式二:
select xx into @变量名 from 表;③使用
select @变量名;2、局部变量
作用域:仅仅在定义它的begin end中有效
位置:只能放在begin end中,而且只能放在第一句
使用:
①声明
declare 变量名 类型 【default 值】;
②赋值或更新
方式一:
set 变量名=值;或
set 变量名:=值;或
select @变量名:=值;
方式二:
select xx into 变量名 from 表;
③使用
select 变量名;
2.2 举例
1.全局变量
2.自定义变量
3 存储过程和函数
3.1 特点和语法
说明:都类似于java中的方法,将一组完成特定功能的逻辑语句包装起来,对外暴露名字
好处:
1、提高重用性
2、sql语句简单
3、减少了和数据库服务器连接的次数,提高了效率
一、创建 ★
create procedure 存储过程名(参数模式 参数名 参数类型)
begin
存储过程体
end
注意:
1.参数模式:in、out、inout,其中in可以省略
2.存储过程体的每一条sql语句都需要用分号结尾二、调用
call 存储过程名(实参列表)
举例:
调用in模式的参数:call sp1(‘值’);
调用out模式的参数:set @name; call sp1(@name);select @name;
调用inout模式的参数:set @name=值; call sp1(@name); select @name;
三、查看
show create procedure 存储过程名;
四、删除
drop procedure 存储过程名;
3.2 举例
插入3个人
复制到终端
#调用
#创建in 模式的
代码:
#在命令行打开mysql 进入到相应的数据库,输入代码,
sqlyog 已经存在了。
#调用
没有报错只是这里面没有对应的数据而已。
#创建带有out的模式
案例根据女神名返回对应的男神名
#带有inout 的方法 需要先选择一个数据库才能有存储过程的内容
案例 传入a,b 两个值,最终a和b 多翻倍并返回
代码
DELIMITER $
CREATE PROCEDURE myp4(INOUT a INT ,INOUT b INT)
BEGIN
SET a=a*2;
SET b=b*2;
END $
SET @a=10$
SET @b=20$
CALL myp4(@a,@b)$
SELECT @a $
SELECT @b $
#存储过程的删除
#存储过程的查看
show create procedure 存储过程名
4.函数
4.1 语法
一、创建
create function 函数名(参数名 参数类型) returns 返回类型
begin
函数体
end注意:函数体中肯定需要有return语句
二、调用
select 函数名(实参列表);
三、查看
show create function 函数名;
四、删除
drop function 函数名;
4.2 举例
#无参有反
#有参有反
#函数的查看
在mysql proc 右击打开表
#删除函数
5 流程控制
说明:
顺序结构:程序从上往下依次执行
分支结构:程序按条件进行选择执行,从两条或多条路径中选择一条执行
循环结构:程序满足一定条件下,重复执行一组语句
5.1 分支结构
5.1.1 语法
特点:
1、if函数
功能:实现简单双分支
语法:
if(条件,值1,值2)
位置:
可以作为表达式放在任何位置
2、case结构
功能:实现多分支
语法1:
case 表达式或字段
when 值1 then 语句1;
when 值2 then 语句2;
..
else 语句n;
end [case];语法2:
case
when 条件1 then 语句1;
when 条件2 then 语句2;
..
else 语句n;
end [case];
位置:
可以放在任何位置,
如果放在begin end 外面,作为表达式结合着其他语句使用
如果放在begin end 里面,一般作为独立的语句使用
3、if结构
功能:实现多分支
语法:
if 条件1 then 语句1;
elseif 条件2 then 语句2;
...
else 语句n;
end if;
位置:
只能放在begin end中
5.1.2 举例
case 结构
5.2 循环结构
5.2.1 语法
位置:
只能放在begin end中特点:都能实现循环结构
对比:
①这三种循环都可以省略名称,但如果循环中添加了循环控制语句(leave或iterate)则必须添加名称
②
loop 一般用于实现简单的死循环
while 先判断后执行
repeat 先执行后判断,无条件至少执行一次
1、while
语法:
【名称:】while 循环条件 do
循环体
end while 【名称】;
2、loop
语法:
【名称:】loop
循环体
end loop 【名称】;3、repeat
语法:
【名称:】repeat
循环体
until 结束条件
end repeat 【名称】;二、循环控制语句
leave:类似于break,用于跳出所在的循环
iterate:类似于continue,用于结束本次循环,继续下一次
5.2.2 举例
#leave 语句
#添加iterate 语句
总结: