建设企业网站平台主要的目的是,界面设计模式读后感,宝山做网站价格,免费logo在线设计生成MySQL—存储过程与存储函数的相关概念
存储函数和存储过程的主要区别#xff1a;
存储函数一定会有返回值的存储过程不一定有返回值
存储过程和函数能后将复杂的SQL逻辑封装在一起#xff0c;应用程序无需关注存储过程和函数内部复杂的SQL逻辑#xff0c;而只需要简单地调…MySQL—存储过程与存储函数的相关概念
存储函数和存储过程的主要区别
存储函数一定会有返回值的存储过程不一定有返回值
存储过程和函数能后将复杂的SQL逻辑封装在一起应用程序无需关注存储过程和函数内部复杂的SQL逻辑而只需要简单地调用存储过程和函数即可
存储过程
一组预先编译的SQL语句的封装
执行过程执行过程预先存储在MySQL服务器上需要执行的时候客户端只需要向服务器发出调用存储过程的命令服务器端就可以把预先存储好的这一系列SQL语句全部执行
简化操作提高了SQL语句的重用性减少了开发程序员的压力减少操作过程中的失误提高效率减少网路传输量客户端不需要将所有的SQL语句通过网络发给服务器减少SQL语句暴露在网上的风险提高数据查询的安全性
与视图函数的对比 视图是虚拟表通常不对底层数据表直接操作 存储过程程序化的SQL可以直接操作底层数据表相比于面向集合的操作方式能够实现一些更复杂的数据处理 相较于函数存储过程没有返回值
分类
没有参数无参数无返回仅仅带有IN 类型 有参数无返回仅仅带OUT类型无参数有返回即带IN又带OUT(有参数有返回)带INOUT(有参数有返回)
创建存储过程
DELIMITER $CREATE PROCEDURE 存储过程名 (IN|OUT|INOUT 参数名 参数类型,...)
[characteristics]
BEGIN
存储过程体
END $DELIMITER ;DELIMITER $
CREATE PROCEDURE select_all_data()
BEGINSELECT *FROM employees;
END $DELIMITER ;调用存储过程
CALL select_all_data();无参数无返回值
DELIMITER //
CREATE PROCEDURE avg_employee_salary()
BEGIN SELECT AVG(salary) FROM emp;
END //
DELIMITER ;CALL avg_employee_salary();无参数有返回值
DELIMITER //
CREATE PROCEDURE show_min_salart(OUT ms DOUBLE)
BEGIN SELECT MIN(salary) INTO msFROM emp;
END //
DELIMITER ;CALL show_min_salart(ms);SELECT ms;有参数无返回值
DELIMITER //
CREATE PROCEDURE show_someone_salary(IN empname VARCHAR(20))
BEGIN SELECT salaryFROM empWHERE last_nameempname;
END //
DELIMITER ;CALL show_someone_salary(Abel);SET empnameAbel;
CALL show_someone_salary(empname)有参数有返回值
DELIMITER //
CREATE PROCEDURE show_someone_salary2(IN empname VARCHAR(20),OUT empsalary DECIMAL(10,2))
BEGIN SELECT salary INTO empsalaryFROM empWHERE last_nameempname;
END //
DELIMITER ;SET empnameAbel;
CALL show_someone_salary2(empname,empsalary);SELECT empsalary;带INOUT
DELIMITER //
CREATE PROCEDURE show_mgr_name(INOUT empname VARCHAR(25))
BEGIN
SELECT last_name
FROM emp
Where employee_id
(SELECT manager_id FROM empWHERE last_nameempname
);
END //
DELIMITER ;SET empnameAbel;
CALL show_mgr_name(empname);
SELECT empname;如何调试
通过SELECT语句把程序执行的中间结果查询出来从而调试一个SQL语句的正确性。调试成功之后把SELECT语句后移到下一个SQL语句逐步推进查询下一个 SQL语句
存储函数
MySQL允许用户自定义函数自定义好了之后调用方式与调用MySQL预定义的系统函数一样
创建存储函数
CREATE FUNCTION 函数名参数名 参数类型
RETURUNS 返回值类型
[characteristics]
BEGIN 函数体 #函数体中肯定有RETURN语句
END参数类型FUNCTION 中总是默认为IN参数RETURNS type 表示函数返回数据的类型对于函数而言是强制的characteristics 表示创建函数时指定的对函数的约束函数题可以用BEGIN … END表示SQL代码的开始和结束。如果函数体只有一条语句则可以省略BEGIN … END
调用存储函数
SELECT 函数名实参列表练习一
DELIMITER //CREATE FUNCTION email_by_name()
RETURNS VARCHAR(25)
BEGIN
RETURN
(SELECT emailFROM empWHERE last_nameAbel
);
END //
DELIMITER ;SELECT email_by_name();练习2
DELIMITER //CREATE FUNCTION email_by_id(emp_id INT)
RETURNS VARCHAR(25)
BEGIN
RETURN
(SELECT emailFROM empWHERE employee_idemp_id
);
END //
DELIMITER ;SELECT email_by_id(101);SET emp_id102;
SELECT email_by_id(emp_id);存储函数与存储过程的对比
存储过程 PEOCEDURE 存储函数 FUNCTION调用语法 CALL 存储过程 SELECT 存储函数存储过程返回值可以有0个或对各 存储函数返回值只有一个存储过程一般用于更新操作 存储函数一般用于查询结果为一个值并返回存储函数可以放在查询语句中使用存储过程则不行存储过程功能更为强大包括能够执行对表的操作创建表删除表和事务操作这些功能是存储函数并不具备的
存储过程和函数的查看、修改、删除
查看
使用SHOW CREATE 语句 查看创建信息
SHOW CREATE PROCEDURE show_mgr_name\G;
SHOW CREATE FUNCTION email_by_id\G;使用SHOW STATUS 语句查看存储过程和函数的状态信息
SHOW PROCEDURE STATUS;
SHOW PROCEDURE STATUS LIKE show_mgr_name ;
SHOW FUNCTION STATUS LIKE email_by_name ;从information_schema.Routines表中查看存储过程和函数的信息
SELECT * FROM information_schema.ROUTINES
WHERE ROUTINE_NAMEemail_by_id AND ROUTINE_TYPEFUNCTION;SELECT * FROM information_schema.ROUTINES
WHERE ROUTINE_NAMEshow_min_salart AND ROUTINE_TYPEPROCEDURE;修改存储过程与函数
修改存储过程或函数不影响存储过程或函数功能只是修改相关特征使用ALTER语句实现
ALTER PROCEDURE|FUNCTION 存储过程或函数名 [characteristic ...]删除存储过程或函数
DROP PROCEDURE|FUNCTION [IF EXISTS] 存储过程或函数名