(保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示

news2024/11/17 23:59:47

讲解 MySQL 中索引、触发器、存储过程、存储函数的使用

文章目录

      • 1. 索引
        • 1.1 索引的分类
        • 1.2 索引的设计原则
        • 1.3 如何使用(create index)
      • 2. 触发器
        • 2.1 触发器的分类
        • 2.2 如何使用(create trigger)
      • 3. 存储过程
        • 3.1 如何使用(create procedure)
          • 3.1.1 存储过程主体
      • 4. 存储函数
        • 4.1 与存储过程的区别
        • 4.2 如何使用(create function)

1. 索引

  • 索引是一种特殊的数据结构。(就像书的目录一样)

  • 索引是提高数据库性能的重要方式,所有字段都可以添加索引。

    给某个字段添加索引,就相当于给这个字段添加目录,下次再通过这个字段查的时候,就会直接找到该位置,而不是从头开始查。

  • 使用索引,可以快速查询表中的记录。但索引会占用内存空间

1.1 索引的分类

1、普通索引:不需要任何限制条件的索引,可在任意数据类型上创建

2、唯一索引:添加索引的字段,该字段的值必须唯一,比如:主键索引

3、全文索引:针对文本类型。只能创建在 char、varchar、text 数据类型的字段上

实际应用: 查询数据量较大的字符串类型的字段时,使用全文索引可以提高速度。但 InnoDB (mysql默认的数据存储引擎)不支持全文索引

4、单列索引:只对应一个字段的索引

5、多列索引:在一张表的多个字段上创建一个索引

注意: 多列索引,查询时只需要使用第一个字段即可触发索引。

6、空间索引:只能建立在空间数据类型上(比如:GIS(地理信息系统),因为地理信息的数据就是空间数据,描述的是空间位置,如经纬度)

注意: InnoDB 不支持空间索引

主键自带索引,其它字段可以手动添加索引(但一般不会添加)

1.2 索引的设计原则

1、添加索引时,是出现在 where 语句中的字段,不是 select 后面要查询的字段。

select name from user where id=1; -- 给id添加,而不是给name

2、添加索引的字段,这一列的值尽量唯一,效率更高(因为本身就是通过这个值查询的,而现在有多个,还需要判断是哪个)

3、不要添加过多的索引,因为索引占用内存空间,没有用的索引也占用,所以维护成本高。

通常情况下,就用主键自带的索引

1.3 如何使用(create index)
-- 1. 添加索引:索引名可自定义,一般为:idx_添加索引的字段名
-- 方式一:
alter table 表名 add index 索引名(字段名);
-- 方式二(推荐):
create index 索引名 on 表名(字段名);

-- 2. 删除索引
-- 方式一:
alter table 表名 drop index 索引名;
-- 方式二(推荐):
drop index 索引名 on 表名;

2. 触发器

1、触发器中定义了一系列操作,在对指定的表进行 插入、更新或删除 (没有查询)的同时自动执行这些操作。触发器是不需要调用的

2、为什么有这个机制?

举个例子:因为有些时候对一个表的操作,不仅仅是单表,还有跟它关联的其它表,比如:删除一个班级的时候,你在班级表中把对应的班级删除了,但是学生你也应该进行相应的操作,因为班级都没有了,这个学生对应的班级也就没有了。所以触发器中就可以定义这些操作。

3、触发器的优点:

  • 开发更快。因为触发器是存储在数据库中的,在应用程序中不用每次都编写触发器中的操作。

    比如:不需要每次删一个班级,你就要编写对学生操作的 SQL

  • 更容易维护。定义触发器后,访问目标表会自动调用触发器。

    比如:假如关联的不是学生了,是教师,怎么办?那只需要修改触发器中的内容即可

  • 业务的全局实现。如果修改业务代码,只需要修改触发器。

    就是不需要改 Java 程序中的代码,只需要修改触发器即可

2.1 触发器的分类
  • 前置触发器:更新或插入 操作之前执行,关键字为:before
  • 后置触发器:更新、插入或删除 后执行,关键字为:after
  • before delete 触发器:删除之前 执行,关键字为:before delete
  • insted of 触发器: 对复杂的视图执行 插入、更新、删除时执行,关键字为:insted of
2.2 如何使用(create trigger)

1、创建

create trigger 触发器名(可自定义:一般为t_触发器类型操作名称_on_哪个表)
触发时刻 什么操作 on 哪个表上制定触发器 for each row 
触发器需要执行的操作

触发器需要执行的操作:如果要执行多个语句,可使用:begin 语句 end

提示:触发器需要执行的操作,这一部分肯定包含多个语句,每个语句都是以分号结尾,这时服务器处理程序的时候遇到第一个分号就会认为程序结束,这肯定不行。所以使用 delimiter 结束符号(比如:$$) 命令讲 MySQL 中的结束标志修改为其它符号。最后使用 opdelimiter ; 或者 delimiter ; 恢复即可。比如:

delimiter $$
create trigger t_afterInsert_on_tab1 
after insert on tab1 for each row
begin
	insert into tab2(name,age) values(new.name,new.age);
end$$
delimiter;

假如运行不报错,结果也符合预期,一般不需要设置。

例1: 给 tab1 表添加一条数据后,然后 tab2 表自动添加这个数据:

create trigger t_afterInsert_on_tab1 
after insert on tab1 for each row
begin
	insert into tab2(name,age) values(new.name,new.age);
end;

这样执行 insert into tab1(name,age) values('abc',23); 后,tab2 表中也有数据了。

注意:

new.字段名 用来引用新行的一列,old.字段名 用来引用更新或删除它之前的已有行的一列。

② 对于 insert,只有 new 是合法的,对于 delete,只有 old 是合法的,对于 update,new、old

都合法。

例2: 删除 tab1 表的后,然后 tab2 表也删除:

create trigger t_afterDelete_on_tabl
after delete on tab1 for each row 
begin
	delete from tab2 where tab2.id = old.id;
end;

这样执行 delete from tab1 where id=2; 后,tab2 表中对应 id=2 的数据也删除了。

2、删除触发器:drop trigger 触发器名;

3. 存储过程

在实际开发中用的比较多的一种方式

1、存储过程是一组为了完成特定功能的 SQL 的集合。经过编译后存储在数据库中,用户可以通过存储过程的名称调用(可传参)。

跟触发器有点像,但是触发器需要有一张目标表。存储过程跟 java 中的方法一样,可以根据需要调用。

2、一次编写,多次调用,避免重复编写相同的SQL,存储过程和函数(函数:跟存储过程类似)都是在数据库执行的,可以减少 java 程序和数据库之间的数据传输,提高效率。

在这里插入图片描述

3、存储过程的优点:

  • 模块化程序设计。把一些语句组装在一起。
  • 执行速度更快。如果某个操作需要执行大量的 SQL,存储过程比直接执行 SQL 效率更高(假如 SQL 重复,对于重复的 SQL,存储过程优势更为明显)
  • 更好的安全机制。对于没有权限存储过程的用户,可以通过授权的方式执行存储过程。
3.1 如何使用(create procedure)

1、创建

create procedure 存储过程名([参数,...])
存储过程主体

参数: 不加参数时,存储过程后面的括号不可省略。三部分组成:[in|out|inout] 参数名 参数类型

  • in 输入参数。可以使数据传递给一个存储过程

  • out 输出参数。当需要返回一个答案或结果的时候,存储过程使用输出参数

3.1.1 存储过程主体

存储过程主体: 指在调用存储过程的时候必须执行的语句。如果要执行多个语句,可使用:begin 语句 end

注意:存储过程主体中也有可能包含多个 SQL 语句。同理:只要运行不报错,结果也符合预期,一般不需要修改结束标志。

下面的内容只能使用在存储过程体中:

声明局部变量

在存储过程中可以声明局部变量,用来存储临时结果。语法:declare 变量名,... 变量类型 [default 默认值] ,比如:declare num int default 5; 或者 declare num int; 或者 declare str1,str2 varchar(10);

  1. 局部变量只能在 begin ... end语句中使用,而且必须在存储过程的开头。

  2. 给局部变量赋值:

    set 变量名=表达式;
    
    -- 多个
    set 变量名=表达式, 变量名=表达式,...;
    

② select into 语句

把选定的列值直接存储到变量中。如:select 姓名,专业名 into name,project

例子: 总计数据总数后并返回

create procedure countNum(out num int)
begin 
	select count(*) into num from tab1;
end;

-- 问题1:怎么调?
call countNum(@num1);
-- 其中 @num1 就是定义一个变量来接收返回的结果,@用来定义用户变量

-- 问题2:怎么查看结果?
select @num1;

③ 流程控制语句

  1. if 语句

    if 条件 then 语句
    [elseif 条件 then 语句]
    ....
    [else 语句]
    end if;
    

    例子: 根据传进来的值,选择判断后,存入表格

    create procedure addData(in target int)
    begin 
    	declare addName varchar(10);
    	-- 赋值
    	if target=1 then set addName="java";
    	elseif target=2 then set addName="sql";
    	else set addName="数据库";
    	end if;
    	-- 插入
    	insert into tab1(name) values(addName);
    end;
    

  2. case 语句。与之前的分支查询稍微不同

    case 要判断的值或表达式
    	when 与判断的值做比较的值 then 语句
    	[when 与判断的值做比较的值 then 语句]
    	[else 语句]
    end case;
    
    -- 或者(推荐)
    case
    	when 条件 then 语句
    	...
    	[else 语句]
    end case;
    
  3. 循环语句。MySQL 支持 3 中循环:while、repeat、loop。循环开始标识 和 循环结束标识 要有都有,要没有都没有,且自定义的名字要一样。

    [循环开始标识:]
    while 条件 do
    	语句
    end while [循环结束标识];
    
    =============
    [循环开始标识:]
    repeat
    	语句
    	until 条件
    end repeat [循环结束标识];
    
    =============
    [循环开始标识:]
    loop
    	语句
    end loop [循环结束标识];
    

    问题:怎么跳出循环?----> leave(类似 break)、iterate(类似 continue)比如:

    create procedure doloop()
    begin 
    	set @a=10;   -- @a就是用户变量(前面有@标识)
    	label:
    	loop
    		set @a=@a-1;
    		if @a<0 then leave label; -- 满足条件后跳出循环
    		end if;
    	end loop label; -- 要有都有
    end;
    

2、调用存储过程:call 存储过程名([参数]);

3、删除存储过程:drop procedure 存储过程名;

4. 存储函数

存储函数与存储过程非常相似

4.1 与存储过程的区别
  • 存储函数不能有输出参数,参数只能为 in(可以省略,所以存储函数的参数只有名称和类型)。
  • 不能用 call 语句来调用存储函数。而是 select 语句。
  • 存储函数必须包含一条 return 语句(也就是函数必须有返回值),而存储过程不允许包含
4.2 如何使用(create function)

1、创建

create function 存储函数名([参数,...])
	returns type
	存储函数主体

其中:returns type 声明函数返回值的数据类型,比如:

-- 通过id查询名字并返回
create function name_student(student_id int)
returns int
begin
	return(select name from tab1 where id=student_id);
end;

begin 里面的 return 就是需要返回的东西,所以将内容放到 () 里面。也可以直接 return ,比如:return true; 或者 return '123';

2、调用:select 存储函数名([参数]);

3、删除:drop function 存储函数名;

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

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

相关文章

2023.11.23使用flask实现在指定路径生成文件夹操作

2023.11.23使用flask实现在指定路径生成文件夹操作 程序比较简单&#xff0c;实现功能&#xff1a; 1、前端输入文件夹 2、后端在指定路径生成文件夹 3、前端反馈文件夹生成状态 main.py from flask import Flask, request, render_template import osapp Flask(__name__)a…

c语言十进制转二进制

以下是一个将十进制数转换为二进制数的C语言代码示例&#xff1a; #include <stdio.h>void decimal_to_binary(int decimal) { int binary[32]; int i 0; while (decimal > 0) { binary[i] decimal % 2; decimal / 2; i; } pr…

使用Pytorch从零开始构建GRU

门控循环单元 (GRU) 是 LSTM 的更新版本。让我们揭开这个网络的面纱并探索这两个兄弟姐妹之间的差异。 您听说过 GRU 吗&#xff1f;门控循环单元&#xff08;GRU&#xff09;是更流行的长短期记忆&#xff08;LSTM&#xff09;网络的弟弟&#xff0c;也是循环神经网络&#x…

HCIP-七、IS-IS 综合实验

七、IS-IS 综合实验 实验拓扑实验需求及解法1.如图所示&#xff0c;配置所有路由器的接口IP地址。2.运行IS-IS&#xff0c;进程号13.IS-IS优化4.路径优化 实验拓扑 实验需求及解法 本实验模拟IS-IS综合网络&#xff0c;完成以下需求&#xff1a; 1.如图所示&#xff0c;配置所…

Python模块之yaml:简化配置与数据解析

更多Python学习内容&#xff1a;ipengtao.com YAML&#xff08;YAML Aint Markup Language&#xff09;是一种人类可读的数据序列化格式&#xff0c;常用于配置文件和数据传输。在Python中&#xff0c;可以使用PyYAML模块来处理YAML格式的数据。本文将深入介绍PyYAML的基础用法…

C++学习之路(二)C++如何实现一个超简单的学生信息管理系统?C++示例和小项目实例

这个示例实现了一个简单的学生信息管理系统。它包括了学生类的定义&#xff0c;可以添加学生信息、显示所有学生信息&#xff0c;将学生信息保存到文件并从文件加载信息。通过这个示例&#xff0c;你可以了解到如何使用类、函数和文件操作来构建一个基本的信息管理系统。 一个简…

基于springboot实现大学生就业服务平台系统项目【项目源码】计算机毕业设计

基于springboot实现大学生就业服务平台系统演示 Java技术 Java是由SUN公司推出&#xff0c;该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称&#xff0c;也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具备了显著…

OSG编程指南<九>:坐标系统及坐标系变换

1、坐标系统 坐标系是一个精确定位对象位置的框架&#xff0c;所有的图形变换都是基于一定的坐标系进行的。对于从事计算机图形学的研究者&#xff0c;掌握图形变换是不可或缺的&#xff0c;因此&#xff0c;理解坐标系非常重要。一个三维图形工作者可以认为自己站在一定的坐标…

【初始前后端交互+原生Ajax+Fetch+axios+同源策略+解决跨域】

初始前后端交互原生AjaxFetchaxios同源策略解决跨域 1 初识前后端交互2 原生Ajax2.1 Ajax基础2.2 Ajax案例2.3 ajax请求方式 3 Fetch3.1 fetch基础3.2 fetch案例 4 axios4.1 axios基础4.2 axios使用4.2.1 axios拦截器4.2.2 axios中断器 5 同源策略6 解决跨域6.1 jsonp6.2 其他技…

【每日一题】2824. 统计和小于目标的下标对数目-2023.11.24

题目&#xff1a; 2824. 统计和小于目标的下标对数目 给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 target &#xff0c;请你返回满足 0 < i < j < n 且 nums[i] nums[j] < target 的下标对 (i, j) 的数目。 示例 1&#xff1a; 输入&#xff1…

Digicert通配符证书:满足你的所有需求

通配符证书是一种可以保护一个主域名及其所有子域名的SSL证书。这意味着&#xff0c;如果你有一个主域名&#xff0c;比如www.example.com&#xff0c;并且你有多个子域名&#xff0c;比如blog.example.com、store.example.com等&#xff0c;那么只需要一个通配符证书&#xff…

ubuntu22.04系统下载程序和依赖,并拷贝到指定路径下

脚本1 apt install aptitude apt-get -d install xxx #xxx是待下载的安装包 mv /var/cache/apt/archives/* /home/tuners/1apt install aptitude apt-get -d install xxx mv /var/cache/apt/archives/*.deb /home/tuners/1 xxx 为程序包名称 /home/tuners/1为保存程序包的…

阿里云windwos 安装oracle数据库,外部用工具连接不上,只能在服务器本机通过127.0.0.1 连接

1. 首先检查阿里云服务器安全组端口是否开放 oracle 数据库端口 2. 其次找到oracle 安装的目录&#xff0c;打开这俩个文件&#xff0c;将localhost 修改为 服务器本机名称 3.重启oracle 监听服务&#xff0c;就可以连接了

IBM SPSS Statistics 27 Mac(统计分析软件)

IBM SPSS Statistics是一款数据分析和统计建模软件&#xff0c;它专为研究人员、分析师和商业用户设计。该软件能够帮助用户对大量数据进行分析和预测&#xff0c;帮助用户制定决策和解决问题。 IBM SPSS Statistics提供了丰富的统计分析功能&#xff0c;包括描述性统计、相关性…

【鸿蒙应用ArkTS开发系列】- 云开发入门实战二 实现省市地区三级联动地址选择器组件(下)

文章目录 概述端云调用流程端侧集成AGC SDK端侧省市地区联动的地址选择器组件开发创建省市数据模型创建省市地区视图UI子组件创建页面UI视图Page文件 打包测试总结 概述 我们在前面的课程&#xff0c;对云开发的入门做了介绍&#xff0c;以及使用一个省市地区联动的地址选择器…

IDM(Internet Download Manager)PC版提升下载速度与效率的利器

你是否曾经因为下载速度慢而感到烦恼&#xff1f;或者在下载大型文件时&#xff0c;经历了长时间的等待&#xff1f;如果你有这样的困扰&#xff0c;那么IDM&#xff08;Internet Download Manager&#xff09;就是你的救星&#xff01; IDM是一款高效、实用的下载管理器&…

PS 计数工具 基础使用方式讲解

上文PS 注释工具 基础使用方法讲解 中 我们讲了注释工具 解析来 我们来看这个计数工具 这里 我们换一张图像 如果 我要你数清楚 这个图上有几个咖啡豆 你能数清楚吗&#xff1f; 哈哈 其实也不难 不是特别大 但是 例如很多 且无规则物品时 我们可能就会数乱 左上角属性的话 我…

vue2【组件的构成】

目录 1&#xff1a;什么是组件化开发 2&#xff1a;vue中的组件化开发 3&#xff1a;vue组件的三个组成部分 4&#xff1a;组件中定义方法&#xff0c;监听器&#xff0c;过滤器&#xff0c;计算属性节点。 5&#xff1a;template中只允许唯一根节点&#xff0c;style默认…

arp报文及使用go实现

一、ARP协议报文格式及ARP表 ARP&#xff08;Address Resolution Protocal&#xff0c;地址解析协议&#xff09;是将IP地址解析为以太网的MAC地址&#xff08;或者称为物理地址&#xff09;的协议。在局域网中&#xff0c;当主机或其他网络设备有数据要发送给另一个主机或设备…

【2023年APMCM亚太杯C题】完整数据与解题思路

2023年亚太杯C题 数据下载与搜集重点数据其余数据第一问第二问第三问第四问第五问第六问 数据与思路获取 数据下载与搜集 该题并没有提供数据集&#xff0c;对所需数据进行收集整理是对题目进行求解的基础。在本题中&#xff0c;主要需要以下数据&#xff1a;新能源汽车历史销…