0
点赞
收藏
分享

微信扫一扫

MySQL----视图

Java架构领域 2022-02-24 阅读 79



  • ​​概述​​

  • ​​视图的创建​​
  • ​​视图的查询​​
  • ​​视图的更新​​

  • ​​可更新视图​​
  • ​​插入数据​​
  • ​​修改数据​​
  • ​​删除数据​​

  • ​​修改视图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;

MySQL----视图_mysql

很简单吧,哈哈哈,跟表的查询非常​相似

对CS_KC视图进行​分组查询

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

MySQL----视图_mysql_02

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

    • 修改前
      MySQL----视图_mysql_03
    • 修改后
      MySQL----视图_数据库_04


  • 基表xs

    • 修改前
      MySQL----视图_新视图_05
    • 修改后
      MySQL----视图_数据库_06



注意注意:

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

修改数据

UPDATE

删除数据

DELETE

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

修改视图(ALTER)

ALTERVIEW和CREATEVIEW语法差不多,具体Please Baidu 嘻嘻嘻

给一个例子:

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

执行结果:


  • 修改前
    MySQL----视图_数据_07

  • 修改后
    MySQL----视图_数据_08


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

删除视图(DROP)

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

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

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

DROP VIEW cs_xs;

MySQL----视图_新视图_09

被删掉了。。。

终于写完了



举报

相关推荐

0 条评论