程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

SQL - 视图(View) 180

balukai 2025-02-11 10:56:33 文章精选 9 ℃

视图是一张虚拟表,它是由一张表或多张表的部分数据的综合数据构成,其结构和数据是建立在对表的查询基础上;视图中查询出的数据是基于真实表中的数据,本身并不保存具体数据(与存储过程类似都非常依赖于真实的表数据)

视图的分类:普通视图(本章节所说)与索引视图(*)

视图在查询操作上和数据表没有什么区别,与数据表的差异是其本质是不同:数据表中的数据是实际存在的,是存储记录的地方,而视图并不保存任何记录数据

相同的数据表,可根据不同用户的不同需求创建不同的视图(即不同的查询语句)视图的目的是方便查询,因此一般情况下只做查询使用,不会对视图进行增/删改的操作

使用视图的优点:1)可以筛选表中的行/列 2)防止未经许可的用户访问敏感数据(相当于设置了权限) 3)降低数据库的复杂程度

创建视图的方式:

1 通过SQL语句创建

--1 通过SQL语句创建视图
CREATE VIEW vw_student
AS
SELECT SId,CName,SName,SAge,SGender FROM dbo.Student AS stu
INNER JOIN dbo.Class AS cls ON cls.CId = stu.SCId
go; --批处理语句,看情况使用
--查询视图中的数据
SELECT * FROM vw_student

注释:
1)视图中的 * 不再表示源表中的所有字段
2)优点1:只需查询想要的列数据
优点2:查询数据时,给不同权限的人,构建不同的视图,保护隐秘数据如 密码,手机号等
优点3:简化SQL语句,只需一个视图名,不再编写许多SQL语句

2 通过数据库的管理器窗体创建

1)选择要创建视图的数据库 2)在该数据库下的视图选项右击一>"新建视图"

选中图中要查询的表,单击"添加"按钮即可将相应的表添加到窗口中

--上图中设置好的保存结果与下面的视图语句执行效果一样
CREATE VIEW vw_mydatas
AS
SELECT TOP (100) PERCENT dbo.Student.SId, dbo.Class.CName, dbo.Student.SName, dbo.Student.SAge, dbo.Student.SGender, dbo.Student.SDatetime
FROM dbo.Class 
INNER JOIN
dbo.Student ON dbo.Class.CId = dbo.Student.SCId AND dbo.Class.CId = dbo.Student.SCId
WHERE   (dbo.Student.SId < 16)
ORDER BY dbo.Student.SId, dbo.Class.CName, dbo.Student.SName
go;

注释:
TOP (100) PERCENT:百分之百即查询出所有数据

使用视图注意事项:

1)视图中的查询不能使用order by,除非指定了top语句;因为视图被认为是一个虚拟表,而表是一个集合,是不能有顺序的,通过order by 语句则返回的是一个有顺序的,是一个游标

2)在视图中使用order by 语句需要添加 top percent语句

3)如果指定列名,则列名必须唯一(使用*不考虑,表示视图中的所有列)

4)create view vw_name as 后不能跟 begin end 语句(相当于C#中的 {} 大括号)

上图可看出:即使在视图中进行了排序,通过视图名查询数据时也是无序的数据,因此排序语句尽量不要写在视图中 1)没用 2)影响查询效率

--切换至视图所在的数据库
--修改指定视图中的语句
alter view vw_name
as
具体的SQL语句

--删除指定视图
drop view vw_name

3 对视图进行增删改操作(可能报错)

--插入数据
--SId,CName,SName,SAge,SGender,SDatetime
INSERT INTO vw_mydatas(CName,SName,SAge,SGender,SDatetime)
VALUES('民国','孙中山',55,1,'1912-1-1')

报错信息:视图或函数 'vw_mydatas' 不可更新,因为修改会影响多个基表
原因在于:此视图 1:基于多张表的数据 2:只查询了某些行列数据
而增删改操作只是对某张表中的某个字段进行操作
会遇到如表中有的不能为空的字段而视图中没有
增删改操作无法为没有的字段进行赋值(具体错误不再一一详列)

执行测试基于一张表的视图的增删改查

视图的创建应用了解即可,一般程序开发中不会使用视图,因为基本的SQL语句就可满足开发需求;视图的最大缺点就是不能随意的进行增删改操作(有许多限制)

通过ADO.Net编程调用视图查询数据,使用执行sql语句的方法,不能使用存储过程的方法

#妙笔生花创作挑战#

最近发表
标签列表