1、什么是视图

视图可以理解为以下两个概念:

  • 视图是查询语句的别名,当某些查询语句又臭又长时可以用视图代替查询语句;
  • 视图是虚拟表,对视图进行增删查改会被映射到视图对应的查询语句对应的底层表上。

    2、创建视图

    格式:

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

    举例:

    1. CREATE VIEW test_table_view AS SELECT * FROM test_table;

    结果:
    image.png
    DataGrip里,在数据库目录下有两个目录,一个是表,另一个是视图,即视图和表的目录是平级的,点开视图,即视图对应的查询语句对应的实体表,如图:
    image.png
    注意:

  • 视图是虚拟表,在创建视图时视图名称不能和数据库里现有的表的名称和视图的名称重复。

    3、使用视图

    3.1 视图基本使用

举个例子,我们想在学生信息表里查看性别是男,且学号在学生成绩表里也存在的记录,SQL语句如下:

  1. SELECT s1.student_number, s1.name, s1.major, s2.subject, s2.score FROM student_info AS s1 INNER JOIN student_score AS s2 WHERE s1.student_number = s2.student_number AND s1.sex = '男';

结果如下:
image.png
这条语句又臭又长,下次遇到这个场景我还需要再重新输入一遍这又臭又长的SQL语句么?不需要,使用视图即可。

首先为这条SQL语句创建一个视图 student_info_view

  1. CREATE VIEW student_info_view AS SELECT s1.student_number, s1.name, s1.major, s2.subject, s2.score FROM student_info AS s1 INNER JOIN student_score AS s2 WHERE s1.student_number = s2.student_number AND s1.sex = '男';

下次再想查询时,仅需要对student_info_view这个虚拟表查询即可:

  1. SELECT * FROM student_info_view;

使用视图时需要注意以下几点:

  • 创建视图时不会把又臭又长的查询语句的结果集保存在硬盘里或者内存里,而是对视图进行查询时,MySQL会把对视图的查询语句转换为对视图对应的查询语句对应的底层实体表的查询语句后再执行;
  • 视图使用时可以当做一张表去使用,对视图的操作都会映射到底层表上,相当于视图是指向底层表的一个引用。

    3.2 利用视图创建视图

创建视图时,AS后面的查询语句可以针对的是一张底层实体表,也可以针对是一个视图。
举例:

  1. CREATE VIEW new_view AS SELECT * FROM student_info_view;

3.3 创建视图时指定视图的自定义别名

视图的虚拟列其实是这个视图对应的查询语句的查询列表,我们也可以在创建视图的时候为它的虚拟列自定义列名,这些自定义列名写到视图名后边,用逗号,分隔就好了,不过需要注意的是,自定义列名一定要和查询列表中的表达式一一对应。比如我们新创建一个自定义列名的视图:

  1. CREATE VIEW student_info_view(no, n, m) AS SELECT number, name, major FROM student_info;

我们的自定义列名列表是no, n, m,分别对应查询列表中的number, name, major。有了自定义列名之后,我们之后对视图的查询语句都要基于这些自定义列名,否则会报错。

  1. SELECT no, n, m FROM student_info_view;

4、查看视图

格式:

  1. SHOW TABLES;

结果:
image.png
这句SQL语句可以把数据库里所有的表和视图列出来。

5、删除视图

格式:

  1. DROP VIEW 视图名;

6、更新视图

不建议在视图上进行更新,但不代表不可以更新视图。