MySql之索引,视图,事务以及存储过程举例详解

news2024/11/29 12:41:31

一.数据准备

数据准备可参考下面的链接中的数据准备步骤

MySql之内连接,外连接,左连接,右连接以及子查询举例详解-CSDN博客

(如有问题可在评论区留言)

二.存储过程

1.定义

存储过程 PROCEDURE ,也翻译为存储程序,是一条或者多条 SQL 语句的集合

2.语法

create procedure 存储过程名称(参数列表)
begin
sql 语句
end

3.举例

创建存储过程
--创建存储过程 stu(),查询 students 表所有学生信息
CREATE PROCEDURE stu()
BEGIN
	SELECT * from students;
end

调用存储过程

--调用存储过程stu
call stu();

执行结果:

删除存储过程

--删除存储过程,删除的时候不用写名字后面的()
--方法一
DROP PROCEDURE stu;
--方法二(方法二,加了if EXISTS,与方法一的区别就是,如果stu已经被删除,再执行方法一,会报错,但是执行方法二不会报错)
drop PROCEDURE if EXISTS stu;

三.视图

1.定义

对于复杂的查询,在多个地方被使用,如果需求发生了改变,需要更改 sql 语句,则需要在多个地方进行修改,维护起来非常麻烦;
解决:定义视图;

视图本质就是对select(查询)语句的封装

视图可以理解为一张只读的表,针对视图只能用select,不能用delete和update

2.语法

--创建视图
create view 视图名称 as select 语句;
--使用视图
select * from 视图名称;
--删除视图
方法一
drop view 视图名称;
方法二
drop view if exists 视图名称;

3.举例

创建视图

stu_nan可看成是一个新的表

--创建一个视图,查询所有男生信息
CREATE VIEW stu_nan as 
SELECT * from students where sex = '男';

使用视图

--使用视图,例1
SELECT * from stu_nan
--使用视图,例2
--在视图 stu_nan 中查找年龄大于25岁的学生信息
select * from stu_nan where age >25;
--使用视图,例3
SELECT * from stu_nan INNER JOIN scores 
on stu_nan.studentNo = scores.studentNo;

例1运行结果(其他的例子感兴趣可自行验证):

删除视图

--删除视图
--方法一
drop VIEW stu_nan;
--方法二
DROP view if EXISTS stu_nan;

4.什么时候用视图

如果某个查询结果出现的非常频繁,也就是,要经常拿这个查询结果来做子查询这种

四.事务

1.为什么要有事务

事务广泛的运用于订单系统、银行系统等多种场景;
例如: A 用户和 B 用户是银行的储户,现在 A 要给 B 转账 500 元,那么需要 做以下几件事:
1、检查 A 的账户余额>500 元;
2、A 账户中扣除 500 元;
3、B 账户中增加 500 元;
正常的流程走下来, A 账户扣了 500 B 账户加了 500 ,皆大欢喜。那如果 A 账户扣了钱之后,系统出故障了呢?A 白白损失了 500 ,而 B 也没有收到本该属 于他的 500 。以上的案例中,隐藏着一个前提条件: A 扣钱和 B 加钱,要么同时 成功,要么同时失败,事务的需求就在于此

2.什么是事务

所谓事务 , 它是一个操作序列,这些操作要么都执行,要么都不执行,它是一 个不可分割的工作单位。
例如:银行转帐工作:从一个帐号扣款并使另一个帐号增款, 这两个操作要么都执行,要么都不执行 。所以,应该把他们看成一个事务。
事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性;

3.事务指令

  • 事务是多条更改数据操作的sql语句集合

  • 一个集合数据有一致性,要么就都失败,要么就都成功回滚

  • begin ----开始事务,开启事务后执行修改update或者删除delete记录语句,变更会写到缓存中,而不会立刻生效

  • rollback ----回滚事务,放弃对表的修改

  • commit ---- 提交事务,对表的修改生效

没有写begin代表没有事务,没有事务的表操作都是实时生效.

如果只写了begin, 没有rollback,也没有commit, 结果是rollback或者系统退出,结果也是rollback

回滚事务

(第二步执行的完成后,可以用查询语句查询stuents表是否真的删除001的记录--应该是被删除了

第三步执行的完成后,可以用查询语句查询scores表是否真的删除001的记录--应该是被删除了

第四步执行完成后,可以分别查询两个表的内容,001的记录都还存在)

-- 例 1:
-- 第一步执行:开始事务(begin;)
-- 第二步执行:删除 students 表中 studentNo 为 001 的记录,
-- 第三步执行:同时删除 scores 表中 studentNo 为 001 的记录, 
-- 第四步执行:回滚事务,两个表的删除同时放弃
begin;
DELETE from students where studentNo = '001';
DELETE from scores where studentNo = '001';
-- 回滚事务,放弃更改
ROLLBACK;

注意:如果在第二步执行或者第三步执行完成后,直接把navicat关掉,那么重新进入navicat时,查询students表和scores表的内容时,001记录是存在的(验证了这句话:系统退出或系统有问题了,结果也是rollback

提交事务

-- 开启事务,
-- 删除 students 表中 studentNo 为 001 的记录,
-- 同时删除 scores 表中 studentNo 为 001 的记录, 
-- 提交事务,使两个表的删除同时生效

begin;
DELETE from students where studentNo = '001';
DELETE from scores where studentNo = '001';
--提交事务,一旦提交事务,两个删除操作同时生效
commit;

五.索引

1.引入索引

看一本书,怎么快速知道要查看的内容在多少页?
给书建立一个目录;
  通过目录的索引,快速找到内容对应的页。
当表中数据量很大时,查找数据会变得很慢;
  可以给表建议一个类似书籍中的目录,从而加快数据查询效率,这在数据库
中叫索引( index );
注意:索引是对于表来说的,如果没有表,有索引也没有任何意义;就好比目录,没有对应的书籍,有目录也没有用;

2.创建索引的目的

  • 给表建立索引,目的是加快select查询的速度

  • 如果一个表记录很少,几十条,或者几百条,不用索引

  • 表的记录特别多,如果没有索引,select语句效率会非常低

3.语法

创建索引

  • create index 索引名称 on 表名(字段名称(长度));

  • 如果字段为字符串,需要写明创建表字段的时候字符串的长度

  • 字段类型如果不是字符串,可以不填写长度部分。

调用索引

  • 不需要写调用索引的语句,只要where条件后面用到的字段建立了索引,那么系统会自动调用

查看索引

  • show index from 表名

  • 对于主键,系统会自动建立索引

删除索引

  • drop index 索引名 on 表名

4.举例

创建索引
-- 例1:为表 students 的 age 字段创建索引,名为 age_index
CREATE index age_index on students (age);

-- 例2:为表 students 的 name 字段创建索引,名为 name_index
CREATE INDEX name_index on students (name(10));

查看索引
-- 查看students表的索引
show index from students;

结果(主键会自己自动生成索引):

调用索引

--调用索引
-- where条件后面的字段,数据库系统会自动查找是否有索引
-- 这里会自动调用age_index
select * from students where age = 30;
-- 自动调用name_index
SELECT * from students where name = '李白';
-- 不会调用任何索引,因为sex字段没有索引
SELECT * from students where sex = '女';

删除索引

-- 删除索引age_index
drop index age_index on students;
-- 删除索引name_index
drop index name_index on students;

5.索引的优缺点

  • 提高select的查询速度

  • 降低update,delete和insert语句的执行速度

  • 项目中80%以上是select,所以index必须的

  • 在实际工作中如果涉及到大量的数据修改操作,修改之前可以把索引删除,修改完成后再把索引建立起来

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1253921.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode—167.两数之和 II - 输入有序数组【中等】

2023每日刷题(四十一) Leetcode—167.两数之和 II - 输入有序数组 实现代码 /*** Note: The returned array must be malloced, assume caller calls free().*/ int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) {*returnSiz…

过渡曲线的构造之平面PH曲线

平面PH曲线的构造及其相应性质 平面PH曲线的构造及其相应性质PH曲线理论三次PH曲线的构造及性质四次PH曲线的构造及性质五次PH曲线的构造及性质非尖点五次PH曲线尖点五次PH曲线 参考文献 平面PH曲线的构造及其相应性质 过渡曲线常需要满足在连接点处位置连续、曲率连续以及切线…

Docker Swarm总结+CI/CD Devops、gitlab、sonarqube以及harbor的安装集成配置(3/4)

博主介绍:Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 🍅文末获取源码下载地址🍅 👇🏻 精彩专栏推荐订阅👇🏻…

makefile编写练习

makefile编写练习 OVERVIEW makefile编写练习文件结构直接编译整个项目并运行将项目制作成为静态库将项目制作成为动态库 编写makefile文件来编译带头文件的程序, 文件结构 初始项目文件结构,如下所示: #ifndef ADD_HPP #define ADD_HPPint…

栈详解(C语言)

文章目录 写在前面1 栈的定义2 栈的初始化3 数据入栈4 数据出栈5 获取栈顶元素6 获取栈元素个数7 判断栈是否为空8 栈的销毁 写在前面 本片文章详细介绍了另外两种存储逻辑关系为 “一对一” 的数据结构——栈和队列中的栈,并使用C语言实现了数组栈。 栈C语言实现源…

Visual Studio 使用MFC 单文档工程绘制单一颜色直线和绘制渐变颜色的直线(实例分析)

Visual Studio 使用MFC 单文档工程从创建到实现绘制单一颜色直线和绘制渐变颜色的直线 本文主要从零开始创建一个MFC单文档工程然后逐步实现添加按键(事件响应函数),最后实现单一颜色直线的绘制与渐变色直线的绘制o( ̄▽&#xffe…

2、Burp使用

文章目录 一、为Firefox浏览器安装数字证书二、利用Intruder模块进行暴力破解 一、为Firefox浏览器安装数字证书 &#xff08;1&#xff09;利用Firefox浏览器访问http://burp或127.0.0.1:<监听端口>&#xff0c;点击页面右上侧的“CA Certificate”处下载CA证书&#xf…

靡靡之音 天籁之声 ——Adobe Audition

上一期讲到了和Pr配合使用的字幕插件Arctime Pro的相关介绍。相信还记得的小伙伴应该记得我还提到过一个软件叫做Au。 当人们对字幕需求的逐渐满足&#xff0c;我们便开始追求更高层次的享受&#xff0c;当视觉享受在进步&#xff0c;听觉享受想必也不能被落下&#xff01; Au即…

【模板】KMP算法笔记

练习链接&#xff1a;【模板】KMP - 洛谷 题目&#xff1a; 输入 ABABABC ABA 输出 1 3 0 0 1 思路&#xff1a; 根据题意&#xff0c;用到的是KMP算法&#xff0c;KMP算法思想是通过一个一个匹配首字母的原理进行整个匹配效果&#xff0c;当某个首字母不匹配的时候&#x…

【全栈开发】Blitz.js与RedwoodJS

技术的不断发展是必然的。如果你仔细观察这片土地&#xff0c;你会注意到随着技术的成熟而出现的某些模式。特别是&#xff0c;开发人员一直在努力提高性能&#xff0c;简化开发过程&#xff0c;增强开发人员体验。 在本指南中&#xff0c;我们将分析两个帮助全栈应用程序世界…

2023年3月电子学会青少年软件编程 Python编程等级考试一级真题解析(判断题)

2023年3月Python编程等级考试一级真题解析 判断题(共10题,每题2分,共20分) 26、在Python编程中,print的功能是将print()小括号的内容输出到控制台,比如:在Python Shell中输入print(北京,你好)指令,小括号内容可以输出到控制台 答案:错 考点分析:考查python中print…

Proteus仿真--基于PG12864LCD设计的指针式电子钟

本文介绍基于PG12864LCD设计的指针式电子钟&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 本设计中时间芯片选用DS1302芯片&#xff0c;液晶选用PG12864LCD模块&#xff0c;按键K1-K3&#xff0c;K1用于时分选择&#xff0c;K2用于调整功能&#xff0c…

积跬步至千里 || 为循环添加进度条

有时候&#xff0c;我们的Python程序需要运行较长时间&#xff0c;原因是一些环节占用时间太长&#xff08;如for循环&#xff09;。如果我们要观察那些占用时间任务的执行进度&#xff0c;那么有一个进度条能实时的显示任务进度情况的话&#xff0c;将会非常方便。而tqdm库就是…

Docker容器化部署若依微服务ruoyi-cloud项目

系统环境 接下来的内容以 Ubuntu 22.04.1 操作系统为例。 下载安装Docker Ubuntu hihi-IdeaCentre-GeekPro-15ICK:~$ sudo su [sudo] hi 的密码&#xff1a; roothi-IdeaCentre-GeekPro-15ICK:/home/hi# docker ps 找不到命令 “docker”&#xff0c;但可以通过以下软件包安…

JDK、JRE、JVM的特点和关联

Java 的三个重要的概念是 JDK&#xff08;Java Development Kit&#xff09;、JRE&#xff08;Java Runtime Environment&#xff09;和 JVM&#xff08;Java Virtual Machine&#xff09;。它们之间有着密切的关联&#xff0c;同时又有不同的职责和特点。 JDK&#xff08;Java…

使用skforecast进行时间序列预测

时间序列预测是数据科学和商业分析中基于历史数据预测未来价值的一项重要技术。它有着广泛的应用&#xff0c;从需求规划、销售预测到计量经济分析。由于Python的多功能性和专业库的可用性&#xff0c;它已经成为一种流行的预测编程语言。其中一个为时间序列预测任务量身定制的…

【数据库】执行计划中二元操作对一趟扫描算法的应用,理解代价评估的应用和优化,除了磁盘代价还有CPU计算代价不容忽略

二元操作的一趟算法 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏会定…

makefile项目构建

makefile项目构建 OVERVIEW makefile项目构建1.概念2.make选项3.makefile语法&#xff08;1&#xff09;基本语法&#xff08;2&#xff09;系统与自定变量&#xff08;3&#xff09;常用函数&#xff08;4&#xff09;模式匹配与伪目标 4.makefile编译流程&#xff08;1&#…

机器学习---贝叶斯网络与朴素贝叶斯

1. 贝叶斯法则 如何判定一个人是好人还是坏人&#xff1f; 当你无法准确的熟悉一个事物的本质时&#xff0c;你可以依靠与事物特定本质相关的事件出现的次数来判断 其本质属性的概率。如果你看到一个人总是做一些好事&#xff0c;那这个人就越可能是一个好人。 数学语言表达…

C# APS.NET CORE 6.0 WEB API IIS部署

1.创建 APS.NET CORE6.0 WEB API项目 默认选项即可 源代码&#xff1a; 项目文件展开&#xff1a; launchSettings.json {"$schema": "https://json.schemastore.org/launchsettings.json","iisSettings": {"windowsAuthentication"…