视图(view)是一个虚拟表,非真实存在,其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用视图名称即可获取结果集,并可以将其当作表来使用。
数据库中只存放了视图的定义,而并没有存放视图中的数据。这些数据存放在原来的表中。
使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。因此,视图中的数据是依赖于原来的表中的数据的。一旦表中的数据发生改变,显示在视图中的数据也会发生改变。
可以简化代码,可以把重复使用的查询封装成视图重复使用,同时可以使复杂的查询易于理解和使用。
更加安全,如果一张表中有很多数据,很多信息不希望让所有人看到,此时可以使用视图视,如:社会保险基金表, 可以用视图只显示姓名、地址,而不显示社会保险号和工资数等,可以对不同的用户,设定不同的视图。
格式
参数说明
可以用show full tables查看表与视图,会显示类型。直接用show tables时表与视图也都会显示但是不会显示类型。
修改视图是指修改数据库中已存在的表的定义。当基本表的某些字段发生改变时,可以通过修改视图来保持视图和基本表之间一致。MySQL中通过CREATE OR REPLACE VIEW语句和ALTER VIEW语句来修改视图。
格式:
某些视图是可更新的。也就是说,可以在UPDATE、DELETE或INSERT等语句中使用它们, 以更新基表的内容。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。如果视图包含下述结构中的任何一种,那么它就是不可更新的:
视图中虽然可以更新数据,但是有很多的限制。一般情况下,最好将视图作为查询数据的虚拟表,而不要通过视图更新数据。因为,使用视图更新数据时,如果没有全面考虑在视图中更新数据的限制,就可能会造成数据更新失败。
在调用时用 call 储存名 ();
格式
用户自定义,在begin/end块中有效
赋值
MySQL中可以用SET为变量赋值,还可以使用SELECT ... INTO语句为变量赋值。
案例
格式
用户自定义,当前会话(连接)有效。类比java的成员变量
案例
由系统提供,在整个数据库有效。
格式
操作
由系统提供,当前会话(连接)有效
格式
操作
in 表示传入的参数,可以传入数值或者变量,即使传入变量,并不会更改变量的值可以内部更改,仅仅作用在函数范围内。
out表示从存储过程内部传值给调用者
inout表示从外部传入的参数经过修改后可以返回的变量,既可以使用传入变量的值也可以修改变量的值( 即使函数执行完)
IF语句包含多个条件判断,根据结果为TRUE、FALSE执行语句,与编程语言中的if、else if、else语法类似,其语法格式如下:
CASE是另一个条件判断的语句,类似于编程语言中的switch语法
循环有while、repeat、loop三种。循环是一段在程序中只出现一次,但可能会连续运行多次的代码。循环中的代码会运行特定的次数,或者是运行到特定条件成立时结束循环。
循环控制:leave 类似于break,跳出;iterate类似于continue,继续,结束本次循环,继续下一次。
标签可省略
游标(cursor)是用来存储查询结果集的数据类型,在存储过程和函数中可以使用光标对结果集进行循环的处理。光标的使用包括光标的声明、OPEN、FETCH 和CLOSE。
异常处理-HANDLER句柄
MySq|存储过程也提供了对异常处理的功能:通过定义HANDLER来完成异常声明的实现.
官方文档: https://dev.mysql.com/doc/refman/5.7/en/declare-handler.html
格式
handler_action 是异常发生后要怎么做,condition_value是触发的条件,statement是要额外执行的代码
特别注意:
在语法中,变量声明、游标声明、handler声明是必须按照先后顺序书写的,否则创建存储过程出错。
创建函数需要设置创建函数权限
set global log_ bin_trust_function_ creators = TRUE;
格式
在MySQL中,创建存储函数使用create function关键字,其基本形式如下:
参数说明:
在调用时用 select func_name();
1.创建只有一个执行语句的触发器
2.创建有多个执行语句的触发器
触发事件有insert、delete、update三种
MySQL中定义了NEW和OLD,用来表示触发器的所在表中,触发了触发器的那--行数据,来引用触发器中发生变化的记录内容。
触发器类型 | 触发器类型NEW和OLD的使用 |
INSERT型触发器 | NEW表示将要或者已经新增的数据 |
UPDATE型触发器 | OLD表示修改之前的数据,NEW表示将要或已经修改后的数据 |
DELETE型触发器 | OLD表示将要或者已经删除的数据 |
NEW.columnName (columnName为相应数据表某一-列名)