【MySQL】数据库之存储过程(“SQL语句的脚本“)

目录

一、什么是存储过程?

二、存储过程的作用

三、如何创建、调用、查看、删除、修改存储过程

四、存储过程的参数(输入参数,输出参数,输入输出参数)

第一种:输入参数 

第二种:输出参数

第三种:输入输出参数

五、存储过程中的条件与循环语句

第一种:if条件的存储过程

第二种:while循环的存储过程 

六、如何一次性往数据库中插入上万条数据?

第一种存储过程实现上万数据插入

第二种shell脚本实现上万数据插入


一、什么是存储过程?

存储过程是一组为了完成特定功能的SQL语句的集合。有点shell脚本的意思

存储过程在使用过程中,是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来,这个过程经编译和优化存储在数据库服务器中,当需要使用该存储过程的时候,只需要调用即可。存储过程在执行上比传统的SQL语句速度更快,执行的效率也更高。

二、存储过程的作用

优点:

1、执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率;

2、SQL语句加上控制语句的集合,灵活性高;

3、在服务器端存储,客户端调用时,降低网络负载;

4、可以多次重复调用存储过程,也可以随时修改,不影响客户端的调用;

5、可以完成所有数据库的操作,也可以控制数据库的信息访问权限。

三、如何创建、调用、查看、删除、修改存储过程

存储过程也是一种对象,增删改查的命令可以套用DDL的相关语句

存储过程是创建在库中的,需要先用use切换库,否则需要在创建的时候,指定库名
##创建存储过程了
delimiter 结束符 ##先自定义结束符,因为存储过程中的SQL语句用分号结尾,这时需要修改作为区分
create procedure 存储过程名称()
begin
SQL语句集合
end结束符号
delimiter ; ##将结束符修改回为分号

##查看存储过程
show create procedure [库名].存储过程名称;
show procedure status like '存储过程名称' \G; ##支持通配符

##调用存储过程
call 存储过程名称;

##删除存储过程
drop procedure 存储过程名称;
drop procedure if exists 存储过程名称; ##如果存在则删除

【MySQL】数据库之存储过程(“SQL语句的脚本“)_第1张图片

【MySQL】数据库之存储过程(“SQL语句的脚本“)_第2张图片

 【MySQL】数据库之存储过程(“SQL语句的脚本“)_第3张图片

修改存储过程的方法:

存储过程内容的修改方法是通过删除原有存储过程,之后再以相同的名称创建新的存储过程。如果要修改存储过程的名称,可以先删除原存储过程,再以不同的命名创建新的存储过程。 

总结就是重新创建储存过程,没有直接删除的方法

四、存储过程的参数(输入参数,输出参数,输入输出参数)

可以在存储过程创建的时候加入参数,

创建存储过程定义的参数叫形式参数,create procedure 存储名称(形式参数)

调用的时候添加的参数叫做实际参数call 存储名称(实际参数)

第一种:输入参数 

delimiter $$
CREATE PROCEDURE proc2(in in_name VARCHAR(20))
BEGIN
INSERT INTO t3 (NAME)VALUES(in_name);
END$$
delimiter ;
CALL proc2('wwy');

【MySQL】数据库之存储过程(“SQL语句的脚本“)_第4张图片 

第二种:输出参数

delimiter $$
CREATE PROCEDURE proc3(in in_id INT,OUT out_name varchar(20))
BEGIN
SELECT NAME INTO out_name FROM t3 where id=in_id;
END$$
delimiter ;
CALL proc3(2,@dest);
SELECT @dest;

##select 字段或聚合函数 into +输出参数名称 from 表名 where 条件
##输出参数的值一般是一个确定的值,多个会报错

【MySQL】数据库之存储过程(“SQL语句的脚本“)_第5张图片

单个案例举例,针对存储过程的输出参数,如果是2个值,可能不可以实现,

必须是只有1个特定的值

【MySQL】数据库之存储过程(“SQL语句的脚本“)_第6张图片

第三种:输入输出参数

输入输出参数首先需要满足出入的和输出的数据类型是一致的!! 比如都为int数字 或者都为varchar

delimiter $$
CREATE PROCEDURE proc4(INOUT i INT)
BEGIN
SELECT COUNT(name) INTO i FROM t3 where id>i;
END$$
delimiter ;
SET a=5;
CALL proc4(@a);
SELECT @a;

【MySQL】数据库之存储过程(“SQL语句的脚本“)_第7张图片

五、存储过程中的条件与循环语句

第一种:if条件的存储过程

delimiter $$
CREATE PROCEDURE proc5(IN in_id INT)
BEGIN
DECLARE m INT;
SET m=in_id;
IF m>=4 THEN UPDATE t3 SET grade='good';
ELSE UPDATE t3 SET grade='bad';
END if;
END$$

【MySQL】数据库之存储过程(“SQL语句的脚本“)_第8张图片

【MySQL】数据库之存储过程(“SQL语句的脚本“)_第9张图片 

第二种:while循环的存储过程 

mysql> delimiter $$
mysql> create procedure proc6()
    -> begin
    -> declare m int;
    -> set m=1;
    -> create table t4(id int primary key auto_increment,name varchar(20));
    -> while m<10 do
    -> insert into t4(name)values(concat('student',m));
    -> set m=m+1;
    -> end while;
    -> end$$

【MySQL】数据库之存储过程(“SQL语句的脚本“)_第10张图片

六、如何一次性往数据库中插入上万条数据?

有两种方式 存储过程和shell脚本

第一种存储过程实现上万数据插入

一百万条数据  用时50秒

【MySQL】数据库之存储过程(“SQL语句的脚本“)_第11张图片

第二种shell脚本实现上万数据插入

【MySQL】数据库之存储过程(“SQL语句的脚本“)_第12张图片

【MySQL】数据库之存储过程(“SQL语句的脚本“)_第13张图片 shell脚本需要耗时比较久,有大量的IO操作,cpu的平均负载非常高

【MySQL】数据库之存储过程(“SQL语句的脚本“)_第14张图片

你可能感兴趣的:(数据库,mysql,sql,运维,oracle,linux)