本篇主要介绍的是创建简单的视图,和利用视图简化复杂的表连接,以及视图的销毁和使用视图的注意事项。
与前面介绍的创建表、创建索引相似,视图的创建主要是由CREATE VIEW关键字实现的,视图的销毁则是由DROP VIEW关键字实现的。其数据则由SELECT语句定义。语法CREATE VIEW [ (column1,column2……)]ASSELECT FROM [(column1, colum)]为可选项。
缺省时,为子查询结果中的字段名。SELECT语句指明了视图中的字段及其数据。关于视图我们还要强调两点。视图创建后, 在数据字典中只存放视图的定义,而其中的SELECT语句并不执行。只有当用户对视图进行操作时,才按照视图的定义将数据从基本表中取出。
为表中的一-列或者几列信息创建视图,为StudentInfo表中的姓名( sname).生源( address )信息创建一个 视图NameAddress_ View。示例代码如下。CREATE VIEWNameAddress ViewASSELECT sname,address FROM StudentInfo
用户可以通过创建视图进行数据查询。例如,一个表有50列,有成千上万行,而用户只需要使用表中的两列数据,这时,我们可以为这两列创建一个视图,在视图中查询注意需要的数据,这样会大大提高查询效率。
创建与表具有不同字段名的视图前面实例创建的视图,并没有特别指明视图的字段名,系统就默认为与表相同的字段名。实际上,创建视图时,我们也可以为表中的数据定义新的字段名。
比如为表创建具有不同字段名的视图并查看其信息为StudentInfo 表中所有男同学的sname、 address 字段创建一-个 视图NewColumnName_View,这两个字段的字段名定义为Boy_ Name和Boy_ _Address代码如下CREATE VIEW NewColumnName_View (Boy_ Name, Boy_ Address,sex)ASSELECT sname, address, sexFROM StudentInfoWHEREsex =,男'
实际应用时,我们要注意新定义的字段名与表中数据的对应关系。利用视图简化表的复杂连接视图的一个重要用途就是进行复杂的SQL数据处理。通过创建视图,我们可以实现多表之间的复杂连接。将频繁使用的连接定义成视图后,用户就不必每次使用时都要指定复杂的连接条件了。
比如3个相互关联的表学生信息表(StudentInfo)、招生信息表( RecruitInfo)和院系信息表(Department)。在实际应用中,用户一次查询的记录往往分别存储在这3个不同的表中,如查询“李山”同学所在的系以及高考时所在地区的录取分数线信息。
这时,需要的3个字段sname、dname 和dnum分别在这3个不同的表中。如果我们采用连接表的方式查询,每次查询不同的同学都需要通过复杂的连接条件连接一次表, 显然效率低下;而如果为sname、dname和dnum这3个字段的记录创建一个视图,我们只需要进行一次表的连接,而后相关的查询只要访问视图就可以了,明显提高了查询效率。
创建一视图Join_ View, 包含StudentInfo表中的姓名(sname) 字段、RecruitInfo 表中的系名(dname) 以及Department表中的录取分数(dnum) 的信息。示例代码如下。CREATE VIEW Join ViewASSELECTsname,dname, scoreFROMStudentInfo,Department, RecruitInfoWHERE StudentInfo.address = RecruitInfo. AddressANDStudentInfo.dno = Depar tment . dno
创建了视图Join_ View 后,用户以后需要对姓名(sname)、 所在系名(dname) 以及所在的录取分数(dnum)的信息查询,只要对视图Join_ _View进行操作就可以了,而不必每次都对表进行连接。 只需要使用select * from join view查看就行。
视图的销毁在SQL中,我们可以通过DROP VIEW关键字销毁创建的视图。语法如下。DROP VIEW view_ name销毁视图,只需在DROP VIEW关键字后写入视图的名称即可。
使用视图的几点原则一.般情况下,创建和使用视图应遵循以下几点原则。和表一样,视图必须有唯一的名字。不仅视图之间不允许有相同的名字,并且试图与表也不允许拥有相同的名字。视图的创建个数不受限制, 用户可以创建任意多个视图。用户要创建视图,必须从数据库管理员那里得到创建权限。视图可以嵌套, 即可以创建视图的视图。一些数据库管理系统(如SQL Server) 禁止用户在查询语句中使用ORDER BY子句。