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;

1668576468414

CREATE VIEW view_school3 (v_sid,v_sname,v_sex)AS SELECT sid,sname,sex FROM t_student WHERE sex='男';

1668577146373

可以看到,两个视图中的字段名称不同,但是数据却相同。因此,在使用视图时,可能用户不需要了解基本表的结构,更接触不到实际表中的数据,从而保证了数据库的安全

4. 视图查看

DESC 视图名;
或者
SHOW FIELDS FROM 视图名;

两种方法得到的详情都是一毛一样的。

1668577353501

5. 视图查询

SHOW CREATE VIEW 视图表名;

1668577750084

SELECT * FROM 视图表名 WHERE 条件;

1668577885533

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='男';

1668578657373

方式二:ALTER VIEW view_school3 AS SELECT sid,sname FROM t_student WHERE sex='男';

1668578955213

7. 视图删除

删除视图是指删除数据库中已存在的视图,删除视图时,只能删除视图的定义,不会删除数据,也就是说不动基表:

 DROP VIEW 视图名;

1668579112556

8. 视图增删改

在视图中更新数据时基表中的数据也会更新,反之一样

8.1. 新增

INSERT INTO view_school2(sname,sex) VALUES('桃桃','男');

1668580312735

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;

1668580582342

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');

1668584400394

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()等)

  1. DISTINCT
  2. GROUP BY
  3. HAVING
  4. UNION 或者 UNION ALL
CREATE VIEW stu_count AS SELECT COUNT(*) FROM t_student;
INSERT INTO stu_count VALUES(9);

1668587741132

可见是对应不上数据的

如人饮水,冷暖自知。
最后更新于 2023-08-09