视图+触发器+临时表+派生表
作为常用的数据对象,视图为数据查询提供了一条捷径;触发器为数据自动维护提供了便利;而临时表和派生表也在一定程度方便了数据查询与维护。
1.视图
视图和表有很多相似的地方,也是由若干个字段以及若干条记录构成的,它也可以作为select语句的数据源。甚至在某些特定条件下,可以通过视图对表进行更新操作。然而,本质上视图中的数据并不占用存储空间,视图中保存的仅仅是一条select语句,其源数据都来自于数据库表,数据库表称为基本表或者基表,视图称为虚表。
(1)格式:
create view 视图名
as
select语句
例如:create view view_table1
as
select * from table1;
(2)查看视图的定义
desc 视图名;
(3)show tables包含了所有的基表,也包含了所有的视图
(4)MYSQL系统数据库的information_schema的views表存储了所有视图的定义
select * from information_schema.views
(5)删除视图
drop view 视图名
(6)检查视图
视图是一个基于基表的虚表,数据库开发人员不仅可以通过视图检索数据,还可以通过视图修改数据,这就好比数据库开发人员不仅可以通过窗户查看房屋内的布局,还可以通过窗户修改方案内的布局,这种视图称为普通视图。创建视图时,没有使用"with check option"子句的视图都是普通视图。
格式:
create view 视图名
as
select语句
with [local|cascaded] check option
创建视图时,没有使用with check option,即with_check_option的值为0,表示视图为普通视图;
使用with check option子句或者with cascaded check option子句时,表示该视图为cascaded视图;
使用with local check option子句时,表示该视图使用local视图。
(7)local与cascaded检查视图
对检查视图进行更新操作时,只有满足了检查条件的更新操作才能顺利执行。
local视图,需要通过视图检查条件的更新语句才能顺序执行。
cascade视图时,需要满足所有针对该视图的所有视图的检查条件才能顺序执行。
2.触发器
触发器是MYSQL 5.0新增的功能,触发器定义了一系列操作,这一系列操作称为触发程序,当触发程序发生时,触发程序会自动运行。触发器主要用于监视某个表的insert,update以及delete等更新操作,从而实现数据的自动维护。
(1)格式:
create trigger 触发器名 触发时间 触发事件 on 表名 for each row
begin
触发程序
end;
其中:触发事件有三种:insert,update,delete;时间有两种:before和after;而for each row表示行级触发器。
注意:触发程序中可以使用old关键字和new关键字。当向表插入新记录时,new表示新记录,可以用new.字段名访问。当从表删除某条记录时,在触发器程序中可以使用old关键字表示旧记录。当修改某条记录时,old表示旧记录,new表示新记录。
举例:如果后续update操作中,up_limit不是60,150,230,就把新记录的up_limit设置为旧记录的up_limit
delimiter $$
create trigger course_update_before_trigger before update on course for each row
begin
if(new.up_limit!=60 || new.up_limit!=150 || new.up_limit!=230) thenset new.up_limit = old.up_limit;
end if;
end;
$$
delimiter;
(2)查看触发器的定义
方式1:show triggers;
方式2:查询information_schemga数据库的triggers表,可以查看触发器的定义
select * from information_schema.triggers\G
方式3:show create trigger
(3)删除触发器
drop trigger 触发器名
3.临时表
按照MYSQL临时表的存储位置,可以将其分为内存临时表以及外存临时表。按照MYSQL临时表的创建时机,可以分为自动创建的临时表以及手工创建的临时表。
当“主查询”中包含派生表,或者当select语句中包含union子句,或者当select语句中包含对一个字段的order by子句时,MYSQL为了完成查询,则需要自动创建临时表存储临时结果集,这种临时表由MYSQL自行创建,自行维护,称为自动创建的临时表。对于自动创建的临时表而言,由于内存临时表的性能更优越,MYSQL总是首先使用内存临时表,而当内存临时表变得太大,达到了某个阈值的时候,内存临时表被转存为外存临时表。也就是说,外存临时表是内存临时表在存储空间上的一种延申。内存临时表被转存为外存临时表的阈值由系统变量max_heap_table_size和tmp_table_size的较小值决定。
另外数据库开发人员也可以根据自身需要,手工创建临时表完成复杂功能,本章主要讲解手工创建临时表的使用方法。
(1)创建临时表:
create temporary table temp(name char(100),id int);
(2)查看临时表
show create table temp\G;
(3)删除临时表
drop temporary table 临时表表名
4.派生表:
派生表类似于临时表,但与临时表相比,派生表的性能更优越。派生表与视图一样,一般在from子句中使用,举例:
select * from (select * from table1) u where u.col1=2;
其中的u就是派生表。