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

自定义函数

语法

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"

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt插件开发_入门教程

文章目录 前言插件的好处具体流程1. 第一,我们先创建一个主框架应用(**第一个工程**)2. GUI 设计 ![在这里插入图片描述](https://img-blog.csdnimg.cn/f215270ccfac4e038e7261c4b4891ec1.png)3. 创建动态库项目(**第2个工程**)4. 给插件项目添加qt界面类5.在插件工程添加一个头…

Unix环境高级编程-学习-02-进程环境之进程终止、命令行参数、环境表、C程序的存储空间布局

目录 一、环境信息 二、声明 三、进程终止 1、情况分类 2、退出函数 3、退出实验 (1)main声明int和调用return值 (2)main声明int和不调用return (3)main声明不int和不调用return 4、atexit 5、at…

SpringBoot加载测试类属性和配置说明

一、项目准备 1.创建项目 2.配置yml文件 test:name: FOREVERlove: sing二、测试类属性 1.Value 说明:读取yml中的数据。 package com.forever;import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Value; import org.spr…

Linux中固定ip端口和修改ip地址

一,更改虚拟网络编辑器 1,首先启动VMware,选择自己要更改ip或固定ip的虚拟机,并找到虚拟网络配编辑器,点击进入 2,进入之后需要点击右下角获取管理员权限后才能修改,有管理员权限之后图片如下 …

TSINGSEE青犀车辆违停AI算法在园区道路管控场景中的应用方案

一、背景与需求 园区作为企业办公、生产制造的重要场所,主要道路车辆违停等违规行为会对园区的安全造成隐患,并且在上下班高峰期内,由于发现不及时,车辆违停行为会造成出入口拥堵现象,这也成为园区管理的棘手问题。 …

C++入门(二)

前言 我们上一期介绍了什么是C,命名空间、输入输出、以及缺省参数。本期我们来继续介绍C的入门知识! 本期内容介绍 函数重载 引用 内联函数 auto关键字 范围for 指针空值nullptr 目录 前言 本期内容介绍 一、函数重载 什么是函数重载? …

Apple :苹果将在明年年底推出自己的 AI,预计将随 iOS 18 一起推出

本心、输入输出、结果 文章目录 Apple :苹果将在明年年底推出自己的 AI,预计将随 iOS 18 一起推出前言三星声称库克相关图片弘扬爱国精神 Apple :苹果将在明年年底推出自己的 AI,预计将随 iOS 18 一起推出 编辑:简简单…

Java关于由子类构造器生成的父类对象的反射问题

Java关于由子类构造器生成的父类对象的反射问题 问题概括一、案例准备二、问题描述 问题概括 提示:这里我就不绕圈子直接描述: Java中由子类构造器生成的父类的getclass.getName不是父类的类名而是子类的类名,因此不可以用子类构造器生成的…

2023年【安全员-B证】新版试题及安全员-B证免费试题

题库来源:安全生产模拟考试一点通公众号小程序 安全员-B证新版试题参考答案及安全员-B证考试试题解析是安全生产模拟考试一点通题库老师及安全员-B证操作证已考过的学员汇总,相对有效帮助安全员-B证免费试题学员顺利通过考试。 1、【多选题】下列哪些属…

HTML表格学习

HTML学习笔记二 HTML表格: HTML 表格由 标签来定义。 HTML 表格是一种用于展示结构化数据的标记语言元素。 tr:表示表格的一行。td:表示表格的数据单元格。th:表示表格的表头单元格。 数据单元格可以包含文本、图片、列表、段…

Scala爬虫实战:采集网易云音乐热门歌单数据

导言 网易云音乐是一个备受欢迎的音乐平台,汇集了丰富的音乐资源和热门歌单。这些歌单涵盖了各种音乐风格和主题,为音乐爱好者提供了一个探索和分享音乐的平台。然而,有时我们可能需要从网易云音乐上获取歌单数据,以进行音乐推荐…

8086读取键盘-磁盘输入

文章目录 前言1.从键盘读数据2.磁盘读数据 前言 想过一个问题没有, 8086是如何从键盘中接受输入的? 8086如何将字符在显示器上显示的? 8086如何从磁盘中读取数据的? 上面的问题都是没有操作系统的时候,比如bios的那段…

Hive 知识点八股文记录 ——(一)特性

Hive通俗的特性 结构化数据文件变为数据库表sql查询功能sql语句转化为MR运行建立在hadoop的数据仓库基础架构使用hadoop的HDFS存储文件实时性较差(应用于海量数据)存储、计算能力容易拓展(源于Hadoop) 支持这些特性的架构 CLI&…

python解析xmind统计测试用例/测试点 个数及执行情况

前言:统计的是每个分支最后一个节点的状态 xmind版本 23.0911172 标记打开位置 标记规则如下 解释: res {"total": 0, "pass": 0, "fail": 0, "no_result": 0, "unfinished": 0, "now_fail…

SUSE 12双网卡绑定

原创作者:运维工程师 谢晋 SUSE 12双网卡绑定 客户环境及需求网卡绑定 客户环境及需求 客户一台物理机安装了SUSE 12的操作系统,需要将ETH5和ETH7双网卡聚合为一块虚拟网卡,以保证一块网卡故障不会影响系统正常运行。 网卡绑定 输入命令c…

C++冒号的作用域

当同时定义了一个全局变量a和局部变量a: 结果输出了局部变量的10,因为程序遵循就近原则。 :: 代表全局作用域 如果想无视就近原则,打印全局变量的a,就在输出时把a的前面加两个冒号。 ::

机器视觉目标检测 - opencv 深度学习 计算机竞赛

文章目录 0 前言2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 0 前言 &#x1f5…

推荐能用ios端磁力下载工具

关于ios端磁力下载工具,之前的文章给大家介绍过2个,分别是雷电下载和闪电下载。但是如今因为不可抗力和苹果商店对于磁力下载和云盘功能的限制,目前这两款工具已经不能够使用了。也就是说免费的下载工具已经没有了,毕竟实现ios端这…

Ubuntu 20.04源码安装git 2.35.1

《如何在 Ubuntu 20.04 上从源代码安装 Git [快速入门]》和《如何在 Ubuntu 20.04 上安装 Git》是我参考的博客。 https://git-scm.com/是git官网。 lsb_release -r看到操作系统版本是20.04。 uname -r看到内核版本是5.4.0-156-generic。 sudo apt update更新一下源。 完…

STM32G0+EMW3080+阿里云飞燕平台实现单片机WiFi智能联网功能(三)STM32G0控制EMW3080实现IoT功能

项目描述:该系列记录了STM32G0EMW3080实现单片机智能联网功能项目的从零开始一步步的实现过程;硬件环境:单片机为STM32G030C8T6;物联网模块为EMW3080V2-P;网联网模块的开发板为MXKit开发套件,具体型号为XCH…