一、SQL Server 2016 学习记录 ---视图
1. 视图的概念
- 视图是一种虚拟表,它是从一个或多个表(也可以是其他视图)中通过查询语句导出的数据集合。视图本身不包含数据,其数据是在查询视图时动态生成的。例如,如果你有一个 “员工表”(包含员工编号、姓名、部门等信息)和一个 “工资表”(包含员工编号、工资等信息),可以创建一个视图来展示员工的姓名和工资,这个视图的数据是从这两个表中提取并组合而成的。
- 视图就像是一个窗口,通过这个窗口可以看到数据库中数据的特定部分,并且可以像操作表一样在一定程度上操作视图(如查询、连接等)。
2. 视图的优点
- 简化复杂查询:可以将复杂的多表联合查询、嵌套查询等封装成一个简单的视图。例如,对于一个涉及客户订单、产品信息、发货信息的数据库系统,创建一个视图来展示每个客户的订单详情(包括产品名称、数量、发货日期等),这样在需要获取这些信息时,只需查询视图而不用每次都编写复杂的多表查询语句。
- 提高数据安全性:通过视图可以控制用户对数据的访问权限。例如,只允许用户通过视图访问某些列或者某些行的数据,而隐藏其他敏感信息。如果有一个包含员工敏感信息(如工资、绩效评估等)的表,可以创建一个视图只显示员工姓名和部门等非敏感信息,这样不同权限的用户可以访问到合适的数据。
- 提供数据独立性:如果数据库的底层表结构发生变化(如添加列、修改列名等),只要视图的定义能够适应这种变化,对视图的使用不会受到太大影响。例如,在产品表中添加了一个新的产品描述列,若视图的定义是基于产品表的部分列(如产品名称和价格),那么使用这个视图的应用程序仍然可以正常运行,而不需要立即修改。
3. 视图的创建
-
语法:
create view view_name as select_statement
其中
view_name
是视图的名称,select_statement
是一个查询语句,用于定义视图的数据来源。例如,创建一个简单视图来显示 “学生表”(包含学生姓名、年龄、班级)中所有学生的姓名和年龄:create view student_view as select student_name, student_age from student_table
-
注意事项:
视图的命名应该遵循数据库对象命名的规则,通常要有一定的意义,方便识别视图的用途。
定义视图的查询语句可以包含复杂的 SQL 操作,如连接(JOIN)、子查询、聚合函数(SUM、AVG 等)等。但要注意查询语句的性能,避免创建过于复杂而导致性能低下的视图。
-
视图中的数据操作
-
查询视图:查询视图的方式和查询普通表类似。例如,要从上面创建的
student_view
中查询年龄大于 20 岁的学生姓名,可以使用以下语句:
select student_name from student_view where student_age > 20
-
更新视图(有一定限制):在满足一定条件下,可以通过视图更新底层表的数据。例如,如果视图是基于单个表的简单选择(只包含部分列,且没有进行复杂的计算、分组等操作),那么可以对视图进行更新操作。但如果视图涉及多表连接、聚合函数等复杂操作,通常不允许直接更新。例如,对于一个通过连接 “员工表” 和 “部门表” 创建的视图,展示员工姓名和部门名称,一般不能直接通过这个视图更新员工所属的部门。
-
插入和删除操作(类似更新操作的限制):插入和删除操作也和更新操作一样,对于简单的基于单表的视图,在一定条件下可以进行插入和删除操作,但对于复杂视图,这些操作可能会受到限制或者不允许,因为数据库无法确定如何正确地将操作映射到底层表。
-
-
视图的修改与删除
-
修改视图:可以使用
alter view
语句来修改视图的定义。例如,如果想在
student_view
中添加学生的班级信息,可以使用以下语句:
alter view student_view as select student_name, student_age, student_class from student_table
-
删除视图:使用
delete view
语句来删除视图。例如,要删除
student_view
可以使用以下语句:
delete view student_view
-
注意事项:在修改和删除视图时,要注意可能会对依赖这些视图的应用程序或者其他数据库对象产生影响。例如,如果有其他视图或者存储过程是基于要修改或删除的视图构建的,那么这些对象可能需要进行相应的调整。
-
4. 案例
(1)在学生选课数据库,建立信息系学生的学号、姓名、性别、和年龄视图。
create view IS_Student as
select Sno,Sname,Ssex,Sage from Student
where Sdept = '信息系'
(2)在学生选课数据库中,创建学生选课视图stu_sc2,视图包含学生号、姓名、课程号、成绩,并对创建视图文本进行加密
create view stu_sc2 (学号,姓名,课程号,成绩)
with encryption as
select student.sno,sname,cno,grade
from student inner join sc
on student.sno = sc.sno
(3)创建视图,使其统计每个学生的考试平均成绩和修课总门数
create view avg_count as
select sno, avg(grade) 平均成绩,count(cno) 课程数量 from SC
group by Sno
(3)创建一个包含每门课程的课程号,课程名,选课人数,平均成绩的视图
create view cno_view as
select sc.Cno,course.Cname,count(sc.sno) 选课人数,avg(sc.grade) 平均成绩
from sc join course on sc.Cno = course.Cno
group by sc.Cno,course.Cname
(4)创建每个系的平均年龄的视图sdpt_avg_sage
create view sdpt_avg_sage as
select sdept 系名, avg(Sage) 平均年龄 from student
group by sdept
评论区