11.1.1  视图的含义

        视图是一个虚拟的表,它是把数据库中的一张或者多张表中的一些数据列,拼接起来的虚拟的表。

        创建视图的信息来自表的部分信息,只取需要的信息。当对通过视图看到的数据进行修改的时候,相应的基本表的数据也要发生变化。同时,若基本表的数据发生变化,则这种变化也可以自动的反映到视图中。

        视图的好处:看到的就是需要的。另外,当视图表的某张数据来源表的表结构变化,只要那列数据不变,即使真实表的位置发生变化,也不影响视图。

11.2.1  创建视图

        首先准备一些数据。

DROP TABLE IF EXISTS t_teacher;

CREATE TABLE t_teacher
(
id INT(11) PRIMARY KEY AUTO_INCREMENT,
teacName VARCHAR(255) NOT NULL, -- 老师的名字
dept VARCHAR(255), -- 部门
isProfessor CHAR(5) -- 1是教授,0不是教授
);

INSERT INTO t_teacher VALUES(1,'田教授','信息学院','1'),(2,'黄博士','信息学院','0'),
(3,'付耀霞','人文学院','0');


DROP TABLE IF EXISTS t_student;

CREATE TABLE t_student
(
id INT(11) PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
sex CHAR(5) NOT NULL,
age INT(11) NOT NULL,
class VARCHAR(255) NOT NULL,
address VARCHAR(255),
idCard INT(11),
teacherId INT(11),
CONSTRAINT fk_s_t FOREIGN KEY(teacherId) REFERENCES t_teacher(id)
);


INSERT INTO t_student VALUES(NULL,'大宇','1',22,'软件班','1栋',320100,1),
(NULL,'黄大大','1',22,'网络班','2栋',320101,2),(NULL,'老朱','1',22,'网络班','3栋',320102,3);

          t_student 表的数据。

从头开始学MySQL-------视图_数据

         t_teacher表的数据。

  

从头开始学MySQL-------视图_database_02

        在实际中,导师表中的列或者说是属性,可能远远超过当前的4列。学生表的列也是这样,可能会有更多的信息,比如父母信息,教育经历,高考分数等。

        在两张表的这么多列中,找到我们需要的数据。我的终极目标就是:看到的就是需要的。

        现在的需求是:获取学生的名字、身份证、导师名,将这三列数据使用视图展示出来。这样做的好处就是其它的数据都忽略,我不管你学生表或者导师表的表结构如何变化,我都保视图的数据不受影响。导师表中可能还有很多字段我没有加,比如工资等。就算有再多的属性,再复杂的表结构,我们也没必要去熟悉,视图可以展示我们需要的数据列即可。

CREATE VIEW stu_teac_info(stuName,stuIdCard,teacName)
AS
SELECT s.name,s.idCard,t.teacName
FROM t_student s
JOIN t_teacher t ON s.teacherId = t.id;

  

从头开始学MySQL-------视图_数据库_03

        点开此视图,可以清楚的看到我们需要的数据。导师表就展示了一个导师名,其它所有的属性都被忽略了。

  

从头开始学MySQL-------视图_mysql_04

        根据上面的列子,我们再来看看如何创建视图。

        在单表上创建视图,如果不指定字段列的话,默认查询出所有的字段。

CREATE VIEW stuInfo
AS SELECT * FROM t_student;

 

从头开始学MySQL-------视图_表结构_05

从头开始学MySQL-------视图_database_06

        指定部分字段。查询出来的数据,将会顺序对应视图中定义的列。

CREATE OR REPLACE VIEW stuInfo(id,学生名,身份证)
AS SELECT id,name,idCard FROM t_student;

从头开始学MySQL-------视图_database_07

从头开始学MySQL-------视图_database_08

拨云见日

        原来视图就是已经编译好的SQL。它把多张表里面的一些数据抽取出来,拼接成一张新的虚拟的表,这张虚拟的表里只有我们最想要的数据,这样就很好的保护了基本表中的其它数据。

11.3.1  查看视图

        因为视图是虚拟的表,所以可以像正常的表那样使用关键字DESC来查看表结构。

DESC stu_teac_info;

  

从头开始学MySQL-------视图_表结构_09

        使用SHOW CREATE VIEW view_name 可以查看到创建视图的代码。

        语法: SHOW CREATE VIEW 视图名;

SHOW CREATE VIEW stu_teac_info;

-- Create View 的数据

CREATE VIEW `stu_teac_info` AS
select `s`.`name` AS `stuName`,
`s`.`idCard` AS `stuIdCard`,
`t`.`teacName` AS `teacName`
from (`t_student` `s` join `t_teacher` `t` on((`s`.`teacherId` = `t`.`id`)))

从头开始学MySQL-------视图_数据库_10

        视图最终在MySQL中放入了information_schema数据库的views表中。

SELECT * FROM information_schema.views WHERE TABLE_NAME = 'stuinfo'

  

从头开始学MySQL-------视图_数据_11

11.4.1  修改视图 

        如果要修改视图,可以使用CREATE OR REPLACE的方法,相当于 IF EXISTS ,如果存在就覆盖。

        现在stu_teac_info这个视图的数据如下。

    

从头开始学MySQL-------视图_mysql_12

   

从头开始学MySQL-------视图_表结构_13

        现在的需求:在原来视图的基础上增加导师是否是教授。

        下面展示第一种方法:CREATE OR REPLACE

CREATE OR REPLACE VIEW stu_teac_info(stuName,stuIdCard,teacName,是否是教授) -- 加上OR REPLACE
AS

SELECT
s.name,
s.idCard,
t.teacName,
(
CASE t.isProfessor = 1
WHEN 1 THEN '是'
WHEN 0 THEN '不是'
ELSE ' '
END -- 尴尬,这里还要加一个END,查了一下以前的博客才知道
)
FROM t_student s
JOIN t_teacher t ON s.teacherId = t.id

 

从头开始学MySQL-------视图_数据_14

        第二种办法就是把 CREATE OR REPLACE 换成 ALTER ,因为它确定了此视图一定存在,必定覆盖。

ALTER VIEW stu_teac_info
AS
SELECT * FROM t_teacher;

 

从头开始学MySQL-------视图_mysql_15

11.5.1  更新视图

        更新视图是指通过视图来插入、更新、删除表中的数据。

        重新执行下面的SQL,初始化一下视图。

CREATE OR REPLACE VIEW stu_teac_info(stuName,stuIdCard,teacName)
AS
SELECT s.name,s.idCard,t.teacName
FROM t_student s
JOIN t_teacher t ON s.teacherId = t.id;

  

从头开始学MySQL-------视图_database_16

         新需求:在视图中,发现了大宇的身份证有误,需要及时更新。正确的身份证号码是320103。

UPDATE stu_teac_info set stuIdCard = 320103 WHERE stuName = '大宇';

        执行完毕后,查看视图,视图中的相关数据已经被修改了。 再查看基本表,基本表中的数据也被修改了。

拨云见日

        对视图增加或者删除记录,实际上是对基本表增加或者删除记录。

        如果往视图中插入的数据不包括基本表中非空的数据,那么插入失败。

        更新后的视图。 

  

从头开始学MySQL-------视图_数据库_17

        更新后的基本表。 

  

从头开始学MySQL-------视图_数据_18

        查看学生表的表结构 DESC t_student;比如sex、age等列不能为空。所以在往视图中插入数据的时候,不包含基本表中被定义为非空的列,将会导致插入失败。

  

从头开始学MySQL-------视图_表结构_19

INSERT INTO stu_teac_info VALUES('名字',320104,'秀芳姐');

  

从头开始学MySQL-------视图_表结构_20

11.6.1  删除视图

DROP VIEW IF EXISTS stu_teac_info;

11.7.1  视图与表的联系与区别 

(1)视图是已经编译好的SQL语句,是基于SQL语句的结果集的可视化表。

(2)视图是逻辑上的存在,它是查看数据的一种办法,它不占磁盘。而表占物理磁盘。

(3)视图的建立和删除只影响视图本身,不影响对应的基本表。

(4)视图可以防止用户接触数据表,因为视图是虚拟的表,用户不知道基本表的表结构。

阅读更多