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

网友投稿 555 2022-11-16

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

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

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 表的数据。

t_teacher表的数据。

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

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

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

CREATE VIEW stu_teac_info(stuName,stuIdCard,teacName)ASSELECT s.name,s.idCard,t.teacNameFROM t_student sJOIN t_teacher t ON s.teacherId = t.id;

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

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

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

CREATE VIEW stuInfoAS SELECT * FROM t_student;

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

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

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

11.3.1  查看视图

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

DESC stu_teac_info;

使用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中放入了information_schema数据库的views表中。

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

11.4.1  修改视图

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

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

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

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

CREATE OR REPLACE VIEW stu_teac_info(stuName,stuIdCard,teacName,是否是教授) -- 加上OR REPLACEASSELECT s.name,s.idCard,t.teacName,( CASE t.isProfessor = 1 WHEN 1 THEN '是' WHEN 0 THEN '不是' ELSE ' ' END -- 尴尬,这里还要加一个END,查了一下以前的博客才知道)FROM t_student sJOIN t_teacher t ON s.teacherId = t.id

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

ALTER VIEW stu_teac_infoAS SELECT * FROM t_teacher;

11.5.1  更新视图

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

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

CREATE OR REPLACE VIEW stu_teac_info(stuName,stuIdCard,teacName)ASSELECT s.name,s.idCard,t.teacNameFROM t_student sJOIN t_teacher t ON s.teacherId = t.id;

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

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

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

拨云见日        对视图增加或者删除记录,实际上是对基本表增加或者删除记录。        如果往视图中插入的数据不包括基本表中非空的数据,那么插入失败。

更新后的视图。

更新后的基本表。

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

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

11.6.1  删除视图

DROP VIEW IF EXISTS stu_teac_info;

11.7.1  视图与表的联系与区别

(1)视图是已经编译好的SQL语句,是基于SQL语句的结果集的可视化表。(2)视图是逻辑上的存在,它是查看数据的一种办法,它不占磁盘。而表占物理磁盘。(3)视图的建立和删除只影响视图本身,不影响对应的基本表。(4)视图可以防止用户接触数据表,因为视图是虚拟的表,用户不知道基本表的表结构。

阅读更多

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:jQuery全屏滚动插件fullPage.js
下一篇:从头开始学MySQL--------数据类型(1)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~