数据库SQL语言语法总结5---视图

一 :创建
(只创建逻辑结构,没有实际的数据)(视图就是显示物理数据,不额外创建其他数据)
create view <视图名> [(<列名1>[,<列名2>]…)] as <子查询> [with check option]
作用:显示符合子查询条件的列1 列2…….
[with check option]表示当用户做更新操作时,是否进行约束条件的检查(例2将详细叙述)

下面结合几个例子帮助各位看客来了解以上语句的用法:

前提条件:
数据库中现存在3个关系表
Student (Sno ,Sname,Ssex,Sage,Sdept);
解释:学生(学号,学生姓名,学生性别,学生年龄,学生专业);
Course(Cno,Cname,Cpno);
解释:课程(课程号,课程名,可能的先修课程);
SC(Sno,Cno,Grade);
解释:学生选课情况(学号,课程号,成绩)

例1:显示IS专业的学生的学号,姓名,年龄,并将视图名改为IS_ Student—————— create view IS_Student as select Sno,Sname,Sage from Student where Sdept = ‘IS’

例2:显示IS专业的学生的学号,姓名,年龄,并将视图名改为IS_ Student—————— create view IS_Student as select Sno,Sname,Sage from Student where Sdept=’IS’ with check option

[with check option]的意思是,当用户插入新的记录时,视图检测是否满足约束条件(Sdept=’IS’),不加[with check option]则数据库不检测专业是否为IS。

例3:显示IS_ S1视图,其中包换学号姓名和年级这三个属性,这个视图描述的是专业为IS且选修了1号课程的学生—————create view IS_S1(Sno,Sname,Grade) as select Student.Sno,Sname,Grade from Student,SC where Sdept = ‘IS’ and Student.Sno=SC.Sno and SC.cno=’1’ (此例中属性列名称必不可少,且Sno因为在Student和SC中都存在,所以必须显性指出是Student下的)

例4: create view IS_S2 as select * from IS _S1 where Grade >=90 ——在例3的基础上筛选出分数在90分以上的学生的信息(此例子只为表明select可以从视图中选择查询)

例5: 显示视图,显示每个学生的学号和选修的课程的平均分—————create view S_G(Sno,Gavg) as select Sno,avg(Grade) from SC group by Sno

二:删除视图
drop view <视图名>
例: drop view IS_S1 ——–将这个视图清除,并且使建立在此视图基础上的其他视图都不再起作用

三:查询视图
例1:select * from IS_Student where Sage<20 (IS _Student详细信息来自于一中的例2) 这个语句在数据库内部被转化为 select Sno,Sname,Sage from Student where Sdept=’IS’ and Sage <20

例2: 查询IS专业且选修了1号课程的学生的学号和姓名————select Sno,Sname from IS_Student,SC where IS _Student.Sno=SC.Sno and SC,Cno=’1’ (from后可以跟视图和关系表)

例3:查询平均分>=90的学生的学号和平均分————–select * from S_G where Gavg>=90 (S _G详细信息来自于一中的例5)

四:更新视图
例1:update IS_Student set Sname=’刘晨’ where Sno=’95020’;
在数据库内部等价于 update Student set Sname=’刘晨’ where Sno=’95020’ and Sdept=’IS’; (如create 视图时没有加 with check option ,则数据库内部等价于update Student set Sname=’刘晨’ where Sno=’95020’)

例2: insert into IS_Studnet values(‘95020’,’赵新’,20); 如创建视图时加with check option,则数据库内部等价于 insert into Student(Sno,Sname,Sage,Sdept) values(‘95020’,’赵新’,20,’IS’),否则则等价于Student(Sno,Sname,Sage) values(‘95020’,’赵新’,20)专业为空

当然有些视图不允许更新:
1)视图由两个以上的基本表导出
2)视图的字段来自字段表达式(经过运算)或常数
3)视图的字段来自集合函数
4)视图定义含group by子句(存在group by语句 时查询也会受到影响)
5)视图定义中含distinct短语
6)视图定义中有嵌套查询,并且内层查询中的from子句设计的表也是导出该视图的基本表
7)一个不允许更新的视图上定义的视图也不允许更新

不允许更新视图时就不要将数据的更新操作的权利下放给用户

你可能感兴趣的:(数据库)