-- 视图-- 创建视图-- 创建时 or replace可以不加,但是修改时要加createorreplaceview stu_v_1 asselect id, name from student where id <=10;-- 查询视图showcreateview stu_v_1;select*from stu_v_1;select*from stu_v_1 where id <3;-- 修改视图createorreplaceview stu_v_1 asselect id, name,nofrom student where id <=10;alterview stu_v_1 asselect id, name from student where id <=10;-- 删除视图dropviewifexists stu_v_1;-- 视图检查选项 with cascaded/local check option-- local 只约束本视图showcreateview stu_v_1;createorreplaceview stu_v_1 asselect id, name from student where id <=20withlocalcheckoption;select*from stu_v_1;insertinto stu_v_1 values(6,'Tom');insertinto stu_v_1 values(30,'Tom');-- 因为插入检查选项的作用,不允许插入id>20的数据-- cascaded 约束本视图及其依赖视图createorreplaceview stu_v_1 asselect id, name from student where id <=20;showcreateview stu_v_1;select*from stu_v_1;insertinto stu_v_1 values(5,'Tom');insertinto stu_v_1 values(25,'Tom');-- 这里25被插入了student表deletefrom stu_v_1 where id =7;createorreplaceview stu_v_2 asselect id, name from stu_v_1 where id >=10withcascadedcheckoption;insertinto stu_v_2 values(7,'Tom');-- 不可以插insertinto stu_v_2 values(26,'Tom');-- 不可以插,虽然满足>=10,但是不满足所依赖视图的<=20条件insertinto stu_v_2 values(15,'Tom');-- 可以插-- 那么再基于v2创建一个没有加检查选项的视图,又会怎么样?-- 只要加了cascaded 就会检查当前视图,以及其依赖的所有视图,createorreplaceview stu_v_3 asselect id, name from stu_v_2 where id <=15;-- 没有加检查,所以这里where不会约束向v1,v2加数据insertinto stu_v_3 values(11,'Tom');-- 可以插 但是受到v1,v2的约束,因为v2加了cascaded,且v2依赖于v1insertinto stu_v_3 values(17,'Tom');-- 可以插insertinto stu_v_3 values(28,'Tom');-- 不可以插 不满足v2,v1-- local-----createorreplaceview stu_v_4 asselect id, name from student where id <=15withlocalcheckoption;showcreateview stu_v_1;select*from stu_v_1;insertinto stu_v_4 values(5,'Tom');insertinto stu_v_4 values(16,'Tom');deletefrom stu_v_4 where id =7;createorreplaceview stu_v_5 asselect id, name from stu_v_4 where id >=10withlocalcheckoption;insertinto stu_v_5 values(13,'Tom');-- 可以插insertinto stu_v_5 values(17,'Tom');-- 可以插insertinto stu_v_5 values(18,'Tom');-- 不可以插-- 那么再基于v2创建一个没有加检查选项的视图,又会怎么样?-- 只要加了cascaded 就会检查当前视图,以及其依赖的所有视图,createorreplaceview stu_v_6 asselect id, name from stu_v_5 where id <20;-- 没有加检查,所以这里where不会约束向v1,v2加数据insertinto stu_v_6 values(14,'Tom');-- 可以插 但是受到v1,v2的约束,因为v2加了cascaded,且v2依赖于v1insertinto stu_v_6 values(17,'Tom');-- 可以插insertinto stu_v_6 values(28,'Tom');-- 不可以插 不满足v2,v1-- local与cascaded区别,插local时检查local如果依赖的图有local也检查-- 插cascaded时检查cascaded,且检查其依赖视图,无论有无cascaded-- 视图的插入与更新-- 要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。/*1.为了保证数据库表的安全性,开发人员在操作tb user表时,只能看到的用户的基本字段,屏蔽手机号和邮箱两个
字段。*/select*from tb_users;createorreplaceview tb_user_view asselect id, name, profession, age, gender,status, createtime from tb_users;select*from tb_user_view;/*
2.
查询每个学生所选修的课程(三张表联查),这个功能在很多的业务中都有使用到,为了简化操作,定义一个视
图。*/select s.name, s.no, c.name from student s, student_course sc, course c where s.id = sc.studentid and sc.courseid = c.id;createorreplaceview tb_stu_course_view asselect s.name 学生名字, s.no, c.name from student s, student_course sc, course c where s.id = sc.studentid and sc.courseid = c.id;-- 后续就可以依赖这个视图进行查询,而不必要,每次都写后面的子查询-- 通过视图简化多表联查操作select*from tb_stu_course_view;