MySQL----视图

来源:互联网 发布:java 计算逻辑表达式 编辑:程序博客网 时间:2024/06/06 16:54

    • 概述
      • 视图的创建
      • 视图的查询
      • 视图的更新
        • 可更新视图
        • 插入数据
        • 修改数据
        • 删除数据
      • 修改视图ALTER
      • 删除视图DROP

概述

MySQL的视图功能可以向用户屏蔽MySQL的表连接语句,直接创建出一个视图,会使程序变得更加简洁

视图的创建

语法格式就不写了,直接上例子
在test数据库中,创建一个cs_kc表,用来展示计算机专业学生的信息

CREATE OR REPLACE VIEW cs_kc                AS                SELECT xs.学号, 课程号, 成绩                FROM xs, xs_kc                WHERE xs.学号 = xs_kc.学号 AND xs.专业 = '计算机'                WITH CHECK OPTION;

看到了吧,上面做了一个表连接,连接的是xs表与xs_kc
在创建视图时,SELECT子句是有限制

  • (1)定义视图的用户必须对所参照的表或视图有查询权限;
  • (2)不能包含FROM字句的子查询;
  • (3)不能引用系统或用户变量;
  • (4)不能使用预处理语句参数;
  • (5)在定义中引用的表或视图必须存在;
  • (6)若引用的不是当前数据库的表或视图时,要在表或视图前加上数据库的名称;
  • (7)若视图定义中允许使用ORDER BY,但是,若果从特定视图进行了选择,而该视图使用了
    具有自己ORDER BY的语句,则视图定义中的ORDER BY将被忽略;
  • (8)对于SELECT语句中的其他选项或字句,若视图中也包含了这些选项,则效果未定义。
    • 例如:
      如果在视图定义中包含LIMIT字句,而SELECT语句使用了自己的LIMIT字句,MySQl对使用哪个LIMIT未作定义;

视图的查询

比如说我们现在要查询刚才所创建cs_kc
就这样操作:

SELECT 学号, 课程号                 FROM cs_kc;

这里写图片描述
很简单吧,哈哈哈,跟表的查询非常相似

对CS_KC视图进行分组查询

    SELECT 学号, 课程号                 FROM cs_kc                GROUP BY 学号;        

课程号只保留了第一位
GROUP BY学号之后,课程号就只保留了第一行

敲黑板

  • 在使用视图查询时,如果视图对应的基表中添加了新的字段,那么在试图中是看不到这个变化的,也就是说,在视图中查询不到基表中新增的列的信息
  • 如果基表被删除,那么视图也就GG了,因为视图本来就是从基表来的

视图的更新

可更新视图

我们可以通过视图来更新它的基表,但并不是所有的视图能进行这种操作,只有满足了下面这个条件的视图才可以更新:

  • 视图中的行和基表中的行之间必须有一一对应的关系

如果在创建视图时出现了下面这几种结构,那么这样的视图就是不可更新视图

  • (1)聚合函数
  • (2)DISTINCT 子句
  • (3)GROUP BY 子句
  • (4)ORDER BY 子句
  • (5)HAVING 子句
  • (6)UNION 子句
  • (7)位于选择列表中的子查询
  • (8)FROM 子句中包含多个表
  • (9)SELECT语句中引用了不可更新视图
  • (10)WHERE 子句中的子查询,引用FROM子句中的表
  • (11)ALGORITHM选项指定为TEMPTABLE(临时表会使视图成为不可更新视图)

插入数据

首先创建一个视图cs_xs

CREATE OR REPLACE VIEW cs_xs    AS    SELECT *        FROM xs        WHERE 专业 = '计算机'    WITH CHECK OPTION;

这里要解释一下为什么要在后面加一个WITH CHECK OPTION 子句

  • WITH CHECK OPTION 子句会在更新数据的时候检查新数据是否符合视图定义中WHERE 子句的限制条件,就是说在对视图cs_xs进行修改时, WITH CHECK OPTION 子句会判断插入的记录是否符合 专业 = ‘计算机’这一限制条件
  • WITH CHECK OPTION 子句只能和可更新视图一起使用

然后向该视图中插入一条新记录

INSERT INTO cs_xs    VALUES('081255', '李牧', '计算机', 1, '1994-10-14', 50, NULL);

再来看一下视图cs_xs和基表xs有何变化

  • 视图cs_xs
    • 修改前
      这里写图片描述
    • 修改后
      这里写图片描述
  • 基表xs
    • 修改前
      这里写图片描述
    • 修改后
      这里写图片描述

注意注意:

  • 要向想对一个视图使用INSERT子句,自定义视图时,SELECT 语句中必须包含FROM 子句中指定表的所有不能为空的列。所以,我认为,直接使用FROM *是最保险的

修改数据

UPDATE

删除数据

DELETE

上面这两个都没有什么好注意的,只要是满足了可更新视图条件的视图,就可以大胆的用,就像操作TABLE一样

修改视图(ALTER)

ALTERVIEW和CREATEVIEW语法差不多,具体Please Baidu 嘻嘻嘻
给一个例子:

ALTER VIEW cs_xsAS    SELECT 学号, 姓名, 总学分        FROM xs        WHERE 专业 = '计算机';

执行结果:

  • 修改前
    这里写图片描述

  • 修改后
    这里写图片描述

使用ALTER将视图精简为了三列

删除视图(DROP)

语法格式,这个比较短,说一下吧

DROP VIEW  [IF EXISTS]    VIEW_NAME   [, view_name] ...       [RESTRICT | CASCADE]
  • 最后那俩选项,可以写也可以不写,没什么影响,我也不知道他俩是什么意思(哈哈哈哈……)

最后来个结尾,把前面创建的视图删掉

DROP VIEW cs_xs;

这里写图片描述

被删掉了。。。

终于写完了

原创粉丝点击