@3013216027
2016-01-28T05:18:36.000000Z
字数 2975
阅读 1016
数据库原理复习专栏
create view <视图名> as,后面的语句和之前的select语句一毛一样。换句话说,视图就像一个指向某select语句的指针!CREATE VIEW <视图名> AS <视图定义>;,如:
create view employees_view asselect emp_no as id, concat(first_name, ' ', last_name) as namefrom employees;
便定义了一个视图(相当于一张表),提取了employees表中的3个字段,并且将emp_no重命名(别名, , )为id,将first_name和last_name通过系统字符串函数concat连接并命名为name,因此新的(虚拟)表employees_view包含两个字段id和name。通过show tables;可以看到employees_view和普通的表一样被列了出来,并且可以对它进行任何和普通表一样的操作(增删改查,但前3者仅对可更新视图有效)。
视图查询,如上所述,可以直接通过(虚拟)表employees_view查询其中的信息:select * from employees_view limit 10;、select * from employees_view where name = 'gongbaojin';、select id from employees_view where name = 'Kruskal David';等等。
属性重命名,上例通过在查询语句中使用as实现属性重命名(emp_noid),另外可以通过
CREATE VIEW employees_view(id, name) ASSELECT emp_no, CONCAT(first_name, ' ', last_name)FROM employees;
即在视图名后带上新的属性名来达到同样的效果。
create view RichExec asselect name, address, cert, netWorthfrom MovieExecwhere netWorth > 1000000;
create view StudioPress asselect name, address, certfrom MovieExecwhere (name) in(select (presC\#) from Studio);
create view ExecutiveStar asselect S.name as name, S.address as address, gender, birthdate, cert, netWorthfrom MovieStar S inner join MovieExec;
drop view <视图名>,就删掉了。根据前面的比喻,我们相当于删除了一个指针,或者说一个快捷方式,原本的数据表不受任何影响。可更新视图,要求:视图是由从单个关系(就是单个表,当然,可以是虚拟表视图)中选取的一些属性组成(简单,注意如果是则不行,因为选取出数据后会去重,相当于破坏了最原始的取出的那份数据)。于是:
满足上述条件便可以通过更新视图来同时达到更新关系的效果。对满足上述条件的视图,也就可以愉快地更新了。
create view fox asselect title, yearwhere studioName = 'Fox';
可以选出所有福克斯电影公司的电影及其年份。它满足上面的可更新视图的要求,我们自然知道,该视图中仅存放了福克斯公司出品的电影,但在插入时却会被自动设置为,于是可以使用一个触发器来代替完成插入功能:
create trigger foxInsertinstead of insert on foxreferencing new row as newrowfor each rowinsert into Movies (title, year, studioName)values (newrow.title, newrow.year, 'Fox');
当然,话说回来,劳资费这劲儿干嘛呢!
CREATE INDEX <索引名> ON <关系名>(<欲用以建立索引的属性名>),如create index keyindex on Movies(title, year);DROP INDEX <索引名>索引的选择,最有用的索引是建立在主键上的索引,原因:
where语句来使用但是事实上,一般只要保证被索引的属性上存在相同属性值的元组比较少就可以起到比较好的效果。
| 操作 | 无索引 | 索引 | 索引 | 索引 | 概率 |
|---|---|---|---|---|---|
| 平均 |
CREATE MATERIALIZED VIEW MovieProd ASSELECT title, year, nameFROM Movies, MovieExecWHERE producer = cert;
当然,是不资瓷这个东西的。