mysql笔记 存储过程和函数

存储过程:预先编译好的SQL语句的集合,理解成批处理语句

1.提高代码重用性

2.简化操作

3.减少了编译次数并且减少了和数据库服务器的链接次数,提高了效率

一、创建语法

create procedure 存储过程名(参数列表)

BEGIN 

          存储过程体(一组合法的SQL语句)

END

注意:1.参数列表包含三部分:参数模式、参数名、参数类型

参数模式:IN-该参数可以作为输入,也就是该参数需要调用方传入值   

                  OUT -该参数可以作为输出,也就是该参数可以作为返回值

                  INOUT-该参数既可以作为输入又可以作为输出,也就是该参数既徐亚传入值,又可以返回值

eg:IN stuname varchar(20);

2.如果存储过程体仅仅只有一句话,begin end可以省略

存储过程体中的每条SQL语句的结尾要求必须加分号

存储过程的结尾可以使用delimiter重新设置

语法:delimiter 结束标记

delimiter $

二、调用语法

call 存储过程名(实参列表);

eg:

delimiter $
CREATE PROCEDURE myp1()
BEGIN 
            INSERT INTO admin(username,`password`)
            VALUES('john1','0000'),('lily','0000'),('rose','0000'),('jack','0000'),('tom','0000');
END $

CALL myp1()$;

2.创建带in模式参数的存储过程

eg:创建存储过程,根据对应女生名,查询对应的男生信息

delimiter $
CREATE PROCEDURE myp2(IN beautyName VARCHAR(20))
BEGIN
            SELECT bo.*
            FROM boys bo
            right join beauty b on bo.id = b.boyfriend_id
            WHERE b.name = beautyName;
END $
CALL myp2('柳岩')$;

3.创建带out模式的存储过程

eg:根据女生名,返回对应的男生名

delimiter $
CREATE PROCEDURE myp5(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20))
BEGIN
            SELECT bo.boyName INTO boyName
            FROM boys bo
            INNER JOIN beauty b ON bo.id = b.boyfriend_id
            WHERE b.`name`=beautyName;
END $

CALL myp5('小昭',@bName)$
SELECT @bName$

4.创建带inout模式的存储过程

eg:传入a和b两个值。最终a和b都翻倍并返回

delimiter $
CREATE PROCEDURE myp6(INOUT a INT,INOUT b INT)
BEGIN
            SET a=a*2;
            SET b=b*2;
END $

SET @m=10$
set @n=20$
call myp6(@m,@n)$
SELECT @m,@n$

二、删除存储过程

语法:drop procedure 存储过程名

三、查看存储过程的信息

SHOW CREATE PROCEDURE 存储过程名;

函数:

函数与存储过程的区别:

存储过程:可以有0个返回,也可以有多个返回,适合做批量插入、批量更新

函数:有且仅有1个返回值,适合做处理数据后返回一个结果

一、创建语法

create function 函数名(参数列表) return 返回类型

begin

        函数体

end

注意:

1.参数列表 包含两部分:参数名  参数类型

2.函数体:肯定会有return 语句,如果没有会报错;如果return语句没有放在函数体的最后也不报错,但不建议

return 值

3.函数体中仅有一句话,则可以省略begin end

4.使用delimiter语句设置结束标记

delimiter $

二、调用语法

select 函数名(参数列表)

#1.无参数返回
#案例:返回公司的员工个数
delimiter $
CREATE FUNCTION myf1() RETURNS INT
BEGIN
            DECLARE c INT DEFAULT 0;
            SELECT COUNT(*) INTO c 
            FROM employees;
            return c;
END $

SELECT myf1()$

#2.有参数返回
#eg:根据员工名,返回它的工资
delimiter $
create FUNCTION myf2(empName VARCHAR(20)) RETURNS DOUBLE
BEGIN
            SET @sal=0;
            SELECT salary INTO @sal
            FROM employees
            WHERE last_name=empName;
            
            RETURN @sal;
END $

SELECT myf2('K_ing') $

delimiter $
CREATE FUNCTION myf3(deptName VARCHAR(20)) RETURNS DOUBLE
BEGIN
            DECLARE sal DOUBLE;
            SELECT AVG(salary) INTO  sal
            FROM employees e
            JOIN departments d ON e.department_id = d.department_id
            WHERE d.department_name=deptName;
            RETURN sal;
END $
SELECT myf3('IT')$

三、查看函数

SHOW CREATE FUNCTION 函数名;

四、删除函数

drop function 函数名;

 

 

 

你可能感兴趣的:(mysql)