视图的概念:
- 视图对象是一个虚拟的表,虚拟表所包含的结果集是对一个或多个表的查询。
- 视图本身不保存这个结果集,而是保存查询的定义。
- 视图的定义是对已经存在表的查询。
- 使用视图和使用表很类似,可以把视图当做一个表来查询,SQL Server动态执行视图的定义得到的结果集。
视图与表的区别:
- 视图能为用户集中组织数据
数据库表中所包含的列并不一定都是用户所需要的数据,有些列多用户是无用的,而有些用户需要的列又被分散在多个不同的表中。使用视图可以把用户需要的列组织起来给用户使用。
- 视图可以隐藏数据库的复杂性
如果没有视图对象,用户就需要了解数据库的实体关系的模型,了解每个表的设计等等,然后通过复杂的查询语句获得需要的数据。创建视图后,用户无需再了解表的设计和表间的关系,只要使用简单的语句:“select * from 视图名称”,就能得到所需要的数据了。
- 简化用户权限的管理
当源表中的部分列是敏感数据,例如×××、信用卡号码等的时候,管理员需要对列设置权限,这对权限管理来说不是很方便。利用视图,可以把有权限的列放到视图中,然后同统一为视图对象授权。
- 为应用程序组织和输出数据
在应用程序中既可以直接查询表,也可以查询视图。但是查询表会有如下潜在的问题:
不利于开发:对应用程序开发人员来说,需要详细了解数据库中所有表的设计。这对应用程序开发者来说要求比较高,也比利于生产力的提高。
不利于维护:当数据库的设计更改的时候,因公程序也需要重新编写,不利于程序后期的维护。使用视图组织数据可以避免这两个问题。
创建单表视图:
create view 学生表视图 as select * from student where sex='男'
利用视图插入数据
insert into 学生表视图 (name,sex,age,diqu)values('臭小子','男',23,'太原')
insert into 学生表视图 (name,sex,age,diqu)values('臭小子','男',23,'太原')
利用视图修改数据
update 学生表视图 set age=21 where name='臭小子'
利用视图删除数据
delete from 学生表视图 where name='臭小子'
建立本库四个表的视图的脚本语言为:
建立视图的脚本
SELECT dbo.teacherinfo.teachername, dbo.score.kemu, dbo.student.number AS Expr1, dbo.student.name AS Expr2, dbo.student.sex AS Expr3,
dbo.student.age AS Expr4, dbo.student.*, dbo.chengji.score, dbo.teacherinfo.teacherid, dbo.score.scorenumber
FROM dbo.chengji INNER JOIN
dbo.score ON dbo.chengji.scorenumber = dbo.score.scorenumber INNER JOIN
dbo.student ON dbo.chengji.number = dbo.student.number INNER JOIN
dbo.teacherinfo ON dbo.score.teacherid = dbo.teacherinfo.teacherid
SELECT dbo.teacherinfo.teachername, dbo.score.kemu, dbo.student.number AS Expr1, dbo.student.name AS Expr2, dbo.student.sex AS Expr3,
dbo.student.age AS Expr4, dbo.student.*, dbo.chengji.score, dbo.teacherinfo.teacherid, dbo.score.scorenumber
FROM dbo.chengji INNER JOIN
dbo.score ON dbo.chengji.scorenumber = dbo.score.scorenumber INNER JOIN
dbo.student ON dbo.chengji.number = dbo.student.number INNER JOIN
dbo.teacherinfo ON dbo.score.teacherid = dbo.teacherinfo.teacherid
因为四个表中存在多个主外键关系,所有不能利用视图插入或删除源表数据,我们使用视图来完成部分第3节查询脚本。
--1、查询出所有大连地区的学生的成绩。
select score from alltable where diqu='大连'
--2、查询有考试成绩纪录的学生的信息.
select name,age,sex,平均分=avg(score) from alltable group by name,age,sex
--3、将所有大连地区学生的课程编号为3的课程成绩加10分。
update alltable set score=score+3 where scorenumber=3
select score from alltable where diqu='大连'
--2、查询有考试成绩纪录的学生的信息.
select name,age,sex,平均分=avg(score) from alltable group by name,age,sex
--3、将所有大连地区学生的课程编号为3的课程成绩加10分。
update alltable set score=score+3 where scorenumber=3
©著作权归作者所有:来自51CTO博客作者叶子文文的原创作品,如需转载,请与作者联系,否则将追究法律责任
0
收藏
推荐专栏更多
猜你喜欢
我的友情链接
XX阅读平台-性能分析调研
IntelliJ Idea 常用快捷键列表
用Kibana和logstash快速搭建实时日志查询、收集与分析系统
Windows路由表详解
标准SQL的update语句三种用法
常用邮箱、网盘地址列表
oracle表分区详解
SQL自动审核-自助上线平台 V2.0
最权威的×××号码的正则表达式
某酒店2000W条数据如何打开及查询
希捷硬盘保修时间查询
PostgreSQL的B-tree索引
PostgreSQL pg_rewind实例--could not find previous WA
redis geo 地理位置系应用战案例
PostgreSQL逻辑备份pg_dump使用及其原理解析
PostgreSQL如何删除不使用的xlog文件
PostgreSQL pg_ctl start超时分析
Greenplum -- segment 死机后恢复
postgresql 主备及切换-恢复方案
扫一扫,领取大礼包
转载于:https://blog.51cto.com/leafwf/185774
Ctrl+Enter 发布
发布
取消