补充:增删查改语句在数据库中基本通用,但这篇博客的内容基本是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事务、视图、变量、存储过程、函数、流程控制结构的更多相关文章

  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. SecureCRT VBscript连接指定端口和波特率

    crt.Session.Connect "/Serial COM2 /BAUD 38400" 其它可用选项参考: crt.session.connect options https ...

  2. C语言基础知识(五)——数组与指针的等价表示

    void f(void) { int * p; int a[3] = {1,2,3}; p = a; printf("%d %d", a[0], p[0], *(a+1), *(p ...

  3. [PHP]用PHP自己写一个基于zoomeye的api(偷懒必备quq)

    0x01 起因 因为手速慢,漏洞刷不过别人,一个个手补确实慢,所以想自己写一个api,一键抓取zoomeye的20页,然后就可以打批量了 ovo(真是太妙了!) 0x02 动工       1.抓包做 ...

  4. 通用css 常用

    复选框自定义样式input[type="checkbox"] { position: relative; width: 0.75rem; height: 0.75rem; back ...

  5. 转 vue动画总结

    使用过渡类名(有进入及出去,适合显示隐藏,需要配合v-if) .v-enter,//进入前 .v-leave-to {//离开后 只需要入场动画 可以把v-leave-to删掉 opacity: 0; ...

  6. eatwhatApp开发实战(十一)

    之前我们实现了点击item项跳转activity,接下来我们再其基础上添加参数的传递. 在MainActivity里面的onItemClick()中: String name = shopList.g ...

  7. Druid数据库连接池的使用

    Druid  阿里提供的数据库连接池,集以上连接池优点于一身,开发使用此连接池 使用配置文件方式获取Druid数据库连接池 TestDruid package com.aff.connection; ...

  8. 【算法】Tarjan算法求强连通分量

    概念: 在有向图G中,如果两个定点u可以到达v,并且v也可以到达u,那么我们称这两个定点强连通. 如果有向图G的任意两个顶点都是强连通的,那么我们称G是一个强连通图. 一个有向图中的最大强连通子图,称 ...

  9. Java实现 蓝桥杯VIP 算法训练 学做菜

    算法训练 学做菜 时间限制:1.0s 内存限制:256.0MB 问题描述 涛涛立志要做新好青年,他最近在学做菜.由于技术还很生疏,他只会用鸡蛋,西红柿,鸡丁,辣酱这四种原料来做菜,我们给这四种原料标上 ...

  10. Java实现 LeetCode 90 子集 II(二)

    90. 子集 II 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2] 输出: [ [2], [1], [ ...