(八)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 ...
随机推荐
- SecureCRT VBscript连接指定端口和波特率
crt.Session.Connect "/Serial COM2 /BAUD 38400" 其它可用选项参考: crt.session.connect options https ...
- C语言基础知识(五)——数组与指针的等价表示
void f(void) { int * p; int a[3] = {1,2,3}; p = a; printf("%d %d", a[0], p[0], *(a+1), *(p ...
- [PHP]用PHP自己写一个基于zoomeye的api(偷懒必备quq)
0x01 起因 因为手速慢,漏洞刷不过别人,一个个手补确实慢,所以想自己写一个api,一键抓取zoomeye的20页,然后就可以打批量了 ovo(真是太妙了!) 0x02 动工 1.抓包做 ...
- 通用css 常用
复选框自定义样式input[type="checkbox"] { position: relative; width: 0.75rem; height: 0.75rem; back ...
- 转 vue动画总结
使用过渡类名(有进入及出去,适合显示隐藏,需要配合v-if) .v-enter,//进入前 .v-leave-to {//离开后 只需要入场动画 可以把v-leave-to删掉 opacity: 0; ...
- eatwhatApp开发实战(十一)
之前我们实现了点击item项跳转activity,接下来我们再其基础上添加参数的传递. 在MainActivity里面的onItemClick()中: String name = shopList.g ...
- Druid数据库连接池的使用
Druid 阿里提供的数据库连接池,集以上连接池优点于一身,开发使用此连接池 使用配置文件方式获取Druid数据库连接池 TestDruid package com.aff.connection; ...
- 【算法】Tarjan算法求强连通分量
概念: 在有向图G中,如果两个定点u可以到达v,并且v也可以到达u,那么我们称这两个定点强连通. 如果有向图G的任意两个顶点都是强连通的,那么我们称G是一个强连通图. 一个有向图中的最大强连通子图,称 ...
- Java实现 蓝桥杯VIP 算法训练 学做菜
算法训练 学做菜 时间限制:1.0s 内存限制:256.0MB 问题描述 涛涛立志要做新好青年,他最近在学做菜.由于技术还很生疏,他只会用鸡蛋,西红柿,鸡丁,辣酱这四种原料来做菜,我们给这四种原料标上 ...
- Java实现 LeetCode 90 子集 II(二)
90. 子集 II 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2] 输出: [ [2], [1], [ ...