MySQL入门教程(17)视图与存储过程

Tanglu MySQL 2022-12-23 1303 0

一、MySQL视图

1、视图介绍与作用

视图就是将一条SELECT查询语句的结果另存为一张虚拟表中,可以把视图看作是一个被存储起来的查询语句。对视图的操作主要是查询,通常用于将一些非敏感字段查询出来存储成视图给特定人员进行访问,这样可以起到数据保护和权限控制的作用。创建和删除视图只会影响视图本身,但是对视图中的数据进行修改或者修改了基表中的数据,都会互相影响(通过视图修改数据时需要注意基表的表结构,比如基表有C字段不允许为NULL,而视图中并没有引用这个字段,那么通过视图去新增数据则会失败,因为视图看不到C)。需要注意的是视图过多后会使维护变得复杂,尤其是一些嵌套视图可读性差,容易变成潜在隐患


2、创建视图

#视图创建语法
#CREATE VIEW 视图名称 AS 查询语句

#针对单表创建视图
CREATE [definer = {user} ] VIEW view_name AS select * from table_name  

#针对多表创建视图
CREATE VIEW my_view AS 
SELECT e.employee_id,e.department_id,d.department_name FROM emps e JOIN depts d ON e.department_id=d.department_id;


3、使用视图

在视图创建好以后直接使用查询语句查看视图即可

SELECT  * FROM my_view  #从视图中查询数据


4、修改视图

#使用ALTER修改
ALTER VIEW view_name AS SELECT .....
#使用REPLACE修改
REPLACE VIEW view_name AS SELECT ......


5、删除视图

DROP VIEW view_name


二、MySQL存储过程

1、什么是存储过程

存储过程是对一条或多条SQL语句的封装,将这些SQL语句存储在MySQL上,等需要执行的时候再进行调用,可以视作增强版的脚本。虽然存储过程可以简化一些复杂的操作,但是由于移植性差(不同数据库编写的存储过程不互相兼容)、调试不方便、服务端资源消耗厉害等问题,所以在一些大并发场景下不建议使用存储过程。还有一个存储函数作用类似,二者区别在于自定义的存储函数一定会返回一个值,而存储过程不一定


2、存储过程创建语法

CREATE [DEFINER|INVOKER] PROCEDURE 存储过程名称(IN|OUT|INOUT 参数名 参数类型...) COMMENT '注释信息'
[characteristics ...]
BEGIN
  存储过程体
END

DEFINER:只有当前存储过程的创建者才能调用该存储过程

INVOKER:拥有当前存储过程访问权限的用户可以调用该存储过程

COMMENT:注释信息

IN:存储过程的默认参数,代表需要传递给存储过程的参数,参数可以有多个,用逗号分隔

OUT:存储过程执行完成以后客户端可以读取这个参数的返回值,相当于是存放在了一个变量中

INOUT:可以是输入参数也可以是输出参数


3、存储过程示例

delimiter ;;  #使用delimiter临时改变分隔符,用//这样的符号也是可以的
create procedure 过程名()
begin
    select AVG(salary) as avgsal from student;  #过程主体,也就是需要使用到的SQL了
end ;;  
delimiter ;  #声明回原本分隔符


#创建存储过程avg_salary(),返回所有员工平均工资
DELIMITER //
CREATE PROCEDURE avg_salary()
BEGIN
    SELECT AVG(salary) FROM employees;
END  //
DELIMITER ;

#带OUT的存储过程
#创建存储过程show_min_salary(),查看emps表中最低薪资,并通过OUT参数ms进行输出
DELIMITER //
CREATE PROCEDURE show_min_salary(OUT ms DECIMAL)
BEGIN
  SELECT MIN(salary) INTO ms FROM employees;
END //
DELIMITER ;

#带IN的存储过程
#创建存储过程show_somenoe_salary(),查看emps表中某个成员薪资,并通过IN参数输入员工姓名
DELIMITER //
CREATE PROCEDURE show_someone_salary(IN empname VARCHAR(10))
BEGIN 
  SELECT salary FROM employees WHERE last_name= empname
END //
DELIMITER ;


4、调用存储过程

#调用无参数存储过程
call avg_salary();

#调用OUT参数存储过程
call show_min_salary(@ms);

#查看变量
SELECT @ms;

#调用IN参数存储过程
call show_somenoe_salary('tanglu');



5、查看存储过程

SHOW PROCEDURE STATUS    #查看实例下的所有存储过程
SHOW PROCEDURE STATUS LIKE '%proc_delete_node%'   #根据条件查询
SHOW CREATE PROCEDURE hzins_mtkf.`proc_delete_node`    #查看存储过程的创建语句


评论