前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL语句创建视图:

SQL语句创建视图:

作者头像
初阶牛
发布2023-02-25 09:56:52
1.5K0
发布2023-02-25 09:56:52
举报
文章被收录于专栏:C语言基础

目录

视图的定义:

定义: 根据用户的各种需求重新构造表的数据结构,这种数据结构就是视图. 视图是从一张或多张表中导出来的表,它不是真实存在的基本表,而是一张虚表,并没有像基本表一样存储在数据库中,而是相当于一个查询结果集合保存一样.

基本概念: 视图同其它基本表一样,也包含了带有各种名称和列的数据行,对表能进行的查询,插入修改对视图同样可以,并且视图是动态生成的,对依赖的基本表中的数据修改,视图也会自动更新.

视图的优缺点: 优点:

1)安全性: 用户通过视图只能查看基本表中的部分数据,未符合要求的数据并没有被筛选出来,对于其它数据用户既看不到也操作不了.数据库授权命令可以限制用户对数据库检索到特定的数据库对象中上,但不能细致到限制为数据库中特定的行和列上.

例如: 基本表为:(1)班全体学生 视图为:年龄大于18的男学生

当我们设置号权限后,用户就只能查看符合要求的男学生信息,对于不符合条件的男学生和女学生的信息则既看不到,也操作不了.

2)简单性: 可以根据不同的需求创建不同的视图,简化用户的操作.

3)逻辑数据独立性: 视图可以在应用程序与数据表之间,起到让双方在一定程度上独立的作用. 即程序可以建立在视图上,当数据表发生变化时,可以在表上修改视图,通过视图屏蔽表的变化,从而使应用程序可以不改变.反之,当应用程序发生变化时,也可以在表上修改视图,屏蔽应用的变化.

缺点::

1)影响查询效率: 由于数据库,管理系统必须把对视图的查询转化为对基本表的查询,当一个视图是由复杂的多个表连接定义时,即使对视图进行一个简单的数据查询也需要转变为一个复杂的多表查询,耗费一定的时间.

2)修改受限制: 对于复杂的视图,视图中的部分来源表中有数据不能被修改将导致视图也不能被修改.

一、创建视图

范例中的数据库在前几篇文章有提到,想要获取数据库中的数据可以翻看前几篇复制获取数据. 数据库和数据表的创建 对表添加数据

代码语言:javascript
复制
			student表
代码语言:javascript
复制
			course表
代码语言:javascript
复制
			sc表

创建视图的格式:

代码语言:javascript
复制
create view 视图名
as
查询语句

🌰栗子 (1)创建一个名为stuview2的水平视图,从数据库student infoStudent表中查询出性别为“”的所有学生的资料。 并在创建视图时使用with check option。(注:该子句用于强制视图上执行的所有修改语句必须符合由select语句where中的条件。) 解释: WITH CHECK OPTION的作用?

1.对于update,有with check option,要保证update后,数据要被视图查询出来; 2.对于delete,有无with check option都一样; 4.对于insert,有with check option,要保证insert后,数据要被视图查询出来; 5.对于没有where 子句的视图,使用with check option是多余的。

语句:

代码语言:javascript
复制
create view stuview2--表示创建一个名为stuview2的视图
as
select * from student where sex='男'
with check option

查看视图:

语句:

代码语言:javascript
复制
select * from stuview2

执行结果:

在这里插入图片描述
在这里插入图片描述

(2)创建一个名为stuview3的投影视图,从数据库student_info的Course表中查询学分大于3的所有课程的课程号、课程名、总学时。并在创建时对该视图加密。(提示:用with ENCRYPTION关键子句) 语句:

代码语言:javascript
复制
create view stuview3 with ENCRYPTION--创建视图并加密
as
select Cno , Cname , Total_perior from course where credit>3

(3)创建一个名为stuview4的视图,能检索出“051”班所有女生的学号、课程号及相应的成绩。

代码语言:javascript
复制
create view stuview4
as
select * from sc 
where sno=(
select sno from student
where classno='051' and sex='女')

(4)创建一个名为stuview5的视图,能检索出每位选课学生的学号、姓名、总成绩。

代码语言:javascript
复制
create view stuview5
as
select student.sno 学号,sname 姓名 ,Grade 成绩 from student,sc
where student.Sno=sc.sno

二、查询视图的创建信息及视图中的数据

(1)查看视图stuview2的创建信息。

a.通过系统存储过程sp_help查看

代码语言:javascript
复制
sp_help stuview2

执行结果:

b.通过查询表sysobjectsa、 –b

代码语言:javascript
复制
select so.name , sc.name , sc.colid, st.name
from sysobjects so , syscolumns sc, systypes st 
where so.id = sc.id
	and so.xtype = 'v'
	and so.status >= 0
	and sc.xtype = sT.xusertype
	and so.name = 'stuview2'
order by so.name,sc.colorder

执行结果:

(2)通过查看视图的定义脚本。

a.通过系统存储过程sp_helptext

代码语言:javascript
复制
sp_helptext stuview2

执行结果:

b.通过查询表sysobjects和表syscomments (提示:视图的名称保存在表sysobjects的name列,定义脚本保存在表syscomments的text列)

代码语言:javascript
复制
select so.name , sc.text
from sysobjects so, syscomments sc where so.id = sc.id
and so.xtype = 'v'and so.status >= 0
and so.name = 'stuview2'

执行结果:

在这里插入图片描述
在这里插入图片描述

3)查看加密视图stuview3的定义脚本。

代码语言:javascript
复制
sp_helptext stuview3

执行结果:

在这里插入图片描述
在这里插入图片描述

三.修改视图的定义

(1)修改视图stuview3使其从数据库Student_info的student表中查询总学时大于60的所有课程的课程号、课程名、学分。(提示:若视图原具有加密保护,修改视图时若未加with encryption子句,则修改后的视图不再加密。)

代码语言:javascript
复制
alter view stuview3
with encryption
as
select Cno ,Cname , credit from course 
where Total_perior>60

查看视图:

代码语言:javascript
复制
select * from stuview3

四.视图的更名与删除

1)用系统存储过程sp_rename将视图stuview4更名为stuv4。

代码语言:javascript
复制
sp_rename stuview4, stuv4

运行结果:

在这里插入图片描述
在这里插入图片描述

五.管理视图中的数据

1)从视图stuview2查询出班级为“051”、姓名为“张虹的资料。

代码语言:javascript
复制
select * from stuview2
where classno='051' and sname='张虹'

2)向视图stuview2中插入一行数据,内容为:

学号

姓名

学号

性别

家庭住址

入学时间

出生年月

20110009

赵小林

054

南京

2011/09/01

1993/01/09

语句:

代码语言:javascript
复制
insert into stuview2
values ( '20110009','赵小林','男','1993/01/09', '054','2011/09/01',
		'南京','CH ','201111')
--查看视图:
select * from stuview2

可以观察到视图中已经有了赵小林的信息. 3)查询student,查看表中的内容有何变化。Student表中是否也已有“赵小林”的信息 语句:

代码语言:javascript
复制
select * from student--查询student表
在这里插入图片描述
在这里插入图片描述

4)向视图stuview2中插入一行数据,内容为:

学号

姓名

学号

性别

家庭住址

入学时间

出生年月

20110010

赵静

054

南京

2011/09/01

1993/11/09

问题:能成功插入吗?原因何在?

答案: 不能插入,原因是目标视图或者目标视图所跨越的某一视图指定了WITH CHECK OPTION,而该操作的一个或多个结果行又不符合CHECK OPTION 约束。

在这里插入图片描述
在这里插入图片描述

5)修改视图stuview2中的数据。

a.将stuview2中054班、姓名为“赵小林”同学的家庭地址改为“扬州市”。

代码语言:javascript
复制
update stuview2
set Home_addr='扬州市'
where Home_addr='南京' and sname='赵小林' and classno='054'

b.查询student,查看表中的内容有何变化student表中的赵小林的家庭住址已发生了改变

代码语言:javascript
复制
select * from student

运行结果:

在这里插入图片描述
在这里插入图片描述

6)从视图stuview1中将班级为054、姓名为“赵小林”同学删除。

代码语言:javascript
复制
delete from stuview2
where sname=’赵小林’’

好了,今天的SQL Server知识就分享到这里了.下一篇将会是SQL server中存储过程的介绍, 希望这篇文章对大家有帮助。欢迎小伙伴们私信提意见和提问哦! 最后,小伙伴们的点赞就是给牛牛最大的支持,能不能给牛牛来一个一键三连呢?谢谢支持。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-02-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 视图的定义:
  • 一、创建视图
  • 二、查询视图的创建信息及视图中的数据
  • 三.修改视图的定义
  • 四.视图的更名与删除
  • 五.管理视图中的数据
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档