【读书笔记】《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语句,如果非要执行存储过程,就必须将所需的代码复制到触发器内
上一篇: Charles安装及使用教程
下一篇: Oracle 触发器小结