欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【读书笔记】《MySQL必知必会》(视图、存储过程、游标、触发器)

程序员文章站 2022-06-04 08:48:42
...

视图(VIEW)

  • 视图是虚拟表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询
  • 视图仅仅是用来查看存储在别处数据的一种设施,本身不包含数据,因此它们返回的数据是从其他表检索出来的,再添加或更改这些表中的数据时,视图将返回改变过得数据。同样,视图是可更新的,更新一个视图将更新基准表
  • 视图不能索引,也不能有关联的触发器或默认值
  • 视图的作用
    • 简化复杂的联结
    • 重新格式化检索出来的数据
    • 过滤不想要的数据
  • 操作
-- 创建
create[or replace] view viewname as [查询语句];

replace表示替换已有视图

  • 可使用show create view语句查看视图信息,有关视图的信息记录在information_schema数据库中的views表中
-- 修改
ALTER VIEW view_name AS select_statement

修改视图是指修改数据库中已存在的表的定义,当基表的某些字段发生改变时,可以通过修改视图来保持视图和基本表之间一致

  • 因为视图本身没有数据,因此对视图进行的dml操作最终都体现在基表中,有下列内容之一,视图不能做DML操作:

    • ①select子句中包含distinct
    • ②select子句中包含组函数
    • ③select语句中包含group by子句
    • ④select语句中包含order by子句
    • ⑤select语句中包含union 、union all等集合运算符
    • ⑥where子句中包含相关子查询
    • ⑦from子句中包含多个表
    • ⑧如果视图中有计算列,则不能更新
    • ⑨如果基表中有某个具有非空约束的列未出现在视图定义中,则不能做insert操作
-- 删除
drop[IF EXISTS] view viewname;

删除视图是指删除数据库中已存在的视图,删除视图时,只能删除视图的定义,不会删除数据,也就是说不动基表
如果视图不存在,则抛出异常;使用IF EXISTS选项使得删除不存在的视图时不抛出异常。

存储过程(PROCEDURE)

我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
MySQL存储过程创建的格式:

CREATE PROCEDURE 过程名 ([过程参数[,...]]) [特性 ...] 过程体
  • (1)这里需要注意的是DELIMITER //和DELIMITER ;两句,DELIMITER是分割符的意思,因为MySQL默认以";“为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将”;"当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。
  • (2)存储过程根据需要可能会有输入、输出、输入输出参数,如果有多个参数用","分割开。
    MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如:CREATE PROCEDURE([[IN |OUT |INOUT ] 参数名 数据类形…])
    IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
    OUT 输出参数:该值可在存储过程内部被改变,并可返回
    INOUT 输入输出参数:调用时指定,并且可被改变和返回
  • (3)过程体的开始与结束使用BEGIN与END进行标识。
  • 存储过程简单来说就是为以后的使用而保存的一条或多条SQL语句的集合。
  • 存储过程实际上是一种函数,所以在使用的时候后面的括号时必须有的,即使没有参数
  • 使用参数
    • 一般存储过程不显示结果,而是把结果返回给指定的变量(variable)
  • 存储过程的参数允许的数据类型与表中使用的数据类型相同,但不能通过一个参数返回多个行和列
  • 所有MySQL变量都必须以@开始
  • 使用declare定义局部变量
    • 变量定义DECLARE variable_name [,variable_name…] datatype [DEFAULT value];其中,datatype为MySQL的数据类型,如:int, float, date, varchar(length)
  • MySQL存储过程的调用用call和你过程名以及一个括号,括号里面根据需要,加入参数,参数包括输入参数、输出参数、输入输出参数。
  • MySQL存储过程的修改ALTER PROCEDURE更改用CREATE PROCEDURE 建立的预先指定的存储过程,其不会影响相关存储过程或存储功能。
  • MySQL存储过程的删除删除一个存储过程比较简单,和删除表一样:DROP PROCEDURE从MySQL的表格中删除一个或多个存储过程。

游标(CURSOR)

游标是一个存储在MySQL服务器删的数据库查询,他不是一条select语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览器中的数据

使用游标涉及几个明确的步骤。

  • 1、在能够使用游标前,必须声明(定义)它。这个过程实际上没有检索数据,它只是定义要使用的 SELECT语句。
  • 2、一旦声明后,必须打开游标以供使用。这个过程用前面定义的SELECT语句把数据实际检索出来。
  • 3、对于填有数据的游标,根据需要取出(检索)各行。
  • 4、在结束游标使用时,必须关闭游标。

在声明游标后,可根据需要频繁地打开和关闭游标。在游标打开后,可根据需要频繁地执行取操作。
找了很多博客,就属这边大佬的博客给我讲明白了链接地址

触发器(TRIGGER)

触发器是MySQL相应delete、insert和update语句时,自动执行的一条SQL语句(或位于begin和end语句之间的一组语句)

  • 只有表才支持触发器,视图或临时表不支持触发器
  • 创建时需要给出的信息
    • 唯一的触发器名
    • 触发器关联的表
    • 触发器应该响应的活动
    • 触发器何时执行
  • 每个表每个事件每次只允许一个触发器(所以最多支持6个触发器)
  • MySQL触发器中不支持call语句,如果非要执行存储过程,就必须将所需的代码复制到触发器内