mysql进阶-(五)视图、存储过程、触发器

文章目录

    • 视图
      • 创建视图
      • 查询视图
      • 修改视图
      • 删除视图
      • 视图检查选项
        • CASCADED
        • LOCAL
      • 更新及作用
    • 存储过程
      • 创建
      • 调用
      • 查看
      • 删除
      • 游标
    • 触发器

视图

视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。
通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

创建视图

CREATE [ OR REPLACE ] VIEW 视图名称[(列名列表)] AS SELECT 语句 [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]

例子: create or replace view stu_wll as select id,name from student where id<=10;

查询视图

查看创建视图语句: SHOW CREATE VIEW 视图名称;

查看视图数据:SELECT*FROM 视图名称;
show create view stu_v_1;

修改视图

方式一:CREATE[OR REPLACE] VIEW 视图名称[(列名列表))] AS SELECT 语句[ WITH[ CASCADED | LOCAL ] CHECK OPTION ]

方式二:ALTER VIEW 视图名称 [(列名列表)] AS SELECT语句 [WITH [CASCADED | LOCAL] CHECK OPTION]

删除视图

DROP VIEW [IF EXISTS] 视图名称 [视图名称]

视图检查选项

当使用WITH CHECK QPTION子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如插入,更新,删除,以使其符合视图的定义。MySQL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。为了确定检查的范围,mysql提供了两个选项:CASCADED 和 LOCAL ,默认值为 CASCADED。

NOTE:如果没有开检查选项就不会进行检查。不同版本是不同含义的,要看版本。

CASCADED

级联,一旦选择了这个选项,除了会检查创建视图时候的条件,还会检查所依赖视图的条件。

比如下面的例子:创建stu_V_l 视图,id是小于等于 20的。
create or replace view stu_V_l as select id,name from student where id <=20;
再创建 stu_v_2 视图,20 >= id >=10。
create or replace view stu_v_2 as select id,name from stu_v_1 where id >=10 with cascaded check option;
再创建 stu_v_3 视图。
create or replace view stu_v_3 as select id,name from stu_v_2 where id<=15;
这条数据能够成功,stu_v_3 没有开检查选项所以不会 去判断 id 是否小于等于15, 直接检查 是否满足 stu_v_2。
insert into stu_v_3 values(17,'Tom');

LOCAL

本地的条件也会检查,还会向上检查。在向上找的时候,就要看是否上面开了检查选项,如果没开就不检查。和 CASCADED 的区别就是 CASCADED 不管上面开没开检查选项都会进行检查。

更新及作用

要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。如果视图包含以下任何一项,则该视图不可更新

  1. 聚合函数或窗口函数 ( SUM()、MIN()、MAX()、COUNT() 等 )
  2. DISTINCT
  3. GROUP BY
  4. HAVING
  5. UNION 或者UNION ALL

例子: 使用了聚合函数,插入会失败。
create view stu_v_count as select count(*) from student;
insert into stu_v_count values(10);
作用

视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。

安全
数据库可以授权,但不能授权到数据库特定行和特定的列上。通过视图用户只能查询和修改他们所能见到的数据
数据独立
视图可帮助用户屏蔽真实表结构变化带来的影响。
总而言之 类似于给表加上了一个外壳,通过这个外壳访问表的时候,只能按照所设计的方式进行访问与更新。

存储过程

存储过程是事先经过编译并存储在数据库中的一段SQL 语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。
存储过程思想上很简单,就是数据库SQL 语言层面的代码封装与重用。

特点

  1. 封装
  2. 复用
  3. 可以接收参数,也可以返回数据减少网络交互,效率提升

创建

CREATE PROCEDURE 存储过程名称( [参数列表] ) 

BEGIN

	 SQL 语句 

END;

NOTE: 在命令行中,执行创建存储过程的SQL时,需要通过关键字delimiter 指定SQL语句的结束符。默认是 分号作为结束符。

delimiter $ ,则 $ 符作为结束符。

调用

CALL 名称 ( [参数])

查看

查询指定数据库的存储过程及状态信息

SELECT* FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = 'xxx'

存储过程名称;–查询某个存储过程的定义

SHOW CREATE PROCEDURE

删除

DROP PROCEDURE [ IFEXISTS ] 存储过程名称

游标

游标(CURSOR)是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明、OPEN、FETCH和CLOSE,其语法分别如下。

声明游标:
DECLARE 游标名称 CURSOR FOR 查询语句
打开游标:
OPEN 游标名称
获取游标记录:
FETCH 游标名称INTO变量[变量]
条件处理程序:
条件处理程序(Handler)可以用来定义在流程控制结构执行过程中遇到问题时相应的处理步骤。具体语法为:
DECLARE handler action HANDLER FOR condition value L condition value]…statement
handler_action CONTINUE:继续执行当前程序

EXIT:终止执行当前程序

condition_value :

SQLSTATE sqlstate_value:状态码,如02000

SQLWARNING:所有以01开头的SQLSTATE代码的简写

NOT FOUND:所有以02开头的SQLSTATE代码的简写

SQLEXCEPTION:所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE代码的简写

例子:

NOTE:要先声明普通变量,再申请游标。

要求:
根据传入的参数uage,来查询用户表tb_user中,所有的用户年龄小于等于uage的用户姓名(name)和专业(profession),并将用户的姓名和专业插入到所创建的一张新表(id,name,profession)中。

create procedure p1l(in uage int)

	begin

		declare uname varchar(100); 

		decLare upro varchar(100);

		declare u_cursor cursor for select name,profession from tb_user where age <= uage; 

		当 条件处理程序的处理的状态码为02000的时候,就会退出。
		declare exit handler for SQLSTATE '02000'close u_cursor;

		drop table if exists tb_user_pro; 

		create table if not exists tb_user_pro(

		id int primary key auto_increment, 

		name varchar(100), 

		profession varchar(100)

		);

		open u_cursor; 

		while true do 

		fetch u_cursor into uname,Upro; 

		insert into tb_user_pro values(null,uname,Upro); 

		end while;

		close u_cursor; 

	end;

触发器

介绍
触发器是与表有关的数据库对象,指在insert/update/delete之前或之后,触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。
使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发(比如说 一条语句影响了 5 行 则会被触发 5 次),不支持语句级触发(比如说 一条语句影响了 5 行 则会被触发 1 次)。

触发器类型 NEW 和 OLD
INSERT NEW 表示将要或者已经新增的数据
UPDATE OLD表示修改之前的数据,NEW表示将要或已经修改后的数据
DELETE OLD表示将要或者已经删除的数据

你可能感兴趣的:(mysql,复习,mysql,sql,数据库)