(八)MySQL事务、视图、变量、存储过程、函数、流程控制结构
补充:增删查改语句在数据库中基本通用,但这篇博客的内容基本是MySQL区别于其它数据库管理系统的知识,也要认真学习。
一、事务
1、含义:在MySQL中,可以通过创建事务来解决一些问题。
2、语法:
#1、开启事务
set autocommit=0; #禁用自动提交功能
#2、编写事务的sql语句
select insert update delete...
#3、结束事务
commit;提交事务
rollback;回滚事务
注意:MySQL默认提交事务,所以要先将autocommit功能禁用。
案例1:模拟张飞给刘备转账这一事件

查询数据库:

模拟转账:
SET AUTOCOMMIT=0;
UPDATE bank b
SET b.money=b.money-500
WHERE b.name='张飞';
UPDATE bank b
SET b.money=b.money+500
WHERE b.name='刘备';
转账后结果:

重新打开一个新标签,重新查询bank表中的内容:

可以看出数据库中的数据并未改变,因为前一个标签修改后还没有提交。
输入rollback,在第一个标签中再次查看表中数据:

可以看出rollback的作用是将数据恢复到上次提交之后的数据库内容。
案例2:savepoint 设置保存点
SET autocommit=0;
START TRANSACTION;
DELETE FROM account WHERE id=25;
SAVEPOINT a;
DELETE FROM account WHERE id=28;
ROLLBACK TO a;
注意:保存点一定要起别名,便于和rollback搭配使用。
3、事务的隔离级别
脏读 不可重复读 幻读
read uncommitted: √ √ √
read committed: × √ √
repeatable read: × × √
serializable: × × ×
注意:
①mysql中默认 第三个隔离级别 repeatable read
②查看隔离级别:select @@tx_isolation;
③设置隔离级别:set session|global transaction isolation level 隔离级别;
4、各名词含义:
①脏读:其他人看到了更改的数据后,数据被滚回
②不可重复读:数据被滚回之后再次读取数值不同
③幻读:第一次查询数据为三条,在查询后数据条数被其他人更改,再次查询时数据条数与之前不同
二、视图
1、含义:视图是虚拟创建的表,不在库中真实存在,一般是将多个表中的数据合并在一个表中,便于以后直接对其操作。
2、创建视图:
案例:查询张姓学生的学生名和专业名
step1:新建视图v1,并将学生名和专业名存放在其中
CREATE VIEW v1 #先创建视图
AS
SELECT stuname,majorname
FROM stuinfo s
INNER JOIN major m ON s.`majorid`= m.`id`;
注意:创建好的视图在SQLyog中显示位置如下:

step2:对创建好的视图进行操作,从中筛选符合条件的数据
SELECT * FROM v1 WHERE stuname LIKE '张%';
2、修改视图(重新创建一个新视图):
语法:
CREATE OR REPLACE v1
AS
查询语句;
3、删除视图:
DROP VIEW myv1,myv2;
注意:可同时删除多个视图。
4、查看视图:
DESC v1;
SHOW CREATE VIEW v1;
5、更新视图中的数据:
#1.插入
INSERT INTO myv1 VALUES('张飞','zf@qq.com');
#2.修改
UPDATE myv1 SET last_name = '张无忌' WHERE last_name='张飞';
#3.删除
DELETE FROM myv1 WHERE last_name = '张无忌';
注意:视图数据的修改与表的修改相似,只需将table替换为view即可,但具备以下性质的视图不可被修改:
①包含以下关键字:分组函数、distinct、group by、having、union或者union all
②常量视图
③Select中包含子查询
④join
⑤from一个不能更新的视图
⑥where子句的子查询引用了from子句中的表
三、变量
1、分类:
系统变量
全局变量(global)
会话变量(session)
自定义变量
用户变量
局部变量
2、系统变量
①全局变量(所有会话均有效,但数据库重启后消失):
#案例一:查看所有的全局变量
SHOW GLOBAL VARIABLES;
#案例二:查看部分全局变量
SHOW GLOBAL VARIABLES LIKE '%char%';
#案例三:查看指定全局变量
SELECT @@global.autocommit;
#案例四:修改某个全局变量
SET @@global.autocommit=0;
②会话变量(仅对本次会话有效)
注意:其查看、修改与全局变量相似,只需要将global替换为session
3、自定义变量
①用户变量(作用域同会话变量):
#声明并初始化
SET @变量名=值;
#赋值(更新变量的值) #方式很多,仅举其一
SET @变量名=值;
#使用(查看变量的值)
SELECT @变量名;
②局部变量(仅在begin end中使用):
#声明
DECLARE 变量名 类型; 或
DECLARE 变量名 类型 【DEFAULT 值】;
#赋值(更新变量的值)
SET 局部变量名=值;
#使用(查看变量的值)
SELECT 局部变量名;
案例:声明两个用户变量,求和并打印
SET @n=6,@m=3;
SET @sum=@n*@m;
SELECT @sum;
四、存储过程
1、含义:将一组合法的SQL语句封装在一起构成存储过,程类似函数但存在区别。
2、创建语法:
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
存储过程体(一组合法的SQL语句)
END
存储过程创建后在SQLyog中位置:

注意:
①参数列表包含:参数模式,参数名,参数类型。
②参数模式:in(输入)、out(输出)、inout(即可输入也可输出)
③如果存储过程体仅仅只有一句话,begin end可省略。
④SQL语句结尾要添加分号,存储过程结尾也要使用结束符号,结束符号要使用delimiter自定义
delimiter $
案例1:创建一个作用为向admin中插入一条新记录的存储过程(不使用参数模式)
DELIMITER $
CREATE PROCEDURE ins()
BEGIN
INSERT INTO admin(username,PASSWORD)
VALUES('Cindy',666666);
END$
调用:
CALL ins()$
注意:调用的 时候以$结尾因为创建存储过程前将结束语句修改为了$。
案例2:创建存储过程实现根据女生名,查询对应的男神信息(使用参数模式IN)
CREATE PROCEDURE cre(IN girl_name VARCHAR(20))
BEGIN
SELECT bo.boyName
FROM boys bo
INNER JOIN beauty b ON bo.id=b.boyfriend_id
WHERE b.name=girl_name;
END$
查询:
CALL rel('关晓彤')$
运行结果:
‘
案例3:传入a和b两个值,最终a和b都翻倍并返回(参数中包含INOUT)
CREATE PROCEDURE my_6(INOUT a INT,INOUT b INT)
BEGIN
SET a=a*2;
SET b=b*2;
END$
查询:
SET @m=5,@n=6$
CALL my_6(@m,@n)$
SELECT @m,@n$
注意:由于参数a、b即作为参数,也作为返回值,所以要先定义变量便于查询其返回值。
3、删除存储过程:
DROP PROCEDURE 存储过程名;
4、查看存储过程:
SHOW CREATE PROCEDURE 存储过程名;
五、函数
1、与存储过程的区别:函数有且仅有一个返回值,存储过程无要求。
2、创建语法:
CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
BEGIN
函数体
END
注意:
①参数列表包含变量名和变量类型
②函数体中必须要包含return
③begin end的用法和存储过程相同
函数创建后再SQLyog中的位置:

3、调用语法:
SELECT 函数名(参数);
案例1:返回公司员工个数
#创建函数
DELIMITER $
CREATE FUNCTION counts() RETURNS INT
BEGIN
SET @num=0; #注意分号的使用
SELECT COUNT(*) INTO @num
FROM employees;
RETURN @num;
END$
#调用函数
SELECT counts();
注意:
①函数的创建语法与存储过程的创建语法不同,使用returns。
②MySQL8.0版本创建函数时报错,解决方法如下:点击访问
4、查看、删除语法与存储过程相似,将procedure修改为function即可。
六、流程控制结构
1、if结构(if函数)
if 条件1 then 语句1;
elseif 条件2 then 语句2;
....
else 语句n;
end if;
注意:if结构只能用在begin end中
2、循环结构:while、loop、repeat
①循环控制:
iterate类似于 continue,继续,结束本次循环,继续下一次
leave 类似于 break,跳出,结束当前所在的循环
②语法:
#1.while
【标签:】while 循环条件 do
循环体;
end while【 标签】;
#2.loop
【标签:】loop
循环体;
end loop 【标签】;
#3.repeat
【标签:】repeat
循环体;
until 结束循环的条件
end repeat 【标签】;
案例:批量插入,根据次数插入到admin表中多条记录
DROP PROCEDURE pro_while1$
CREATE PROCEDURE pro_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i<=insertCount DO
INSERT INTO admin(username,`password`) VALUES(CONCAT('Rose',i),'666');
SET i=i+1;
END WHILE;
END $
调用:
SELECT pro_while1(100)$
注意:因为没有返回值,所以使用存储过程实现。
(八)MySQL事务、视图、变量、存储过程、函数、流程控制结构的更多相关文章
- Mysql学习---视图/触发器/存储过程/函数/执行计划/sql优化 180101
视图 视图: 视图是一个虚拟表(非真实存在),动态获取数据,仅仅能做查询操作 本质:[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用.由 ...
- MySQL 索引 视图 触发器 存储过程 函数
1.索引 索引相当于图书的目录,可以帮助用户快速的找到需要的内容. 数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万 ...
- mysql事务,视图,触发器,存储过程与备份
.事务 通俗的说,事务指一组操作,要么都执行成功,要么都执行失败 思考: 我去银行给朋友汇款, 我卡上有1000元, 朋友卡上1000元, 我给朋友转账100元(无手续费), 如果,我的钱刚扣,而朋友 ...
- mysql 视图 触发器 存储过程 函数事务 索引
mysql 视图 触发器 存储过程 函数事务 索引 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当 ...
- 第五章 MySQL事务,视图,索引,备份和恢复
第五章 MySQL事务,视图,索引,备份和恢复 一.事务 1.什么是事务 事务是一种机制,一个操作序列,它包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求.要么都执行 ...
- MySQL——视图/触发器/事务/存储过程/函数/流程控制
一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...
- day40 mycql 视图,触发器,存储过程,函数
视图,触发器,存储过程,自定义函数 -- 回顾 1.mysql 约束 1.非空 not null 2. 主键约束 primary key 3. 唯一约束 unique 4. 外键约束 foreign ...
- MySQL 视图 触发器 事务 存储过程 函数 流程控制 索引与慢查询优化
视图 1.什么是视图? 视图就是通过查询得到的一张虚拟表,然后保存下来,下次可直接使用 2.为什么要使用视图? 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图? create view ...
- mysql 视图 触发器 事物 存储过程 函数 流程控制
1.视图 *** 视图是有一条sql语句的查询结果构成的虚拟表 其不是物理存在的 使用方式与普通表相同 视图的作用1.简化sql语句的编写 2.限制可以查看的数据 可以使用权限来完成 权限某一个库 的 ...
- MySQL-5-TCL,视图,变量,存储过程和函数,流程控制
TCL:Transaction Control Language事务控制语言 TCL 事务的特点 acid: 原子性(Atomicity),一致性(Consistency),隔离性(isolation ...
随机推荐
- 移除项目中的UIWebView
1,AFN升级4.0 2,代码中搜索UIWebView移除相关文件 3,检查库是否使用的UIWebView 参考 https://www.jianshu.com/p/3a645500d461
- css3,transition,animation两种动画实现区别
我们为页面设置动画时,往往会用到transition还有animation以及transfrom属性或者用到js. 其实通常情况下,对于使用js我们更加倾向于使用css来设置动画. transfrom ...
- 【JavaScript数据结构系列】05-链表LinkedList
[JavaScript数据结构系列]05-链表LinkedList 码路工人 CoderMonkey 转载请注明作者与出处 ## 1. 认识链表结构(单向链表) 链表也是线性结构, 节点相连构成链表 ...
- [JavaWeb基础] 021.Action中result的各种转发类型
在struts2中, struts.xml中result的类型有多种,它们类似于struts1中的forward,常用的类型有dispatcher(默认值).redirect.redirectActi ...
- pandas删除DataFrame中任意字段等于'null'字符串的行
删除df中任意字段等于'null'字符串的行: df=df.astype(str)#把df所有元素转为str类型 df=df[df['A'].isin(['null','NULL'])] #找出df的 ...
- css 禁用浏览器滚动条,初始最外层包含容器 wrapper
浏览器默认的视窗会随着滚动条滚动,绝对定位的元素会随着滚动条滚动,为了解决这个问题我们需要禁止浏览器的滚动条,然后在代码的最外层初始化一个 div(最外层包含容容器代替默认的视窗),是滚动天出现在最外 ...
- DQN(Deep Q-learning)入门教程(六)之DQN Play Flappy-bird ,MountainCar
在DQN(Deep Q-learning)入门教程(四)之Q-learning Play Flappy Bird中,我们使用q-learning算法去对Flappy Bird进行强化学习,而在这篇博客 ...
- 被缠上了,小王问我怎么在 Spring Boot 中使用 JDBC 连接 MySQL
上次帮小王入了 Spring Boot 的门后,他觉得我这个人和蔼可亲.平易近人,于是隔天小王又微信我说:"二哥,快教教我,怎么在 Spring Boot 项目中使用 JDBC 连接 MyS ...
- 低功耗SRAM主要三部分功耗来源
随着SOC 技术的迅猛发展,由电池供电的便携式电子产品得到了广泛应用,如智能手机.运动手环.ipad.部分汽车电子等.近年来半导体工艺已进入深亚微米甚至纳米阶段,工艺尺寸不断缩小,但是由于电池技术的缓 ...
- Rocket - diplomacy - AddressAdjuster分析
https://mp.weixin.qq.com/s/UYVSO3XFJmhe5bUD_XbMLg 先介绍如何使用AddressAdjuster,然后分析UI参数的生成及使用. 1. ...