1. 概述
-
视圈(View)是一种虛拟存在的表。本身不存储数据,视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果,这些数据还是存放在原来的表中。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。
-
使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。视图是基于基本表上建立的表,它的结构和内容都来自基本表,它依据基本表存在而存在。
一旦表中的数据发生改变,显示在视图中的数据也会发生改变。
注意:MySQL从5.0版本开始支持视图
2. 作用
我们为什么要使用视图呢?
- 简化代码,可以把重复使用的查询封装成视图重复使用,同时可以使复杂的查询易于理解和使用。
- 安全原因,如果一张表中有很多数据,很多信息不希望让所有人看到,此时可以使用视图视,如:社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等,可以对不同的用户,设定不同的视图。
3. 创建视图
格式
CREATE [OR REPLACE] VIEW 视图名[(列名列表)]AS SELECT语句[WITH[CASCADED|LOCAL]CHECK OPTION];
默认情况下,创建的视图和基本表的字段是一样的,也可以通过指定基表字段的名称来创建视图。
CREATE VIEW view_school AS SELECT * FROM t_student;
CREATE VIEW view_school3 (v_sid,v_sname,v_sex)AS SELECT sid,sname,sex FROM t_student WHERE sex='男';
可以看到,两个视图中的字段名称不同,但是数据却相同。因此,在使用视图时,可能用户不需要了解基本表的结构,更接触不到实际表中的数据,从而保证了数据库的安全。
4. 视图查看
DESC 视图名;
或者
SHOW FIELDS FROM 视图名;
两种方法得到的详情都是一毛一样的。
5. 视图查询
SHOW CREATE VIEW 视图表名;
SELECT * FROM 视图表名 WHERE 条件;
6. 视图修改
方式一:CREATE OR REPLACE VIEW 视图名(列名列表) AS SELECT语句[WITH[CASCADED|LOCAL]CHECK OPTION];
方式二:ALTER VIEW 视图名(列名列表) AS SELECT语句[WITH[CASCADED|LOCAL]CHECK OPTION];
方式一:CREATE OR REPLACE VIEW view_school3 (v_sid,v_sname,v_sex,v_birthday) AS SELECT sid,sname,sex,birthday FROM t_student WHERE sex='男';
方式二:ALTER VIEW view_school3 AS SELECT sid,sname FROM t_student WHERE sex='男';
7. 视图删除
删除视图是指删除数据库中已存在的视图,删除视图时,只能删除视图的定义,不会删除数据,也就是说不动基表:
DROP VIEW 视图名;
8. 视图增删改
在视图中更新数据时基表中的数据也会更新,反之一样
8.1. 新增
INSERT INTO view_school2(sname,sex) VALUES('桃桃','男');
8.2. 修改
UPDATE view_school2 SET sname ='桃子' WHERE sname='桃桃';
8.3. 删除
DELETE FROM view_school2 WHERE sname='桃子';
9. 多表查询
CREATE VIEW view_school1(sname,cname) AS SELECT t1.sname,t2.cname
FROM t_student t1 JOIN t_class t2 ON t1.cno=t2.cid;
10. 视图的检查选项
WITH CHECK OPTION
CASCADED(级联)
WITH CASCADED(级联) CHECK OPTION
WITH LOCAL CHECK OPTION
CREATE OR REPLACE VIEW v1 AS SELECT sid,sname FROM t_student WHERE
sid <=20;
SELECT * FROM v1;
/* 成功*/
INSERT INTO v1 VALUES(10,'tom');
/* 失败不报错 限制了条件,但基表中有*/
INSERT INTO v1 VALUES(30,'tom');
CREATE OR REPLACE VIEW v1 AS SELECT sid,sname FROM t_student WHERE sid <=20 WITH CASCADED CHECK OPTION;
SELECT * FROM v1;
/* 成功*/
INSERT INTO v1 VALUES(10,'tom');
/* 报错/
INSERT INTO v1 VALUES(30,'tom');
CREATE OR REPLACE VIEW v1 AS SELECT sid,sname FROM t_student WHERE sid <=20 ;
/* 成功*/
INSERT INTO v1 VALUES(10,'tom');
/* 失败不报错 限制了条件,但基表中有*/
INSERT INTO v1 VALUES(30,'tom');
CREATE OR REPLACE VIEW v2 AS SELECT sid,sname FROM v1 WHERE sid >11 WITH CASCADED CHECK OPTION;
/* 报错*/
INSERT INTO v2 VALUES(10,'tom');
/* 报错*/
INSERT INTO v2 VALUES(21,'tom');
LOCAL
CREATE OR REPLACE VIEW v3 AS SELECT sid,sname FROM t_student WHERE sid <=20;
CREATE OR REPLACE VIEW v4 AS SELECT sid,sname FROM v3 WHERE sid >11 WITH LOCAL CHECK OPTION;
/* 在v3,v4表中添加失败不报错 限制了条件,但基表中有*/
INSERT INTO v4 VALUES(22,'tom');
CREATE OR REPLACE VIEW v3 AS SELECT sid,sname FROM t_student WHERE sid <=20 WITH LOCAL CHECK OPTION;
CREATE OR REPLACE VIEW v4 AS SELECT sid,sname FROM v3 WHERE sid >11 WITH LOCAL CHECK OPTION;
/* 报错*/
INSERT INTO v4 VALUES(22,'tom');
使用CASCADED(级联)时,当一个表依赖于另个表时,当添加的条件范围不在限制条件内就会报错
使用LOCAL时,当一个表依赖于另个表(添加WITH LOCAL CHECK OPTION)时,当添加的条件范围不在限制条件内就会报错
11. 视图更新
要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。如果视图包含以下任何一项,则该视图不可更新:
1.聚合函数或窗口函数 (SUM()、MIN()、MAX()、COUNT()等)
- DISTINCT
- GROUP BY
- HAVING
- UNION 或者 UNION ALL
CREATE VIEW stu_count AS SELECT COUNT(*) FROM t_student;
INSERT INTO stu_count VALUES(9);
可见是对应不上数据的
Comments NOTHING