Mysql事务

事务

事务:一个或者一组sql语句组成一个执行单元,每个sql语句相互依赖,这个执行单元要么全部执行,要么全不执行,如果某条语句失败,则整个单元将会回滚

事务的ACID
A:原子性(Atomicicity) 

C:一致性(Consistency)事务必须使数据库从一个一致性状态到另一个一致性状态,也就是执行前后都必须是一致性状态(转钱时总共的钱)

I:隔离性(Isolation)一个事务的执行不能被其他事务干扰。即一个事务内部的操作和使用的数据对并发的其他事务是隔离的,不能干扰。(往一个账号存钱的同时不能从账号取钱)
	隔离级别:
		read_unconmmitted:读取未提交事务的数据(造成脏读)
		read_committed:事务提交后其更新结果可以被其他事务看见(造成不可重复读,一般都更新)
		repeated_read:在一个事务中,对于同一份数据的读取结果相同。前提条件是不能增删,可以更新已有的数据值。(造成幻读,针对增删)
		serialization:牺牲并发性。解决以上所有问题
D:持久性(Durability)一个事务一旦提交,其对数据库的改变是永久性的

==Mysql默认的隔离级别是repeated_read==

事务分类
	隐形事务:insert、delete、SQL单句
	显示事务:有明显是开启和结束的标记(首先要设置自动提交功能为禁用)
	set autocommit=0;//只针对当前会话有效
show variables like 'autocommit';//查看变量
1.开启事务
set autocommit=0;
start transacation;//可选的,上一步默认开启

2.编写事务的sql语句(select、insert、update)           (修改、删除、创建表语句不是)
语句1;
语句2;
...

3.结束事务
commit;提交事务
rollback;回滚事务
查看隔离界别
select @@tx_isolation;

设置事务的隔离级别
set session transaction isolation level 隔离界别;//设置当前链接有效
set global transaction isolation level 隔离级别//全局有效


回滚时delete和truncate的区别
delete可以回滚,truncate不支持回滚

savepoint的使用
set autocommit=0;
start transaction;
delete from account where id=25;
savepoint a;
delete from account where id=24;
rollback to a;
==回滚到a之后id=25删除,id=24回滚==

视图

语法
	create view 视图名 as 查询语句

视图的修改
create or replace view 视图名 as 查询语句
alter view 视图名 as 查询语句

删除视图
drop

查看视图
desc 视图
show create view 视图

视图的更新//更改视图的数据
视图里面insert、update等,在视图和源表一起更新

	不允许更新视图的情况
	1.包含以下关键字:distinct、group by、having、union或者union all
	2.视图是常量查询//select 1 math;
	3.select语句中包含子查询
	4.含有join
	5.from里面有一个不能更新的视图
	6.where子句的子查询引用from子句的表
		create or replace view myv
		as
		select last_name,email,salary
		from employees
		where employee_id in (
			select manager_id
			from employees
			where manager_id is not null;
		);

虚拟表,和普通表一样使用
mysql5.1版本新特性,通过普通表动态生成的数据

特点:
	不保存真实数据,在使用视图时动态生成,临时的,只保存sql逻辑

应用场景:
	多个地方用到同样的查询结果
	该查询结果使用的SQL语句复杂
create view v1
as
要查询的语句

示例:
create view v1
as
select stuname,majorname
from stuinfo s
inner join major m on m.`id`=s.`majorid`;


查询姓张的学生名和专业名
select * from v1 where stuname like '张%';

变量

系统变量:
	全局变量
	会话变量
自定义变量:
	用户变量
	局部变量
用户变量使用步骤:
	声明、赋值、使用(查看、比较、运算)
作用域:针对当前会话有效,同于会话变量的作用域
系统变量:
1.查看所有的系统变量
show global 【session】variables;

2.查看满足条件的部分系统变量
show global variables like '%char%';

3.查看指定的某个系统变量的值
select @@global.系统变量名

4.为某个系统变量赋值
set 系统变量名 =值;
set .@@global.系统变量名=值;
==如果是全局变量就加global,会话加session,默认session==

会话变量:针对当前会话
把上面的global换为session 或者不加去掉global,默认session

用户变量:操作符有:=或者:=
1.声明并初始化
set @用户变量名=值;
set @用户变量名:=值;
set @用户变量名:=值;
==使用set可以使用两种操作符,使用select只能使用:=  ==

2.赋值
通过上面的方式

通过select into
select 字段 into @变量名 from 表;

3.查看变量值
select @用户变量名;


局部变量:在定义的begin end中有效
1.声明:
declear 变量名 类型;
declear 变量名 类型 default 值;

2.赋值
set 局部变量名=值;
set 局部变量名:=值;
set @局部变量名:=值;

select 字段 into 局部变量名 from 表;

查看
select 局部变量名;

存储过程和函数

存储过程和函数
1.提高代码重用性
2.简化操作

存储过程:一组预先编译好的SQL语句的集合,理解为批处理语句
1.提高代码重用性
2.简化操作
3.减少编译次数和数据库服务器的连接次数,提高效率

存储过程和函数的区别:存储过程可以有多个返回,函数只能有一个

存储过程:可以有0个返回,也可以有多个返回,适合批量插入和更新
函数:有且仅有1个返回,适合做处理数据后返回一个结果
存储过程
创建语法
create procedure 存储过程名(参数列表)
begin
	存储过程体(一组合法的SQL语句)
end
注意
1.参数列表包含 参数模式、参数名、参数类型
举例:in stuname varchar(20)

参数模式:
in:参数作为输入
out:参数作为输出(返回值)
inout:既可以输入又可以输出

2.存储过程只有一句话,beginend可以省略
存储过程体每条SQL语句必须加封号
存储过程结尾使用(delimter 特殊标志 )重新设置
==特殊标志是自己设置,不能和封号一样,用作存储过程的结束。在call和end的时候必须使用设置的结尾,在select的时候也用==

调用语句
call 存储过程名(参数列表);

1.空参数列表

插入到admin表中5条记录
select * from admin;

delimter $

create procedure myp()
begin
	insert into admin(username,`passwd`)
	values('join1','0000'),('join2','0000'),('join3','0000'),('join4','0000');
end $

call myp()$

2.创建带in模式的
根据女神名查询对应的男生信息
create procedure myp(in beautyname varchar(20))
begin  
	select bo.*
	from boys bo
	right join beauty b bo.id=b.boyfriend_id
	where b.name=beautyname;
end$

调用
call myp('柳岩') $


创建存储过程实现,用户登录是否成功
create procedure mm(in username varchar(20),in passwd varchar(20))
begin
	declear result int default 0;
	select count(*) into result
	from admin
	where admin.username=username
	and admin.passwd=passwd;
end$

调用
call mm('张飞',‘888’);

3.带out模式的存储过程

根据女神们,返回对应的男生名
create procedure myp(in beautyname varchar(20),out boyname varchar(20))
begin 
	select bo.boyname into boyname
	from boys bo
	inner join beauty b on bo.id=b.boyfriend_id
	where b.name=beautyname;
end $

call myp('xiaozhao',@bname)$
select @bname$


根据女神名,返回对应的男神名和男生魅力值

create procedure myp(in beautyname varchar(20),out boyname varchar(20),out usercp int)
begin
	select bo.boyname,bo.usercp into boyname,usercp
	from boys bo
	inner join beauty b on bo.id=b.boyfriend_id
	where b.name=beautyname;
end

call myp('xiapzhap',@name,@cp)$
select @name,@cp$

4.inout模式
create procedure myp(inout a int ,inout b int)
begin
	set a=a*2;
	set b=b*2;
end$

在inout模式中,如果输入输出靠一个值,要提前设置变量
set @m=10$
set @n=20$

call(@m,@n)$

select @m,@n$

存储过程删除
drop procedure 存储过程名;//不支持删除多个


查看存储过程的信息
show create procedure 名字;
函数
创建语法
create function 函数名(参数列表) returns 返回类型
begin
	函数体
end


参数列表分为参数名和参数类型

函数体肯定有return,否则报错

return 值

调用语法
select 函数名(参数列表)

1.无参又返回
返回公司员工个数
create function my() returns int
begin
    declear c int default 0;
	select count(*)
	from employees;
	return c;
end$

select my()$

2.有参数又返回
根据员工名返回工资
create function my(empName varcahr(20)) returns double
begin
	set @sal=0;
	select salary into @sal
	from employees
	where last_name=empName;
	return @sal;
end$

select my('king')$//若是名字是king的有两个值,则返回失败


查看函数
show create function 函数名;

删除函数
drop function 函数名;

流程控制

分支结构
1.if函数

功能:实现简单双分支
语法:
if(表达式1,表达式2,表达式3)
如果表达1 成立,则if返回表达式2 的值,否则返回3


2.case结构
类似switch,用于等值判断
语法:
	case 变量|表达式|字段
	when 要判断的值 then 返回值或者语句;
	when 要判断的值 then 返回值或者语句;
	...
	else 要返回的值或者语句
	end case;
类似多重if,用于区间判断
语法:
	case
	when 要判断的条件 then 返回值或者语句;
	when 要判断的条件 then 返回值或语句;
	...
	else 要返回的值或者语句;
	end case;

==作为表达式结束只有end,返回值是值。可以用在任何地方
作为独立语句使用,只能放在begin end中,结束为end case,返回值是语句。==

创建存储过程,根据传入的成绩显示等级
create procedure test(in score int)
begin  
	case 
	when score>=90 then select 'a';
	when score>=80 then select 'b';
	when score>=70 then select 'c';
	else select 'd';
	end case;
end

3.if结构

if 条件1 then 语句1;
elseif 条件2 then 语句2;
...
else n;
end if;

用在begin end中

create function test (score int) return char
begin
	if score>=90 and score<=100 then return 'a';
	elseif score >=80 then return 'b';
	else return 'c';
	end if;
end

循环结构
分类:while loop repeat

iterate类似于continue
leave类似break


1.while 
语法:
【名字:】 while 循环条件 do
	循环体
end while【标签】;
相当于普通while

2.loop
语法:
【标签:】 loop
	循环体
end loop【标签】;
相当于死循环

3.repeat
语法:
【标签:】 repeat
	循环体
until 结束循环的条件
end repeat【标签】

相当于do while

Mysql事务_第1张图片
Mysql事务_第2张图片

你可能感兴趣的:(Mysql)