diff --git "a/35-\345\274\240\345\271\263/\347\254\224\350\256\260/\350\247\206\345\233\2762022-9-15.md" "b/35-\345\274\240\345\271\263/\347\254\224\350\256\260/\350\247\206\345\233\2762022-9-15.md" new file mode 100644 index 0000000000000000000000000000000000000000..d9fb04fe0fd91749b81b5a71f65c6cbfbdc33715 --- /dev/null +++ "b/35-\345\274\240\345\271\263/\347\254\224\350\256\260/\350\247\206\345\233\2762022-9-15.md" @@ -0,0 +1,127 @@ +#### 基于视图的操作 + +##### 定义视图 + +```sql +--建立视图 +create view <视图名> [(<列名>[,<列名>]...)] + as <子查询> [with check option] +``` + +##### 常见的视图形式 + +- 行列子集视图:去掉了某些行和某些列,但保留了主键 + +```sql +--建立信息学院学生的视图 +``` + +- with check option 视图 + +```sql +--建立信息学院学生的视图,并要求通过该视图进行的更新操作只涉及信息学院的学生 +``` + + + +- 带表达式的视图 + +```sql +--定义一个反映学生年龄的视图 +``` + + + +- 基于多个基表的视图:可以进行连表检索 + +```sql +--建立信息学院学生的特长属于艺术特长视图 +``` + + + +- 基于视图的视图:视图可作为另一视图建立的表 + +```sql +--建立信息学院->数据科学与大数据技术专业的学生视图 +``` + + + +- 分组视图:使用group by 建立视图 + +```sql +--建立各个生源地学生的荣誉总数视图 +``` + + + +##### 查询视图 + +##### 更新视图 + +##### 删除视图 + +```sql +drop view <视图名> +--该语句从数据字典中删除指定的视图定义 +--由该视图导出的其他视图仍在数据字典中,但不能使用,需要删除 +--删除基表时,由该基表导出的所有视图定义都必须显示删除 +``` + + + + + +#### 视图的设计原则 + +- 以 select * 方式创建的视图:可扩充性差,应尽可能避免 + + + +```sql +--视图 view: +--创建视图 +select * from tb_student +--建立一个学号,姓名,学院、专业的学生视图 +--1.行列子集视图 +--create view V_StuMajor(学号,姓名,学院,专业) +--as +--(select stu_num ,name ,school ,major from tb_student where school='信息学院') +--go + + +--2.with check option:视图更新 +--建立信息学院学生的视图,并要求通过该视图进行的更新操作只涉及信息学院的学生 +--create view V_StuMajor(学号,姓名,学院,专业) +--as +--(select stu_num ,name ,school ,major from tb_student where school='信息学院') +--with check option +--go + +--视图可以更新,不建议,一般直接对基表操作 +--update V_StuMajor set 姓名='王博文' where 学号=16130201 + +--insert V_StuMajor values(16101011,'蜗牛','信息学院','统计') + + + +--3.带表达式的视图 +定义一个反映学生年龄的视图 +create view V_StuAge(学号,姓名,年龄,学院,专业) +as +(select stu_num ,name ,year(getdate())-year(birth),school,major from tb_student) + +select * from V_StuAge + +--查询 +--保护数据安全性 +--简化用户操作 +select * from V_StuMajor --》视图消解法:自动转换成对基本的操作 select stu+num,.... from tb_student + +select stu_num ,name ,school ,major from tb_student where school='信息学院' + +--删除视图 +drop view V_StuMajor +``` +