之前介绍了
- 数据库基本常识的简介及mysql安装
- 结构化查询语言sql
- 数据库表介绍
- 数据库的数据类型
- 数据操作语言DML——数据的增删改查
- 数据库对象操作语言DDL——修改、删除数据库表等对象
- 数据库的完整性约束
- 数据库查询语言——DQL
- 数据库中的函数
- 数据库的group by分组和having筛选
- select语句总结(DQL)
- 数据库的多表查询
- 数据库的自连接查询
- 数据库的92语法和99语法的区别
- 数据库的子查询
- 数据库中的事务
- 数据库中的视图
接下来介绍最后一个存储过程。当然,数据库中的东西还有很多,但是到此位置,基本常用的都已经介绍完了,还有就是进阶的查询等操作了,特别是数据库中一些函数的使用,例如查询出来的内容,根据字符拆封等等,但是这些太多太杂,目前还没有完整整理。
存储过程(stored procedure):主要是为了解决多次访问数据库(因为每次得到结果都需要进行一些逻辑操作)。而存储过程就是将这些逻辑操作直接写在数据库内部,这样就只需要一次访问数据库就可以得到最终想要的结果。其实可以使用子查询解决一定的问题,但遇到较复杂的逻辑处理(例如需要加for循环等),子查询就不太好实现。存储过程类似与一段小程序,或者一个方法,一般会有专业的人去写,java程序员一般只是调用。
存储过程优点:
- 提高执行的性能:因为普通的sql每次都会语法分析、编译、执行,而存储过程只在第一次执行的时候进行语法分析、编译和执行。
- 减轻了网络负担:因为降低了客户端(navicat等)与数据库交互的频率。
- 将数据库的处理黑匣子化:应用程序不需要考虑存储过程的内部处理,因为封装成了一个方法。
创建存储过程:其实存储过程就是定义一个函数,具体格式为create procedure 存储过程名称(in 形参名 形参类型(长度)…, out 返回值 返回值类型(长度)) begin …end;,在begin和end之间写一些逻辑。并且in可以省略不写。
-
例如,实现emp表中ename的模糊查询,传入的内容为模糊查询的模糊部分,类型为varchar,长度为10,形参名定义为name。(没有返回值)
create procedure myProcedure(in name varchar(10)) begin if name is null or name = "" then select * from emp; else select * from emp where ename like concat('%',name,'%');# 这里字符串拼接需要用到concat函数 end if; end;
-
例如,实现emp表中ename的模糊查询,传入的内容为模糊查询的模糊部分,类型为varchar,长度为10,形参名定义为name,并返回查询的记录数。
create procedure myProcedure1(in name varchar(10),out num int(3)) begin if name is null or name = "" then select * from emp; else select * from emp where ename like concat('%',name,'%');# 这里字符串拼接需要用到concat函数 end if; select found_rows() into num;# found_rows是mysql中定义的专门用来查看返回行数的函数。 end;
删除存储过程:drop procedure 存储过程名称。
调用存储过程:call 存储过程名称(参数);这时候是没有返回值的调用;call 存储过程名称(参数, @接收返回值的变量);这个是有返回值的时候的调用。并且需要注意的是,返回值的查看需要再执行select @接收返回值的变量;才可以获取。