视图:
一.什么是视图:
视图是从一个或几个表或视图中导出的虚拟表,其结构和数据来自对表的查询,在物理上是不存在的.建立视图查询的表被称为基表,
视图并不在数据库中以存储的数据值集的形式存在,它的行和列数据都来自基表,并且是视图在被引用时动态生成的.
二.为什么会有视图,视图有哪些好处.
1.提高查询效率:只在建立视图时执行一次查询,以后只需要用一条简单的语句查询视图即可.
2.提高数据安全性:通过视图,用户只能看到和修改可见的数据,对数据库中原始表数据既看不见,也不能访问.
3.定制数据:通过定义视图,可以让不同的用户以不同的方式看到不同或相同的数据,这样不同的用户在共用一个数据库时,能访问
的数据是有区别的.
4.对表的合并和分割:表的数量大时,我们会对表水平或者垂直拆分,用视图可以不用分割表,不会使表结构发生变化.采用视图在保持原有表结构关系的基础上,是程序设计更为简单.
5.对表的影响:对视图的建立和删除不会影响基表,只有对视图内容更新才会直接影响基表,另外,当视图的内容来自多个基表时,
不允许添加和删除数据.
三.创建视图
对视图的操作包括:创建视图,查看视图,修改视图,通过视图操作基表以及删除视图.
创建视图的语法规则:
create view 视图名[列名列表]
as 查询语句
[with check option]
check option是指 用于设置约束检查项
可按照基表的数量分为:单源表视图和多源表视图.
查看视图的方式: desc 视图名 或者 desccribe 视图名.2. 使用show create view 查看视图.
四.修改视图 :
Alter view 视图名
as 查询语句.
或者使用
create [or replace view]
view 视图名[列表名]
as 查询语句
[with check option]
五.通过视图操作基表以及删除视图
insert ,update, delete 可以插入,修改,删除数据,一般情况视图作为查询虚拟表,最后不要通过视图修改表数据.
而且当视图依赖多个数据表时,不允许添加和删除数据.
六.删除视图
语法规则:
DROP VIEW [IF EXISTS]
视图名[,视图名....]
MySql触发器
一.什么是触发器
触发器时一个特殊的存储过程,它与表紧密相连.基于表或视图定义了触发器后, 当表或视图中的数据有对应操作事件发生
时,激活触发器,从而执行触发器中所定义的语句.
在mysql 中 , 只用触发insert ,update , 和delete 语句时 才会执行所设置的操作,其他语句不会激活触发器.
二.触发器能干什么?
1.审计功能,使用触发器跟踪用户对数据库的操作,审计用户操作数据库的语句,把用户对数据库的更新写入审计表.
2.安全性,可以基于时间限制用户操作,可以基于数据库中的数据限制用户的操作.
3.实现复杂的数据完整性规则,触发器与规则不同,触发器可以引用列或数据库对象,可产生比规则更复杂的限制.
4.实现复杂的非标准的数据库相关完整性规则,触发器可以对数据库中相关的表进行连环更新.
三.怎样实现触发器.
创建触发器语法规则:
create tigger tigger_name
befor|after tigger_event
on table_name for each row tigger_stmt
tigger_event 表示触发事件,即触发执行条件,包括insert , update 和delete语句.'
table_name 表示对哪张表进行操作时产生触发事件.
for each row 表示table_name表中任何一条记录进行的操作满足触发条件时都会触发该触发器.
tigger_stmt 表示触发器被激活要执行的语句.
NEW.列名 用于INSERT 语句和UPDATE语句;
old.列名 用于delete 语句和update 语句.
列如:
create tigger insert_xskc1 after insert
on xskc
for each row begin
update number set 选课人数=选课人数+1 where 课程号 = new.课程号;
end;
查看触发器: show tiggers
删除触发器: delete tigger
存储过程和函数
一.什么是存储过程
用户对数据表的操作过程,往往不是单条sql语句就可以实现一个完整的操作目的,而是需要一组sql语句来实现.通过应用程序
调用存储过程和函数,可以接受参数,输出参数,返回多个结果集.
二.为什么用存储过程
为了提高数据库设计人员访问数据的速度,减少sql代码的重复编写,可以利用存储过程和函数管理数据库
三.存储过程和函数优点
存储过程和函数是一种独立的数据库对象,是在服务器上创建和运行的.它与存储在客户本机的本地sql语句相比有以下优点.
1.执行效率高
采用批处理的Transaction-SQL语句,需要每次在运行时都要进行编译和优化,因此效率较低.而存储过程则是在系统首次运行
时就会对其今夕分析和优化,并将其驻留在高速缓存中,从而提高了执行效率
2.模块化程序设计.
一个存储过程就是一个模块,用于封装并实现特定的功能,并在以后的程序中可多次重复调用,从而改进了应用程序的可维护性
3.减少网络流量
客户端调用存储过程和函数时,网络中传送的只是该调用语句,而不必从客户端发送大量的sql语句,从而大大降低了网络流量
和网络负载.
4.存储过程提供了一种安全机制
系统管理员通过执行了某一存储过程的权限进行限制,能够实现对应数据库的访问权限限制,避免了非授权用户对数据的访问.
从而保证了数据的安全.
四.创建存储过程.
语法规则:
CREATE Proceduce proceduce_name([procedure_parameter[,....]])
[characteristic...]routing_body
proceduce_name:所创建存储过程的名称.
proceduce_parameter:存储过程中的参数列表,其中的每个参数语法如下.
proceduce_name 表示参数名称 , type 表示参数类型, 参数类型可以是MySql软件支持的任意一种类型.
Characteristic 参数用于指定存储过程的特性
routing_body 是sql代码的内容.
五.创建函数
语法如下:
create function function_name([function_parameter[,....]])
returns type
[characteristic....]routine_body
function_name 表示所创建的函数名字
function_parameter 表示函数的参数列表,其形式和存储过程相同:
returns type 表示用于指定返回值类型:
characteristic 表示函数特性,其取值与存储过程中取值相同;
routine_body 表示函数的sql语句代码,用begin...end 来标识语句的开始与结束.
例:create definer='root'@'localhost' function 'func_cj'(xh char(10),kch varchar(3))
returns double(5,1)
begin
return(select 成绩 from xskc where xskc.'学号' = xh and xskc.'课程号'= kch);
end$$
六.调用存储过程
例如,调用一个school数据库里的proc_sch 存储过程, 表达方式: call school.proc_sch
七.调用函数
例如: select fun_cj('2016110102','103')成绩;
八.存储过程和函数的区别
1.复杂程度
存储过程的功能强大,可以执行包括修改表,数据查询等一系列数据库操作;函数不能用于对数据进行批量修改,不能实现
对全局数据库状态的操作.因此可以说,存储过程实现的功能要复杂一些,但函数的实现功能针对性比较强.
2.返回值
存储过程可以返回多个参数,如记录集,而函数只能返回或者表对象的一个变量值;存储过程有 in out inout 三种类型,而
函数只有in 一种类型.在定义存储过程和函数时,存储过程不需要声明返回类型,而函数需要声明返回类型,且函数体中必须
包含一个有效的return语句
3.执行
储存过程一般是作为一个独立部分执行的,而函数可以作为查询语句的一个部分使用select 语句来调用,由于函数可以返回
一个表对象,因此它可以在查询语句中位于from 关键字的后面:并且在sql 语句中不能使用存储过程,而函数则可以使用.