Mysql视图------视图基本概念理解和基本操作

来源:互联网 发布:庞氏骗局知乎 编辑:程序博客网 时间:2024/06/06 16:52

前言

一、 视图的基本定义和特点:

1、 视图的定义:

视图(View)是从一个或多个表(或视图)导出的表。视图与表(有时为与视图区别,也称表为基本表——Base Table)不同,视图是一个虚表,即视图所

对应的数据不进行实际存储,数据库中只存储视图的定义,在对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表。

视图是虚表,是从一个或几个基本表(或视图)中导出的表,在系统的数据字典中仅存放了视图的定义,不存放视图对应的数据。
视图是原始数据库数据的一种变换,是查看表中数据的另外一种方式。可以将视图看成是一个移动的窗口,通过它可以看到感兴趣的数据。 视图是从一个或多

个实际表中获得的,这些表的数据存放在数据库中。那些用于产生视图的表叫做该视图的基表。一个视图也可以从另一个视图中产生。
视图的定义存在数据库中,与此定义相关的数据并没有再存一份于数据库中。通过视图看到的数据存放在基表中。
视图看上去非常像数据库的物理表,对它的操作同任何其它的表一样。当通过视图修改数据时,实际上是在改变基表中的数据;相反地,基表数据的改变也会

自动反映在由基表产生的视图中。由于逻辑上的原因,有些视图可以修改对应的基表,而有些则不能(仅仅能查询)。

2、 视图的作用:

* 简单性。看到的就是需要的。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不

必为以后的操作每次指定全部的条件。
视图的安全性可以防止未授权的用户查看特定的行或者列,是用户只能查看表中特定的行的方法如下:

①、 在表中增加一个标识用户名的列;

②、 建立视图,是用户只能查看标有自己用户名的行;

③、 把视图授权给其他用户;


* 安全性。通过视图用户只能查询和修改他们所能见到的数据。数据库中的其它数据则既看不见也取不到。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。通过视图,用户可以被限制在数据的不同子集上:
使用权限可被限制在基表的行的子集上。
使用权限可被限制在基表的列的子集上。
使用权限可被限制在基表的行和列的子集上。
使用权限可被限制在多个基表的连接所限定的行上。
使用权限可被限制在基表中的数据的统计汇总上。
使用权限可被限制在另一视图的一个子集上,或是一些视图和基表合并后的子集上。
*逻辑数据独立性。视图可帮助用户屏蔽真实表结构变化带来的影响。

视图就像是一个窗口,透过这个窗口可以看到数据库中自己感兴趣的数据及其变化。

3、 视图的特性:

视图是对若干张基本表的引用,一张虚表,查询语句执行的结果,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变);
可以跟基本表一样,进行增删改查操作(ps:增删改操作有条件限制);



二、 MySQL视图的基本操作:

1、视图操作案列一:

为了演示视图的使用,在此创建三张表: 用户(user), 课程表(course),用户课程中间表(user_course),表的结构如下:

--*********************--course表结构--*********************DROP TABLE IF EXISTS COURSE;CREATE TABLE COURSE(ID BIGINT(20) NOT NULL AUTO_INCREMENT,NAME VARCHAR(200) NOT NULL,DESCRIPTION VARCHAR(500) NOT NULL,PRIMARY KEY(ID))ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=UTF8;--指定innodb为存储引擎,编码格式为utf8--*********************--为课程表course插入测试数据--*********************INSERT INTO `course` VALUES ('1', 'JAVA', 'JAVA课程');INSERT INTO `course` VALUES ('2', 'C++', 'C++课程');INSERT INTO `course` VALUES ('3', 'C语言', 'C语言课程');--*********************--user表结构--*********************DROP TABLE IF EXISTS `user`;CREATE TABLE `user` (  `id` BIGINT(20) NOT NULL AUTO_INCREMENT,  `account` VARCHAR(255) NOT NULL,  `name` VARCHAR(255) NOT NULL,  `address` VARCHAR(255) DEFAULT NULL,  `others` VARCHAR(200) DEFAULT NULL,  `others2` VARCHAR(200) DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;--*********************--为课程表user插入测试数据--*********************INSERT INTO `user` VALUES ('1', 'user1', '小陈', '美国', '1', '1');INSERT INTO `user` VALUES ('2', 'user2', '小张', '日本', '2', '2');INSERT INTO `user` VALUES ('3', 'user3', '小王', '中国', '3', '3');--*********************--用户课程中间表user_course结构--*********************DROP TABLE IF EXISTS USER_COURSE;CREATE TABLE USER_COURSE(ID BIGINT(20) NOT NULL AUTO_INCREMENT,USERID BIGINT(20) NOT NULL,COURSEID BIGINT(20) NOT NULL,PRIMARY KEY(ID))ENGINE=INNODB AUTO_INCREMENT=7 DEFAULT CHARSET=UTF8;--*********************--为课程表user_course插入测试数据--*********************INSERT INTO `user_course` VALUES ('1', '1', '2');INSERT INTO `user_course` VALUES ('2', '1', '3');INSERT INTO `user_course` VALUES ('3', '2', '1');INSERT INTO `user_course` VALUES ('4', '2', '2');INSERT INTO `user_course` VALUES ('5', '2', '3');INSERT INTO `user_course` VALUES ('6', '3', '2');

以上sql语句为测试表和测试数据的添加语句。


* 这时候,当我们需要查询小张课程相关信息的时候,就需要编写下面这么一条SQL语句:

SELECT uc.id AS id,u.name AS userName,c.name AS coursenameFROM USER uLEFT JOIN user_course uc ON((u.id = uc.userid))LEFT JOIN course c ON ((uc.courseid = c.id))WHERE u.name='小张';

但是为了简化操作我们可以创建视图,这里我们创建一个视图"view_user_course"

DROP VIEWIF EXISTS `view_user_course`;CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY DEFINER VIEW `view_user_course` AS (    SELECT        `uc`.`id` AS `id`,        `u`.`name` AS `username`,        `c`.`name` AS `coursename`    FROM        (            (                `user` `u`                LEFT JOIN `user_course` `uc` ON ((`u`.`id` = `uc`.`userid`))            )            LEFT JOIN `course` `c` ON ((`uc`.`courseid` = `c`.`id`))        ));
几点说明

(MySQL中的视图在标准SQL的基础之上做了扩展):
ALGORITHM=UNDEFINED:指定视图的处理算法;
DEFINER=`root`@`localhost`:指定视图创建者;
SQL SECURITY DEFINER:指定视图查询数据时的安全验证方式;


然后编写以下简单的sql文就可以查看小张的课程情况了。

--查看小张情况SELECT vuc.username,vuc.coursenameFROMview_user_course vucWHERE vuc.username =  '小张';


2、视图操作案列二:

继续,我们可以尝试在视图view_user_course上做增删改数据操作,如下:

update view_user_course set username='test',coursename='JAVASCRIPT' where id=3

遗憾的是操作失败,提示错误信息如下:

[SQL] update view_user_course set username='test',coursename='JAVASCRIPT' where id=3

[Err] 1393 - Can not modify more than one base table through a join view 'demo.view_user_course'

因为不能在一张由多张关联表连接而成的视图上做同时修改两张表的操作;

那么哪些操作可以在视图上进行呢?

视图与表是一对一关系情况:如果没有其它约束(如视图中没有的字段,在基本表中是必填字段情况),是可以进行增删改数据操作;

如我们创建用户关键信息视图view_user_keyinfo,如下:

DROP VIEWIF EXISTS `view_user_keyinfo`;CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY DEFINER VIEW `view_user_keyinfo` AS SELECT    `u`.`id` AS `id`,    `u`.`account` AS `account`,    `u`.`name` AS `username`FROM    `user` `u`;

进行增删改操作如下,操作成功(注意user表中的其它字段要允许为空,否则操作失败):

INSERT INTO view_user_keyinfo (account, username)VALUES    ('test1', 'test1');DELETEFROM    view_user_keyinfoWHERE    username = 'test1';UPDATE view_user_keyinfoSET username = 'updateuser'WHERE    id = 1
视图与表是一对多关系情况:如果只修改一张表的数据,且没有其它约束(如视图中没有的字段,在基本表中是必填字段情况),是可以进行数据操作,如以下语句,操作成功;

update view_user_course set coursename='JAVA' where id=1;update view_user_course set username='test2' where id=3;
以下操作失败:

delete from view_user_course where id=3;insert into view_user_course(username, coursename) VALUES('2','3');




































原创粉丝点击