Mysql--高级(自定义函数、存储过程、视图、事务、索引)

news2024/11/26 6:20:59

自定义函数

语法

delimiter $$


create function 函数名称(参数列表) returns 返回类型
begin
sql语句
end
$$


delimiter ;

说明: delimiter用于设置分割符,默认为分号,主要用于命令行,在“sql语句”部分编写的语句需要以分号结尾,此时回车会直接执行,所以要创建自定义函数前需要指定其它符号作为分割符,此处使用$$,也可以使用其它字符 

示例

需求: 创建函数my_trim,用于删除字符串左右两侧的空格
step1: 设置分割符

del1miter $$

step2: 创建函数

create function my_trim(str varchar(100)) returns varchar(100)
begin
return ltrim(rtrim(str));
end
$$

step3: 还原分割符

delimiter ;

调用

直接在查询编辑器中执行,执行之后函数下会产生我们创建的自定义函数 

使用自定义函数

select '    abc    ',my trim('    abc    ')

存储过程

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

语法

delimiter //
create procedure 存储过程名称(数列表)
begin
sq1语句
end

//
delimiter ;

示例

需求:创建查询过程,查询学生信息。

step1: 设置分割符

delimiter //

step2:创建存储过程

create procedure proc_stul ()
begin

select * from students;
end

//

step3: 还原分割符

delimiter;

调用

语法如下

call 存储过程(参数列表);


调用存储过程 proc-stu
call proc stu():

函数和存储过程的作用 

  • 存储过程和函数都是为了可重复的执行操作数据库的 sql 语句的集合
  • 存储过程和函数都是一次编译,就会被缓存起来,下次使用就直接命中缓存中已经编译好的 sql,不需要重复编译
  • 减少网络交互,减少网络访问流量

 视图

问题

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

解决: 定义视图

视图本质就是对查询的封装

语法:

定义视图,建议以v 开头

create wlew 视图名称 as

select语句;

例:

1、创建视图,查询学生对应的成绩信息

create view v_stu_score_course as
select
stu.*,cs.courseNo, cs.name courseName, sc.score
from
students stu
inner join scores sc on stu.studentNo = sc.studentNo

inner join courses cs on cs.courseNo = sc.courseNo

注:视图中返回的结果不能有重名的字段,如果需要,则需给个别名

2、使用:视图的用途就是查询

select * from v stu score course;

3、查看视图:查看表会将所有的视图也列出来

show tables;

4、删除视图

drop view 视图名称;


drop view y stu score course;

事务

为什么要有事务

  • 事务广泛的运用于订单系统、银行系统等多种场景
  • 例如: A用户和B用户是银行的储户,现在A要给B转账500元,那么需要做以下几件事:0

         1、检查A的账户余额>500元
         2、A 账户中扣除500元:
         3、B 账户中增加500元

  • 正常的流程走下来,A账户扣了500,B账户加了500,皆大欢喜。那如果A账户扣了钱之后,系统出故障了呢? A白白损失了500,而B也没有收到本该属于他的500。以上的案例中,隐藏着一个前提条件: A扣钱和B加钱,要么同时成功,要么同时失败。事务的需求就在于此
  • 所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行。所以,应该把他们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性

事务类型

所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

一:所有操作都执行成功

  • 开启事务
  • 提交事务

二:任何一步操作失败

  • 开启事务
  • 回滚事务 

事务命令

要求: 表的引擎类型必须是innodb类型才可以使用事务,这是mysql表的默认引警。

表的创建语句,可以看到enginer=innodb

show create table students:

事务触发场景

修改数据的命令会触发事务,包括insert、update、delete

开启事务,命令如下:

开启事务后执行修改命令,变更会维护到本地缓存中,而不维护到物理表中
begin;

提交事务,命令如下

将缓存中的数据变更护到物理表中
commit;

回滚事务,命令如下:

放弃缓存中变更的数据
rollback;

 提交

注:为了演示效果,需要打开两个命令行窗口,使用同一个数据库,操作同一张表

step1: 查询
命令行1和命令行2: 查询学生信息
select · from students where nane in("大乔 ,"小乔');

step2: 修改数据
命令行1: 开启事务,修改数据

begin;
update students set age=age-5 where name ="大乔";

update students set age=age+5 where name="小乔";

命令行1:查询数据,发现数据已经变化
select * from students where name in('大乔 ','小乔');

step3:查询

命令行2:查询数据,发现数据没有变化
select · from students where nane in("大乔 ,"小乔");

step4:提交

命令行1:完成提交
commit;

step5: 查询

命令行2:查询数据,发现数据已经变化
select * from students where name in("大乔","小乔");

 回滚

为了演示效果,需要打开两个命令行窗口,使用同一个数据库,操作同一张表

step1:查询

命令行1和命令行2: 查询学生信息
select * from students where name in ("大乔" ,"小乔");

step2: 修改数据

命令行1:开启事务,修改数据

begin:
update students set age=age-5 where name="大乔";

update students set age=age+5 where name "小乔";

命令行1:查询数据,发现数据已经变化
select * from students where name in ("大乔" ,"小乔")

step3: 查询

命令行2:查询数据,发现数据没有变化
select * from students where name in("大乔" ,"小乔");

step4: 回滚

命令行1: 完成回滚
rollback;

step5: 查询

命令行1:查询数据,发现数据恢复为开启事务前的状态
select * from students where name in("大乔","小乔");

索引

一般的应用系统对比数据库的读写比例在10:1左右,而且插入操作和更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重当数据库中数据量很大时,查找数据会变得很慢

优化方案:索引

索引演示

导入测试表test index

右键点击某个数据库->运行sq1文件->选择test_1ndex.sq1->点击开始

查询

开启运行时间监测:

set profiling=1;

查找第1万条数据test10000

select * from test index where title="test10000"

查看执行的时间:

show profiles;

 

为表title index的title列创建索引:

create index title_index on test_index(title(10));

执行查询语句:

select * from test_index where title="test10000";

再次查看执行的时间

show profiles; 

 

语法

查看索引

show index from 表名;

 

创建索引

方式一:建表时创建索引

create table create_index(
id int primary key,
name varchar(10) unique,
age int,

key (age)

);

  • 主键列会自动创建索引
  • 唯一约束会自动创建索引
  • 使用key关键字创建索引

 方式二:对于已经存在的表,添加索引

create index 索引名称 on 表名(学段名称(长度))

  • create index age_index on create_index(age);
  • create index name_index on create_index(name(10));

注:如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致,字段类型如果不是字符串,可以不填写长度部分

删除索引:

drop index 索引名称 on 表名;

 索引的作用

提高查询速度

索引的缺点

降低更新表的速度

分析查询

是否用到索引,在哪个表中用到了索引,可以使用分析查询

explain
select * from test_index where title="test10000"

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

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

相关文章

探秘亚马逊云科技海外服务器 | 解析跨境云计算的前沿技术与应用

目录 一、什么是海外服务器 二、不同主流海外云服务器对比 三、海外服务器的创建(亚马逊为例) 四、个人总结 一、什么是海外服务器 亚马逊云科技海外服务器:指的是部署在世界各地的亚马逊数据中心中的服务器设备。这些服务器提供了计算、存储、数据库、网络等各…

基于RK3568的内部定时器应用示例

1. 内部定时器介绍 内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于kernel/linux/timer.h和kernel/timer.c 文件中。 被调度的函数肯定是异步执行的,它类似于一种“软件中断”&am…

HP惠普暗影精灵9P OMEN 17.3英寸游戏本17-cm2000(70W98AV)原装出厂Windows11-22H2系统镜像

链接:https://pan.baidu.com/s/1gJ4ZwWW2orlGYoPk37M-cg?pwd4mvv 提取码:4mvv 惠普暗影9Plus笔记本电脑原厂系统自带所有驱动、出厂主题壁纸、 Office办公软件、惠普电脑管家、OMEN Command Center游戏控制中心等预装程序 所需要工具:3…

麒麟KYLINIOS软件仓库搭建03-软件仓库添加新版本的软件包

原文链接:麒麟KYLINIOS软件仓库搭建03-软件仓库添加新版本的软件包 hello,大家好啊,今天给大家带来麒麟桌面操作系统软件仓库搭建的文章03-软件仓库添加新版本的软件包,本篇文章主要给大家介绍了如何在麒麟桌面操作系统2203-x86版…

基于nginx在视频播放器与服务器之间反向代理流程

1 服务器部署 由于我手里只有内网服务器,可以使用,因此在部署nginx代理服务器,使之在播放器和服务器之间实现反向代理并且缓存内容之前,需要做内网穿透,获得可与外界进行通信的地址。 如果想进行内网穿透,…

C++指针访问数组 函数中用指针传参

用指针访问数组 在函数中用指针传参

【Springboot】Vue3-Springboot引入JWT实现登录校验以及常见的错误解决方案

文章目录 前言一、JWT简单介绍二、token校验设计思路三、使用步骤Springboot部署JWT引入依赖:创建登录实体类后端:LoginController.java路由守卫函数 四、问题 前言 项目版本: 后端: Springboot 2.7、 Mybatis-plus、Maven 3.8.1…

小程序发成绩

在这个数字化快速发展的时代,让学生能够方便快捷地获取自己的成绩已经成为一项基本的需求。那么,如何实现这一目标呢?对于许多老师来说,可能首先想到的是使用各种代码或者Excel来发布成绩查询。今天,我们就来探讨一下这…

【第2章 Node.js基础】2.3 Node.js事件机制

2.3 Node.js事件机制 学习目标 (1)理解Node.js的事件机制; (2)掌握事件的监听与触发的用法。 文章目录 2.3 Node.js事件机制什么是事件机制为什么要有事件机制事件循环事件的监听与触发EventEmitter类常用API 什么是…

深度学习 opencv python 实现中国交通标志识别 计算机竞赛

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 🔥 优质…

使用python批量修改图片名称

一、使用场景 修改模式:原图片名称.png 》 目标图片名称.png条件:目标图片名称 包含 原图片名称准备工作:目标图片名称填写在excel当中,把excel放进图片文件夹内 二、代码示例 import os import pandas as pd import numpy as …

西周就已经开始用WIFI了?带你了解路由器的“前世今生”

说起路由器,如果再往前10年,可能还不是那么普及,但如今再提及,基本上已经是家家户户必备的科技产品之一,无论是老人还是小孩对它也都很熟悉了,这样的变化不禁让人感叹科技的发展之快。 去年的三星堆文物又有…

2011年03月17日 Go生态洞察:探索Go与C的交互——Cgo

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

使用eXplorer本地搭建免费在线文件管理器并实现远程登录——“cpolar内网穿透”

文章目录 1. 前言2. eXtplorer网站搭建2.1 eXtplorer下载和安装2.2 eXtplorer网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1. 前言 通过互联网传输文件,是互联网最重要的应用之一,无论是…

【算法-链表3】删除链表倒数第n个节点 + 链表相交

今天,带来XXX的讲解。文中不足错漏之处望请斧正! 理论基础点这里 删除链表倒数第n个节点 1. 思路 直接计算 倒数第n个 正数第size-n1个 比如要删除size为5的链表的倒数第2个节点。 其实就是正数size-n1个。那么,从第一个走到底size-n1个…

【uniapp uview】u--textarea组件custom validator check failed for prop “confirmType“

加一行&#xff1a;confirmType"done"即可。<UTextarea> at node_modules/uview-ui/components/u-textarea/u-textarea.vue<UTextarea> at node_modules/uview-ui/components/u--textarea/u--textarea.vueat pages/notice/noticeDetail.vueuview 文档地址…

73.矩阵置零

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&#xff1a; 输入&…

每天一点python——day65

#每天一点Python——65 #字符串的内容对齐操作类似于word中左对齐、右对齐、居中对齐如图 #例&#xff1a; s1hello,python print(s1.center(20,*))#设置宽度20&#xff0c;填充图是*s1有12个字符&#xff0c;这个字符串的宽度设置为20&#xff0c; 20-128 因为center是居中对齐…

概念解析 | 雷达协同认知成像:原理、研究现状与挑战

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:雷达协同认知成像。 概念解析 | 雷达协同认知成像:原理、研究现状与挑战 摘要: 雷达协同认知成像,作为一种先进的感知技术,在军事侦察、民用航空、无人驾驶等领域具有广…

GZ038 物联网应用开发赛题第2套

2023年全国职业院校技能大赛 高职组 物联网应用开发 任 务 书 (第2套卷) 工位号:______________ 第一部分 竞赛须知 一、竞赛要求 1、正确使用工具,操作安全规范; 2、竞赛过程中如有异议,可向现场考评人员反映,不得扰乱赛场秩序; 3、遵守赛场纪律,尊重考评人员,…