MySQL中引入存储引擎意义是_mysql学习九:存储引擎、存储过程和函数的引入

存储引擎:

存储引擎是mysql特有的,共有7种,常用的有myisam、memory、innodb

查看表的存储引擎:

show create table 表名;

修改表的存储引擎:

alter table 表名 engine=存储引擎名称;

1.myisam存储引擎:可转换为压缩只读表来节省空间

使用三个文件表示每个表:

格式文件--存储表的结构  表名.frm

数据文件---存储表的数据  表名.MYD

索引文件--存储表的索引 表名.MYI

2.innodb存储引擎的特征:

每个innodb表,在数据库目录中以.frm格式文件表示

innodb表空间tablespace被用于存储表的内容

提供一组用来记录事务性活动的日志文件

用commit提交、savepoint 及rollback(回滚)支持事务处理

提供全部acid兼容

在mysql服务器崩溃后,提供自动恢复

多版本mvcc和行级锁

支持外键,及引用的完整性,包括级联更新和删除

3.memory存储引擎,以前被称为headp引擎

使用memory存储引擎的表,因为数据存储在内存中,且行的长度固定,所以使得memory存储引擎非常快

memory存储引擎管理的表具有下列特征

在数据库目录内,每个表均以.frm格式文件表示

表数据及索引被存储在内存中

表级锁机制

字段属性不能包含text或blob字段

选择合适的存储引擎:

myisam表最适合于大量的数据读而少量数据更新的混合操作。myisam表的另一种适用情形是使用压缩的只读表。

如果查询中包含较的数据更新操作,应使用innodb。其行级锁机制和多版本的支持为数据读取和更新的混合提供了良好的并发机制。

使用memory存储引擎存储非永久需要的数据,或者是能够从基于磁盘的表中重新生成的数据。

存储过程和函数,是在数据库中定义一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的sql语句。

存储过程和函数,可以避免开发人员重复的编写相同的sql语句;而且,存储过程和函数是在mysql服务器中存储和执行的,可以减少客户端和服务端的数据传输;

一、创建存储过程和存储函数

1.创建存储过程

create procedure 存储过程的名称 ([proc_parameter[,......]]) [characteristic......] routine_body

proc_parameter:表示存储过程的参数列表;由3分部分组成,输入输出类型、参数名和参数类型---[in | out | inout] param_name type

其中,in表示输入参数;out表示输出参数;inout表示既可以是输入,也可以是输出

param_name,是存储过程的参数的名称

type:指定存储过程的参数类型,该类型可以是mysql数据库的任意数据类型

characteristic:指定存储过程的特性、配置;有多个可取值

language sql:说明 routine_body部分是由sql语言的语句组成,这也是数据库系统默认的语言

[not] deterministic:指明存储过程的执行结果是否是确定的。deterministic表明每次执行存储过程时,相同的输入会得到相同的输出。not deterministic表示结果是非确定的,相同的输入可能得到不同的输出。默认情况下,结果是非确定的。

{contains sql | no sql | reads sql data | modifies sql data }:指明子程序使用sql语句的限制

contains sql表示子程序包含sql语句;

no sql表示子程序中不包含sql语句

reads sql data表示子程序中包含读数据的语句

modifies sql data表示子程序中包含写数据的语句

默认情况下,系统会指定为contains sql

sql security {definer |invoker}:指明谁有权限来执行。definer表示只有定义者自己才能够执行;invoker表示调用者可以执行。默认情况下,系统指定的权限是definer。

comment "string":注释信息

routine_boy:是sql代码的内容,可以用begin......end来标志sql代码的开始和结束。如果bign,end中有多条语句,则要在begin,end的前后再加上delimiter |......| delimiter

delimiter &&

CREATE PROCEDURE pro_book ( IN bt INT, OUT count_num INT) READS SQL DATABEGIN

SELECT COUNT(*) FROM book WHERE bookTypeId=bt;END &&delimiter;

调用存储过程:1,是输入的参数;@total是输出的参数;@表示定义的是全局参数

call pro_book(1, @total);

32bfd098824e6ebd7d25cb6e04ec7b83.png

2.创建存储函数

create function 存储函数的名称 ([func_parameter[,......]])

returns type [characteristic....] routine_body;

func_parameter:存储函数的参数列表。可以由多个参数组成,每个参数由参数名称和参数类型组成,形式如下:

param_name type:其中,param_name参数是存储函数的参数名称;type参数是指定存储函数的参数类型,该类型可以是mysql数据库的任意数据类型

returns type:指定返回值的类型

characteristic:指定存储过程的特性,该参数的取值与存储过程中的聚会是一样的

routine_body:是sql的代码内容,可以用begin....end来标志sql代码的开始和结束

delimiter &&

CREATE FUNCTION func_book ( bookId INT ) RETURNS VARCHAR ( 20)BEGIN

RETURN ( SELECT bookName FROM book WHERE id =bookId );END &&delimiter;

调用存储函数:

select func_book(1);select func_book(2);

2f50f0b23d86f397ab6397aa3ce80a88.png

61cf1ab851c193f92b3a8c849f43e704.png

3.变量的使用

1.)定义变量

declare 变量名称[,...] type [default value]

创建示例表:

create table test_user(id int not null auto_increment primary key,

userNamevarchar(20),

passwordvarchar(64)

)

创建存储过程,定义变量:

delimiter &&

CREATE PROCEDURE pro_user ( ) BEGIN

DECLARE a,b VARCHAR ( 20);INSERT INTO test_user values(null, a, b );END &&delimiter;

调用存储过程:

call pro_user();

调用存储过程的结果:

d3b0aa8a84b800519a79e657429ee262.png

2).为变量赋值

set 变量名=expr[, 变量名=expr].........

创建存储过程,定义变量,给变量赋值:

delimiter &&

CREATE PROCEDUREpro_user2 ( )BEGIN

DECLARE a,b VARCHAR ( 20);set a='java123',b='1234235';INSERT INTO test_user values(null, a, b );END &&delimiter;

调用存储过程:

call pro_user2;

f2ecfca13ef26807fea536a5af090991.png

另一种赋值方式: select ..... into 变量名

delimiter &&

CREATE PROCEDUREpro_user3 ( )BEGIN

DECLARE a,b VARCHAR ( 20);SELECT userName, password INTO a,b FROM test_user where id=1;INSERT INTO test_user values(null, a, b );END &&delimiter;

call pro_user3;

2c0193e7ce17deea45eb33c18124c7b0.png

4.游标的使用

查询语句可能查询出多条记录,在存储过程和存储函数中使用游标来逐条读取查询结果集中的记录。

游标的使用,包括声明游标、打开游标、使用游标和关闭游标。

游标必须声明在处理程序之前,并且声明在变量和条件之后。

1).声明游标:

declare 游标名称 cursor for select查询语句;

2).打开游标

open 游标名称;

3).使用游标

fetch 游标名称 into 变量名称[,变量名称......]

创建存储过程,定义变量,定义打开使用关闭游标:使用游标查询的结果,赋值给变量

delimiter &&

CREATE PROCEDUREpro_user4 ( )BEGIN

DECLARE a,b VARCHAR ( 20);DECLARE cur_test_user CURSOR FOR SELECT userName,password FROM test_user where id=2;OPENcur_test_user;FETCH cur_test_user INTOa, b;INSERT INTO test_user values(null, a, b );CLOSEcur_test_user;END &&delimiter;

调用存储过程:

call pro_user4;

16f79429379da7a079a65a80b3331c60.png

5.流程的控制

存储过程和存储函数中,可以使用流程控制来控制语句的执行。

mysql中,可以使用if、case、loop、leave、iterate、repeat、while语句来控制流程

1).IF语句

IF search_condition THENstatement_list[ELSEIF search_condition THEN statement_list]........[ELSE statement_list]

END IF

示例:

delimiter &&

CREATE PROCEDURE pro_user5 (in id int)BEGIN

SELECT count(*) INTO @numm from user1 WHERE id=id;IF @num > 0 THEN UPDATE user1 SET userName='java12345' WHERE id=id;ELSE

INSERT INTO user1 VALUES(null, 'java12345', '123123');END IF;END &&delimiter;

call pro_user5(5);

c46e18c356fb62c993529dac39c68ab2.png

call pro_user5(5);

2).CASE语句

CASEcase_valueWHEN when_value THENstatement_list[WHEN when_value THEN statement_list]......[ELSE statement_list]

END CASE

示例:

delimiter &&

CREATE PROCEDURE pro_user6 (in id int)BEGIN

SELECT count(*) INTO @numm from user1 WHERE id=id;CASE @num

WHEN 1 THEN UPDATE user1 SET userName='python123' where id=id;WHEN 2 THEN INSERT INTO user1 VALUES(null,'python123', '123456');ELSE INSERT INTO user1 VALUES(null, 'JS123', '1111111');END CASE;END &&delimiter;

call pro_user6(5);

5f35176fd4724944166f3026d973dfb4.png

3).LOOP、LEAVE语句

LOOP语句可以使某些特定的语句重复执行,实现一个简单的循环。

但是LOOP语句本身没有停止循环的语句,必须遇到LEAVE语句等,才会停止。

[begin_label:]LOOP

statement_listEND LOOP [end_label]

示例:

delimiter &&

CREATE PROCEDURE pro_user7 (in totalNum int)BEGINaaaLable:LOOPIF totalNum=0 THENLEAVE aaaLable;ELSE INSERT INTO user1 VALUES (totalNum, '123', '123');END IF;SET totalNum=totalNum-1;ENDLOOP aaaLable;END &&delimiter;

call pro_user7(10);

beb0ce8ab191868ec7eaf56703054525.png

4.ITERATE语句:也是用来跳出循环。但是,ITERATE语句是跳出本次循环,然后直接进入下一次循环。相当于,continue

ITERATE label;

delimiter &&

CREATE PROCEDURE pro_user8 (in totalNum int)BEGINaaaLable:LOOPSET totalNum=totalNum-1;IF totalNum=0 THENLEAVE aaaLable;

ELSEIF totalNum=3 THENITERATE aaaLable;END IF;INSERT INTO user1 VALUES (totalNum, '123456', '123456');ENDLOOP aaaLable;END &&delimiter;

call pro_user8(11);

50c3a892432c629f351a4aaa47efee66.png

5.REPEAT语句:是有条件控制的循环语句。当满足特定条件时,就会跳出循环语句。

[label:]REPEAT

statement_list

UNTIL search_conditionEND REPEAT [label]

delimiter &&

CREATE PROCEDURE pro_user9 (in totalNum int)BEGINaaaLable:REAPEATSET totalNum=totalNum-1;INSERT INTO user1 VALUES (totalNum, '111', '111');

UNTIL totalNum=1;ENDREPEAT aaaLable;END &&delimiter;

6.WHILE语句

[label:] WHILEsearch_condition DO

statement_list

END WHILE [label]

示例:

delimiter &&

CREATE PROCEDURE pro_user10 (in totalNum int)BEGIN

WHILE totalNum > 0DOINSERT INTO user1 VALUES (totalNum, '111', '111');SET totalNum=totalNum-1;END WHILE;END &&delimiter;

call pro_user10(10);

ca4027511318683a622c97f4101c8560.png

二、调用存储过程和函数

1.调用存储过程

call 存储过程的名称([parameter[,........]);

2.调用存储函数

call 存储函数的名称([parameter[,........]);

三、查看存储过程和函数

1 show status:查看存储过程和函数的状态

show {procedure|function} status [like 'pattern'];

2.show create:查看存储过程的函数的定义

show create {procedure|function} 存储函数的名称;

3.从information_schema.Routins表中,查看存储过程和函数的信息

92f4fa8507113dcc3fcb6717beff1339.png

四、修改存储过程和函数

alter {procedure|function} 名称 [characteristic.......]

characteristic:

contains sql | no sql | reads sql data | modifies sql data

| sql security {definer | invoker}

|comment 'string'

contains sql:表示子程序包含sql读或写语句,默认值

no sql:表示子程序中不包含sql语句

reads sql data:表示子程序中包含读数据的语句

modifies sql data:表示子特别子程序中包含写数据的语句

sql security {definer | invoker}:指明谁有权限执行

definer---表示只有定义者自己才能够执行;invoker--表示调用者可以执行

comment 'string':注释信息

alter procedure pro_book comment '测试....';

删除存储过程或函数:

drop produce pro_book;

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

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

相关文章

廖雪峰讲python高阶函数求导公式_一文读懂Python 高阶函数

高阶函数将函数作为参数传入,这样的函数称为高阶函数。函数式编程就是指这种高度抽象的编程范式。变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。如下所示&#xf…

apache camel_Apache Camel –从头开始开发应用程序(第2部分/第2部分)

apache camel这是本教程的第二部分,我们将使用Apache Camel创建发票处理应用程序。 如果您错过了它,一定要看一下第一部分 。 以前,我们已经定义了系统的功能要求,创建了网关,分离器,过滤器和基于内容的路由…

python 网格线_Python版简单网格策略(教学)

Python版简单网格策略(教学)Python版简单网格策略(教学)Author: 小小梦, Date: 2020-01-04 11:12:15Tags:backteststart: 2019-07-01 00:00:00end: 2020-01-03 00:00:00period: 1mexchanges: [{"eid":"OKEX","currency":"BTC_USDT"}]i…

python土味情话_土味情话表情包下载

喵星人土味情话表情包是一款很甜的表情图片,现在的聊天模式三句话离不开表情包,而且小编带来的这款表情包非常的适合情侣日常撩,最新的土味情话,需要的朋友可以前来本站下载。土味情话大全一、“对不起。”“你永远都不要和我说对…

多云互操作性!=云服务聚合

多云定义为一种方法,它将来自多个云供应商的多个云(公共云或私有云)组合在一起。 但是,这不是来自不同供应商的各种服务的集合,它需要一种强制性的胶合剂–云不可知的方法,并在所有提供商之间实现互操作性。…

python股票预测代码_python用线性回归预测股票价格的实现代码

线性回归在整个财务中广泛应用于众多应用程序中。在之前的教程中,我们使用普通最小二乘法(OLS)计算了公司的beta与相对索引的比较。现在,我们将使用线性回归来估计股票价格。线性回归是一种用于模拟因变量(y)和自变量(x)之间关系的方法。通过简单的线性回…

如何在Spring中将@RequestParam绑定到对象

您是否在请求映射方法中用RequestParam注释了多个参数,并认为它不可读? 当请求中需要一个或两个输入参数时,注释看起来非常简单,但是当列表变长时,您可能会感到不知所措。 您不能在对象内部使用RequestParam批注&…

java替换指定位置字符_JS中的替换,以及替换指定位置的字符串

批量修改name属性中的值// 渲染完成,开始修改ansewer的name属性$(‘.sub_timu_zong_tihao‘).each(function(i){$(this).find(‘input[name*bianhao]‘).each(function(){// 首先获取name的值,对console.log(‘正在修改bianhao‘)var old$(this).attr(‘…

webstorm前端调用后端接口_软件测试面试题:怎么去判断一个bug是前端问题还是后端问题...

大家好,在软件测试面试过程中,经常有面试官问到这个问题,那我们应该如何回答才好呢?少废话,直接看答案:答案:在页面上发现bug之后,要想判断这个问题属于后端还是前端,我就…

spring基于注释的配置_基于注释的Spring MVC Web应用程序入门

spring基于注释的配置这是使Maven启动Spring 3 MVC项目的最小方法。 首先创建spring-web-annotation/pom.xml文件&#xff0c;并包含Spring依赖项&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apach…

ad09只在一定范围内查找相似对象_dxp查找相似对象

(Edit→Find Similar Objects)ShifF 查找 相似对象 EOS(Edit→Origin→Set)设置坐标原点 ESN((Edit → Select → Net) 选中显示某个网 络 FA(......“ctrlA”全选,选择需要修改的器 件,点鼠标右键弹出如下图的菜单: 选择 “查找相似对象” 移动鼠标到需要修改的属性上,点“ok”…

首次适应算法_CVPR 2020丨?商汤TSD目标检测算法获得Open Images冠军

编者按&#xff1a;此前&#xff0c;在文章《商汤科技57篇论文入选ICCV 2019&#xff0c;13项竞赛夺冠》里&#xff0c;商汤君报道了商汤科技荣获Open Images Object Detection Challenge 2019 冠军。由Google AI主办的Open Images大赛是目前通用物体检测和实例分割两个领域中数…

玩JDK 12的Switch表达式

在博客文章“操作中的JDK语言功能预览&#xff1a;切换表达式 ”中&#xff0c;我讨论了JEP 325 [“切换表达式&#xff08; 预览 &#xff09;”&#xff09;如何作为指定的“ 预览语言功能 ”的早期应用&#xff0c;如JEP 12所述。预览语言和VM功能”]。 JEP 325 适用于JDK 1…

java 三元 代替 if_Java 中三元和 if else 哪个的效率比较高,有底层解释吗,谢谢了!...

Genokiller2018-12-28 18:16:11 08:00是否还有其他影响效率的地方两段简短的测试代码&#xff1a;Test2.java (三元运算符)public class Test2{public static void main(String args[]){int m 1, n2;String s m > n ? "a" : "b";}}Test3.java ( if...…

python 验证码_4行Python代码生成图像验证码

点击上方蓝色字体&#xff0c;关注我们最近无意看到网上有人使用Python编写几十行代码生成图像验证码&#xff0c;感觉很是繁琐&#xff0c;这里为各位朋友推荐两种方法&#xff0c;使用4行Python代码即可生成验证码。1captcha库第1步&#xff1a;安装captcha库pip install cap…

python3 多线程_Python3多线程爬虫实例讲解

多线程概述多线程使得程序内部可以分出多个线程来做多件事情&#xff0c;充分利用CPU空闲时间&#xff0c;提升处理效率。python提供了两个模块来实现多线程thread 和threading &#xff0c;thread 有一些缺点&#xff0c;在threading 得到了弥补。并且在Python3中废弃了thread…

java多条件组合查询6_elasticsearch组合多条件查询实现restful api以及java代码实现

elasticsearch组合多条件查询实现restful api以及java代码实现实际开发中&#xff0c;基本都是组合多条件查询。elasticsearch提供bool来实现这种需求&#xff1b;主要参数&#xff1a;must文档 必须 匹配这些条件才能被包含进来。must_not文档 必须不 匹配这些条件才能被包含进…

instanceof运算符_Java 8中的instanceof运算符和访客模式替换

instanceof运算符我有一个梦想&#xff0c;不再需要操作员和垂头丧气的instanceof &#xff0c;却没有访客模式的笨拙和冗长。 所以我想出了以下DSL语法&#xff1a; Object msg //...whenTypeOf(msg).is(Date.class). then(date -> println(date.getTime())).is(Strin…

python垃圾处理_利用python程序帮大家清理windows垃圾

前言大家应该都有所体会&#xff0c;在windows系统使用久了就会产生一些“垃圾”文件。这些文件有的是程序的临时文件&#xff0c;有的是操作记录或日志等。垃圾随着时间越积越多&#xff0c;导致可用空间减少&#xff0c;文件碎片过多&#xff0c;使得系统的运行速度受到一定影…

基于java家教管理系统_基于jsp的家教信息管理-JavaEE实现家教信息管理 - java项目源码...

基于jspservletpojomysql实现一个javaee/javaweb的家教信息管理, 该项目可用各类java课程设计大作业中, 家教信息管理的系统架构分为前后台两部分, 最终实现在线上进行家教信息管理各项功能,实现了诸如用户管理, 登录注册, 权限管理等功能, 并实现对各类家教信息管理相关的实体…