博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据库SQL语言语法总结5---视图
阅读量:4005 次
发布时间:2019-05-24

本文共 2340 字,大约阅读时间需要 7 分钟。

一 :创建

(只创建逻辑结构,没有实际的数据)(视图就是显示物理数据,不额外创建其他数据)
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)一个不允许更新的视图上定义的视图也不允许更新

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

转载地址:http://zdzfi.baihongyu.com/

你可能感兴趣的文章
JVM最简生存指南
查看>>
漂亮的代码,糟糕的行为——解决Java运行时的内存问题
查看>>
Java的对象驻留
查看>>
自己动手写GC
查看>>
Java 8新特性终极指南
查看>>
logback高级特性使用(二) 自定义Pattern模板
查看>>
JVM 线程堆栈分析过程详解
查看>>
JVM并发机制探讨—内存模型、内存可见性和指令重排序
查看>>
可扩展、高可用服务网络设计方案
查看>>
如何构建高扩展性网站
查看>>
微服务架构的设计模式
查看>>
持续可用与CAP理论 – 一个系统开发者的观点
查看>>
nginx+tomcat+memcached (msm)实现 session同步复制
查看>>
c++指针常量与常量指针详解
查看>>
c++字符数组和字符指针区别以及str***函数
查看>>
c++的string类初始化及其常用函数
查看>>
c++类的操作符重载注意事项
查看>>
c++模板与泛型编程
查看>>
STL::deque以及由其实现的queue和stack
查看>>
CS4344驱动
查看>>