网站后台上次图片,桂林网页开发,成都科技网站建设找,刘连康seo培训哪家强1、存储过程概述
MySQL从5.0版本开始支持存储过程和函数。存储过程和函数能够将负杂的SQL逻辑封装在一起#xff0c;应用程序无序关注存储过程和函数内部复杂的SQL逻辑#xff0c;而只需要简单的调用存储过程和函数就可以。
1.1 理解
含义#xff1a;存储过程的英文是Sto…1、存储过程概述
MySQL从5.0版本开始支持存储过程和函数。存储过程和函数能够将负杂的SQL逻辑封装在一起应用程序无序关注存储过程和函数内部复杂的SQL逻辑而只需要简单的调用存储过程和函数就可以。
1.1 理解
含义存储过程的英文是Store Procedure。它的思想很简单就是一组经过预先编译的SQL语句的封装。
执行过程存储过程预先存储在MySQL服务器上需要执行的时候客户端只需要向服务器发出调用存储过程的命令服务器端就可以把预先存储好的这一系列SQL语句全部执行。
好处 1、简化操作提高了sql语句的重用性减少了开发程序员的压力。 2、减少操作过程中的失误提高效率。 3、减少网络传输量客户端不需要把所有的SQL语句通过网络发给服务器 4、减少了SQL语句暴露在网上的风险也提高了数据查询的安全性。
和视图、函数的对比 它和视图有着同样的优点清晰、安全还可以减少网络传输量。不过它和视图不同视图是虚拟表通常不对底层数据表直接进行操作而存储过程是程序化的SQL语句可以直接操作底层数据表相比于面向集合的操作方式能够实现一些更复杂的数据处理。 一旦存储过程被创建出来使用它就和使用函数一样简单我们直接通过调用存储过程名即可。相较于函数存储过程是没有返回值的。
1.2 分类
存储过程的参数类型可以是IN、OUT和INOUT。根据这个分类1、没有参数没有参数没有返回。2、仅仅带IN类型有参数无返回。3、仅仅带OUT(无参数有返回)。4、既带IN又带OUT (有参数有返回)。5、带INOUT(有参数有返回)2、创建存储过程
基本语法Create Procedure 存储过程名(IN | OUT | INOUT 参数名 参数类型,...)
[characteristics ...]
BEGIN存储过程体
END说明 1、参数前面的符号的意思 1IN当前参数为输入参数也就是表示入参存储过程只是读取参数的值。如果没有定义参数种类默认就是IN表示输入参数。 2OUT当前参数为输出参数也就是表示出参执行完之后调用这个存储过程的客户端或应用程序就可以读取这个参数返回的值了。 3INOUT当前参数既可以为输入参数也可以为输出参数。 2、形参类型可以是MySQL数据库中的任意类型。 3、characteristics表示创建存储过程时指定的对存储过程的约束条件其取值信息如下
Language SQL
| [not] Deterministic
| {Contains SQL | NO SQL | READS SQL DATA
| MODIFIES SQL DATA}
| SQL SECURITY { DEFINER | INVOKE }
| COMMENT stringLanguage SQL说明存储过程执行体式由SQL语句组成的当前系统支持的语音为SQL。
[Not] Deterministic指明存储过程执行的结果是否确定。Deterministic表示结果时确定的。每次执行存储过程时相同的输入都会得到相同的输出。Not Deterministic表示结果时不确定的相同的输入可能得到不同的输出。如果没有指定任意一个值默认为Not Deterministic。
{Contains SQL| No SQL |READ SQL DATA|MODIFIES SQL DATA}指明子查询使用SQL语句的限制。 1Contains SQL表示当前存储过程的子程序包含SQL语句但是并不包含读写数据的SQL语句。 2NO SQL 表示当前存储过程的子程序中不包含任何SQL语句。 3READS SQL DATA 表示当前存储过程的子查询中包含读数据的SQL语句。 4MODIFIES SQL DATA 表示当前存储过程的子查询中包含写数据的SQL语句。 5默认情况下系统会知道为Contains SQL。
SQL SECURITY { DEFINER | INVOKER }执行当前存储过程的权限既指明哪些用户能够执行当前存储过程。 1Definer表示只有当前存储过程的创建者或者定义者才能执行当前存储过程。 2Invoker表示拥有当前存储过程的访问权限的用户能够执行当前存储过程。
4、存储过程体中可以有多余SQL语句如果仅仅一条SQL语句则省略Begin和End编写存储过程并不是一件简单的事情可能存储过程中需要复杂的SQL语句。 1Begin…End中间可能包含了多个语句每个语句以(;)号为结束符。 2Declare用来声明变量使用的位置位于Begin…End语句中间而且需要在其他语句使用之前进行变量声明。 3Set赋值语句用于对变量进行赋值。 4Select…Into把从数据表中查询的结果存放到变量中也就是为变量赋值。 5、需要设置新的结束标志
Delimiter 新的结束标志说明因为MySQL默认的语句结束符为分号’;。为了避免与存储过程中SQL语句结束符相冲突。需要使用Delimiter改变存储过程的结束符。
2.1 案例实操
2.1.1 无参输入和无参输出
1、创建存储过程select_all_data–查看employees表中的所有数据 2、调用存储过程select_all_data()
2.1.2 有参输入和无参输出
1、创建存储过程select_id_101()—打印employee_id为101的用户信息
2、调用存储过程
2.1.3 有参输入和有参输出
1、创建存储过程select_salary_id_101()----获取employee_id为101的员工工资 2、调用存储过程 3、查看结果
2.1.4 有参输入和有参输出INOUT
1、创建存储过程select_id_manager_id—获取管理者的id 2、调用存储过程 3、查看结果
3、存储函数概述
其实前面的博客就写了很多函数。使用这些函数可以对数据进行的各种处理操作极大地提高用户对数据库的管理效率。MySQL支持自定义函数定义好之后调用方式和调用MySQL预定义的系统函数一样。 学过的函数 1Length 2Substr 3Concat
3.1 语法分析
Create Function 函数名(参数名 参数类型,...)
returns 返回值类型
[characteristics]
Begin函数体 #函数体一定要有Return语句
END说明 1参数列表·指定参数为IN、Out或NOUT只对Procedure是合法的Function中总是默认为IN参数。 2Returns type 表示函数返回数据的类型。Returns子句只能对Function做指定对函数而言是强制的。它用来指定函数的返回类型而且函数体必须包含一个Return value语句。 3characteristic创建函数时指定的对函数的约束。取值与创建存储过程时相同。 4函数体也可以用Begin…End来表示SQL代码的开始和结束。如果函数体只有一条语句也可以省略Begin…End。
3.2 调用存储函数
select 函数名(实参列表)3.3 案例实操
3.3.1 无参输入
1、创建存储函数Select_max_salary()–获取员工最高工资的工资 2、调用函数
3.3.2 有参输入
1、创建存储函数select_id_salary(uid int)–获取该id的工资 2、调用函数
4、对比存储函数和存储过程
关键字调用语法返回值应用场景存储过程ProcedureCall 存储过程名()理解为有0个或多少一般用于更新存储函数FunctionSelect 函数名()只能是一个一般用于查询结果为一个字值的返回
5、存储过程和存储函数的查看、修改、删除
5.1 查看
1、使用Show Create语句查看存储过程和函数的创建信息基本语法Show Create {Procedure | Function} 存储过程名或函数名举例 2、使用Show Status 语句查看存储过程和函数的状态信息 基本语法
Show {Procedure|Function} Status [like pattern]举例 3、从information_schema.Routines表中查看存储过程和存储函数的信息。 基本语法
select * From information_schema.Routines
where Routine_Name函数名或过程名 AND Rountine_type函数或过程举例
5.2 修改
修改存储过程和存储函数不影响存储过程或函数功能只是修改特性。使用Alter语句实现。alter {Procedure | Function } 存储过程或函数的名 [characteristic]5.3 删除
删除存储过程和函数可以使用Drop语句。
基本语法Drop {Procedure | Function } [if exists] 存储过程或函数名6、存储过程的优缺点
6.1 优点
1、存储过程可以一次编译多次使用
2、可以减少开发工作量
3、存储过程的安全性强
4、可以减少网络传输量
5、良好的封装性6.2 缺点
1、可移植性
2、调试困难
3、存储过程的版本管理很困难
4、不适合高并发的场景