事务
事务:一个或者一组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.视图是常量查询
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