MySQL 从 5.0.1 版本开始提供视图功能。视图时一种虚拟存在的表,行和列的数据来自于视图的查询中使用的表,并且在使用视图时动态生成,只保存了 sql 逻辑,不保存查询结果。

理解:比如我现在做一个业务,是关联到多张表的,这个时候我要把查询的结果放在同一张虚拟表中。视图就是这么一张虚拟表,但是视图存储的不是这张表查询的数据,而是查询的逻辑过程,当数据发生改变时,视图中的数据也会相应的发生改变。其实视图就是对 sql 进行了保存,使用视图的过程就是执行存储好的 sql 的过程。

应用场景:

  • 多个地方用到同样的查询
  • 改查询结果使用sql语句较复杂

    9.1 视图的创建和使用


语法:

  1. CREATE VIEW 视图名字
  2. AS
  3. 查询语句;

实例:

  1. CREATE VIEW myview1
  2. AS
  3. SELECT last_name,department_name,job_title
  4. FROM employees e
  5. JOIN departments d ON e.department_id = d.department_id
  6. JOIN jobs j ON j.job_id = e.job_id;

视图的使用:

  1. SELECT * FROM myview1 WHERE last_name LIKE '%a%';

和普通表的使用没有任何区别

视图的好处:

  • 重用sql语句
  • 简化复杂的sql操作,不必知道它的查询细节
  • 保护数据,提高安全性

    9.2 视图的修改


方式一:如果视图不存在就创建,如果存在就修改

  1. CREATE OR REPLACE VIEW 视图名
  2. AS
  3. 查询语句;

方式二:直接修改

  1. ALTER VIEW 视图名
  2. as
  3. 查询语句;

9.3 删除视图


  1. DROP VIEW 视图名1,视图名2,...;

9.4 更新视图


实例1:更新视图

  1. CREATE OR REPLACE VIEW myv1
  2. AS
  3. SELECT last_name,email,salary
  4. FROM employees;
  5. SELECT * FROM myv1;

实例2:向视图中插入数据

  1. INSERT INTO myv1 VALUE('张飞','780574861@qq.com',1200);

实例3:修改视图中的数据

  1. UPDATE myv1
  2. SET last_name='张无忌'
  3. WHERE last_name = '张飞';

实例4:删除视图

  1. DELETE FROM myv1 WHERE last_name = '张无忌';

特点:

  1. 可以操作普通表的语句也同样可以操作视图
  2. 在对视图中的数据进行修改的同时,也会对视图相关的表中的数据进行修改
  3. 视图中的数据不是都能修改成功,如果字段具备如下特点,就不能进行修改了
  • 包含:分组函数、distinct、group by、having、union、union all
  • 常量视图
  • select 中包含子查询
  • join(可以修改,不能删除和插入)
  • from 一个不能更新的视图
  • where 子句的子查询引用了from子句中的表
  1. 因此这样的话,视图就存在一定的安全隐患,也失去了保护数据安全的功能。
  2. 可以赋予视图不同的权限,来确保数据的安全性

    9.5 视图和表的对比

  3. 创建的语法 视图 create view ,表 create table

  4. 视图没有保存逻辑,只保存了sql的逻辑,而表是真正表存了数据的
  5. 视图一般不能增删改,表可以