补充:增删查改语句在数据库中基本通用,但这篇博客的内容基本是MySQL区别于其它数据库管理系统的知识,也要认真学习。

一、事务

1、含义:在MySQL中,可以通过创建事务来解决一些问题。

2、语法:

  1. #1、开启事务
  2. set autocommit=0; #禁用自动提交功能
  3. #2、编写事务的sql语句
  4. select insert update delete...
  5. #3、结束事务
  6. commit;提交事务
  7. rollback;回滚事务

注意:MySQL默认提交事务,所以要先将autocommit功能禁用。

案例1:模拟张飞给刘备转账这一事件

查询数据库:

模拟转账:

  1. SET AUTOCOMMIT=0;
  2. UPDATE bank b
  3. SET b.money=b.money-500
  4. WHERE b.name='张飞';
  5. UPDATE bank b
  6. SET b.money=b.money+500
  7. WHERE b.name='刘备';

转账后结果:

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

可以看出数据库中的数据并未改变,因为前一个标签修改后还没有提交。

输入rollback,在第一个标签中再次查看表中数据:

可以看出rollback的作用是将数据恢复到上次提交之后的数据库内容。

案例2:savepoint 设置保存点

  1. SET autocommit=0;
  2. START TRANSACTION;
  3. DELETE FROM account WHERE id=25;
  4. SAVEPOINT a;
  5. DELETE FROM account WHERE id=28;
  6. ROLLBACK TO a;

注意:保存点一定要起别名,便于和rollback搭配使用。

3、事务的隔离级别

  1. 脏读 不可重复读 幻读
  2. read uncommitted
  3. read committed   ×
  4. repeatable read   × ×
  5. serializable   ×       ×       ×

注意:

①mysql中默认 第三个隔离级别 repeatable read

②查看隔离级别:select @@tx_isolation;

③设置隔离级别:set session|global transaction isolation level 隔离级别;

4、各名词含义:

①脏读:其他人看到了更改的数据后,数据被滚回

②不可重复读:数据被滚回之后再次读取数值不同

③幻读:第一次查询数据为三条,在查询后数据条数被其他人更改,再次查询时数据条数与之前不同

二、视图

1、含义:视图是虚拟创建的表,不在库中真实存在,一般是将多个表中的数据合并在一个表中,便于以后直接对其操作。

2、创建视图:

案例:查询张姓学生的学生名和专业名

step1:新建视图v1,并将学生名和专业名存放在其中

  1. CREATE VIEW v1 #先创建视图
  2. AS
  3. SELECT stuname,majorname
  4. FROM stuinfo s
  5. INNER JOIN major m ON s.`majorid`= m.`id`;

注意:创建好的视图在SQLyog中显示位置如下:

step2:对创建好的视图进行操作,从中筛选符合条件的数据

  1. SELECT * FROM v1 WHERE stuname LIKE '张%';

2、修改视图(重新创建一个新视图):

语法:

  1. CREATE OR REPLACE v1
  2. AS
  3. 查询语句;

3、删除视图:

  1. DROP VIEW myv1,myv2;

注意:可同时删除多个视图。

4、查看视图:

  1. DESC v1;
  2. SHOW CREATE VIEW v1;

5、更新视图中的数据:

  1. #1.插入
  2. INSERT INTO myv1 VALUES('张飞','zf@qq.com');
  3. #2.修改
  4. UPDATE myv1 SET last_name = '张无忌' WHERE last_name='张飞';
  5. #3.删除
  6. DELETE FROM myv1 WHERE last_name = '张无忌';

注意:视图数据的修改与表的修改相似,只需将table替换为view即可,但具备以下性质的视图不可被修改:

①包含以下关键字:分组函数、distinct、group  by、having、union或者union all

②常量视图

③Select中包含子查询

④join

⑤from一个不能更新的视图

⑥where子句的子查询引用了from子句中的表

三、变量

1、分类:

系统变量

    全局变量(global)

    会话变量(session)

自定义变量

    用户变量

    局部变量

2、系统变量

①全局变量(所有会话均有效,但数据库重启后消失):

  1. #案例一:查看所有的全局变量
  2. SHOW GLOBAL VARIABLES;
  3. #案例二:查看部分全局变量
  4. SHOW GLOBAL VARIABLES LIKE '%char%';
  5. #案例三:查看指定全局变量
  6. SELECT @@global.autocommit;
  7. #案例四:修改某个全局变量
  8. SET @@global.autocommit=0;

②会话变量(仅对本次会话有效)

注意:其查看、修改与全局变量相似,只需要将global替换为session

3、自定义变量

①用户变量(作用域同会话变量):

  1. #声明并初始化
  2. SET @变量名=值;
  3. #赋值(更新变量的值) #方式很多,仅举其一
  4. SET @变量名=值;
  5. #使用(查看变量的值)
  6. SELECT @变量名;

②局部变量(仅在begin end中使用):

  1. #声明
  2. DECLARE 变量名 类型;
  3. DECLARE 变量名 类型 DEFAULT 值】;
  4. #赋值(更新变量的值)
  5. SET 局部变量名=值;
  6. #使用(查看变量的值)
  7. SELECT 局部变量名;

案例:声明两个用户变量,求和并打印

  1. SET @n=6,@m=3;
  2. SET @sum=@n*@m;
  3. SELECT @sum;

四、存储过程

1、含义:将一组合法的SQL语句封装在一起构成存储过,程类似函数但存在区别。

2、创建语法:

  1. CREATE PROCEDURE 存储过程名(参数列表)
  2. BEGIN
  3. 存储过程体(一组合法的SQL语句)
  4. END

存储过程创建后在SQLyog中位置:

注意:

①参数列表包含:参数模式,参数名,参数类型。

②参数模式:in(输入)、out(输出)、inout(即可输入也可输出)

③如果存储过程体仅仅只有一句话,begin end可省略。

④SQL语句结尾要添加分号,存储过程结尾也要使用结束符号,结束符号要使用delimiter自定义

  1. delimiter $

案例1:创建一个作用为向admin中插入一条新记录的存储过程(不使用参数模式)

  1. DELIMITER $
  2. CREATE PROCEDURE ins()
  3. BEGIN
  4. INSERT INTO admin(username,PASSWORD)
  5. VALUES('Cindy',666666);
  6. END$

调用:

  1. CALL ins()$

注意:调用的 时候以$结尾因为创建存储过程前将结束语句修改为了$。

案例2:创建存储过程实现根据女生名,查询对应的男神信息(使用参数模式IN)

  1. CREATE PROCEDURE cre(IN girl_name VARCHAR(20))
  2. BEGIN
  3. SELECT bo.boyName
  4. FROM boys bo
  5. INNER JOIN beauty b ON bo.id=b.boyfriend_id
  6. WHERE b.name=girl_name;
  7. END$

查询:

  1. CALL rel('关晓彤')$

运行结果:

案例3:传入a和b两个值,最终a和b都翻倍并返回(参数中包含INOUT)

  1. CREATE PROCEDURE my_6(INOUT a INT,INOUT b INT)
  2. BEGIN
  3. SET a=a*2;
  4. SET b=b*2;
  5. END$

查询:

  1. SET @m=5,@n=6$
  2. CALL my_6(@m,@n)$
  3. SELECT @m,@n$

注意:由于参数a、b即作为参数,也作为返回值,所以要先定义变量便于查询其返回值。

3、删除存储过程:

  1. DROP PROCEDURE 存储过程名;

4、查看存储过程:

  1. SHOW CREATE PROCEDURE 存储过程名;

五、函数

1、与存储过程的区别:函数有且仅有一个返回值,存储过程无要求。

2、创建语法:

  1. CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
  2. BEGIN
  3. 函数体
  4. END

注意:

①参数列表包含变量名和变量类型

②函数体中必须要包含return

③begin end的用法和存储过程相同

函数创建后再SQLyog中的位置:

3、调用语法:

  1. SELECT 函数名(参数);

案例1:返回公司员工个数

  1. #创建函数
  2. DELIMITER $
  3. CREATE FUNCTION counts() RETURNS INT
  4. BEGIN
  5. SET @num=0; #注意分号的使用
  6. SELECT COUNT(*) INTO @num
  7. FROM employees;
  8. RETURN @num;
  9. END$
  10. #调用函数
  11. SELECT counts();

注意:

①函数的创建语法与存储过程的创建语法不同,使用returns。

②MySQL8.0版本创建函数时报错,解决方法如下:点击访问

4、查看、删除语法与存储过程相似,将procedure修改为function即可。

六、流程控制结构

1、if结构(if函数)

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

注意:if结构只能用在begin end中

2、循环结构:while、loop、repeat

①循环控制:

iterate类似于 continue,继续,结束本次循环,继续下一次 ​

leave 类似于 break,跳出,结束当前所在的循环

②语法:

  1. #1.while
  2. 【标签:】while 循环条件 do
  3. 循环体;
  4. end while 标签】;
  5. #2.loop
  6. 【标签:】loop
  7. 循环体;
  8. end loop 【标签】;
  9. #3.repeat
  10. 【标签:】repeat
  11. 循环体;
  12. until 结束循环的条件
  13. end repeat 【标签】;

案例:批量插入,根据次数插入到admin表中多条记录

  1. DROP PROCEDURE pro_while1$
  2. CREATE PROCEDURE pro_while1(IN insertCount INT)
  3. BEGIN
  4. DECLARE i INT DEFAULT 1;
  5. WHILE i<=insertCount DO
  6. INSERT INTO admin(username,`password`) VALUES(CONCAT('Rose',i),'666');
  7. SET i=i+1;
  8. END WHILE;
  9. END $

调用:

  1. SELECT pro_while1(100)$

注意:因为没有返回值,所以使用存储过程实现。

(八)MySQL事务、视图、变量、存储过程、函数、流程控制结构的更多相关文章

  1. Mysql学习---视图/触发器/存储过程/函数/执行计划/sql优化 180101

    视图 视图: 视图是一个虚拟表(非真实存在),动态获取数据,仅仅能做查询操作 本质:[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用.由 ...

  2. MySQL 索引 视图 触发器 存储过程 函数

    1.索引 索引相当于图书的目录,可以帮助用户快速的找到需要的内容. 数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万 ...

  3. mysql事务,视图,触发器,存储过程与备份

    .事务 通俗的说,事务指一组操作,要么都执行成功,要么都执行失败 思考: 我去银行给朋友汇款, 我卡上有1000元, 朋友卡上1000元, 我给朋友转账100元(无手续费), 如果,我的钱刚扣,而朋友 ...

  4. mysql 视图 触发器 存储过程 函数事务 索引

    mysql 视图 触发器 存储过程 函数事务 索引 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当 ...

  5. 第五章 MySQL事务,视图,索引,备份和恢复

    第五章 MySQL事务,视图,索引,备份和恢复 一.事务 1.什么是事务 事务是一种机制,一个操作序列,它包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求.要么都执行 ...

  6. MySQL——视图/触发器/事务/存储过程/函数/流程控制

    一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...

  7. day40 mycql 视图,触发器,存储过程,函数

    视图,触发器,存储过程,自定义函数 -- 回顾 1.mysql 约束 1.非空 not null 2. 主键约束 primary key 3. 唯一约束 unique 4. 外键约束 foreign ...

  8. MySQL 视图 触发器 事务 存储过程 函数 流程控制 索引与慢查询优化

    视图 1.什么是视图? 视图就是通过查询得到的一张虚拟表,然后保存下来,下次可直接使用 2.为什么要使用视图? 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图? create view ...

  9. mysql 视图 触发器 事物 存储过程 函数 流程控制

    1.视图 *** 视图是有一条sql语句的查询结果构成的虚拟表 其不是物理存在的 使用方式与普通表相同 视图的作用1.简化sql语句的编写 2.限制可以查看的数据 可以使用权限来完成 权限某一个库 的 ...

  10. MySQL-5-TCL,视图,变量,存储过程和函数,流程控制

    TCL:Transaction Control Language事务控制语言 TCL 事务的特点 acid: 原子性(Atomicity),一致性(Consistency),隔离性(isolation ...

随机推荐

  1. SPL数据结构

    数据结构是计算机存储.组织数据的方式. SPL提供了双向链表.堆栈.队列.堆.降序堆.升序堆.优先级队列.定长数组.对象容器. 基本概念Bottom:节点,第一个节点称Bottom:Top:最后添加的 ...

  2. css不换行解决

    word-wrap: break-word; word-break: break-all; white-space: pre-wrap;

  3. swiper基本使用

    参数名 类型 是否必填 描述 swiperContainer HTMLElement or string 必选 Swiper容器的css选择器,例如".swiper-container&qu ...

  4. 有点干货 | Jdk1.8新特性实战篇(41个案例)

    作者:小傅哥 博客:https://bugstack.cn - 汇总系列原创专题文章 沉淀.分享.成长,让自己和他人都能有所收获!

  5. h5中嵌入视频自动播放的问题

    在H5页面中嵌入视频的情况是比较多件的,有时候会碰到需要自动播放的情况,之前根本觉得这不是问题,但是自己的项目中需要视频的时候就有点sb了,达不到老板的要求,那个急呀~~~ 各种查资料,找到一个方法, ...

  6. 【JVM】体系结构及其细节

    JVM JVM运行在操作系统之上,与硬件没有直接的交互.引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译.Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语 ...

  7. MVC案例之新增与修改Customer

    新增Customer 添加的流程Add New Customer 超链接连接到 newcustomer.jsp新建 newcustomer.jsp: 在 CustomerServlet 的 addCu ...

  8. Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)

    745. 前缀和后缀搜索 给定多个 words,words[i] 的权重为 i . 设计一个类 WordFilter 实现函数WordFilter.f(String prefix, String su ...

  9. Java实现 LeetCode 693 交替位二进制数(位运算)

    693. 交替位二进制数 给定一个正整数,检查他是否为交替位二进制数:换句话说,就是他的二进制数相邻的两个位数永不相等. 示例 1: 输入: 5 输出: True 解释: 5的二进制数是: 101 示 ...

  10. Java实现 蓝桥杯 算法训练 前缀表达式

    算法训练 前缀表达式 时间限制:1.0s 内存限制:512.0MB 问题描述 编写一个程序,以字符串方式输入一个前缀表达式,然后计算它的值.输入格式为:"运算符 对象1 对象2", ...