参考:https://www.cnblogs.com/chenpi/p/5133648.html
1、什么是视图
通俗的讲,视图就是一条select语句执行后返回的结果集。所以,我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。
2、视图的特性
视图是对若干张基本表的引用,一张虚表,查询语句执行的结果,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变)
可以跟基本表一样,进行增删改查操作(增删改操作有条件限制)
3、视图的作用
方便操作,特别是查询操作,减少复杂的SQL语句,增强可读性;
更加安全,数据库授权命令不能限定到特定行和特定列,但是通过合理创建视图,可以把权限限定到行列级别。
4、使用场合
权限控制的时候,不希望用户访问表中某些含敏感信息的列,比如salary。
关键信息来源于多个复杂关联表,可以创建视图提取我们需要的信息,简化操作。
实例1:
现有三张表:用户(user)、课程(course)、用户课程中间表(user_course),表结构及数据如下:
1 -- ---------------------------- 2 -- Table structure for `course` 3 -- ---------------------------- 4 DROP TABLE IF EXISTS `course`; 5 CREATE TABLE `course` ( 6 `id` bigint(20) NOT NULL AUTO_INCREMENT, 7 `name` varchar(200) NOT NULL, 8 `description` varchar(500) NOT NULL, 9 PRIMARY KEY (`id`) 10 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; 11 12 -- ---------------------------- 13 -- Records of course 14 -- ---------------------------- 15 INSERT INTO `course` VALUES ('1', 'JAVA', 'JAVA课程'); 16 INSERT INTO `course` VALUES ('2', 'C++', 'C++课程'); 17 INSERT INTO `course` VALUES ('3', 'C语言', 'C语言课程'); 18 19 -- ---------------------------- 20 -- Table structure for `user` 21 -- ---------------------------- 22 DROP TABLE IF EXISTS `user`; 23 CREATE TABLE `user` ( 24 `id` bigint(20) NOT NULL AUTO_INCREMENT, 25 `account` varchar(255) NOT NULL, 26 `name` varchar(255) NOT NULL, 27 `address` varchar(255) DEFAULT NULL, 28 `others` varchar(200) DEFAULT NULL, 29 `others2` varchar(200) DEFAULT NULL, 30 PRIMARY KEY (`id`) 31 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; 32 33 -- ---------------------------- 34 -- Records of user 35 -- ---------------------------- 36 INSERT INTO `user` VALUES ('1', 'user1', '小陈', '美国', '1', '1'); 37 INSERT INTO `user` VALUES ('2', 'user2', '小张', '日本', '2', '2'); 38 INSERT INTO `user` VALUES ('3', 'user3', '小王', '中国', '3', '3'); 39 40 -- ---------------------------- 41 -- Table structure for `user_course` 42 -- ---------------------------- 43 DROP TABLE IF EXISTS `user_course`; 44 CREATE TABLE `user_course` ( 45 `id` bigint(20) NOT NULL AUTO_INCREMENT, 46 `userid` bigint(20) NOT NULL, 47 `courseid` bigint(20) NOT NULL, 48 PRIMARY KEY (`id`) 49 ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; 50 51 -- ---------------------------- 52 -- Records of user_course 53 -- ---------------------------- 54 INSERT INTO `user_course` VALUES ('1', '1', '2'); 55 INSERT INTO `user_course` VALUES ('2', '1', '3'); 56 INSERT INTO `user_course` VALUES ('3', '2', '1'); 57 INSERT INTO `user_course` VALUES ('4', '2', '2'); 58 INSERT INTO `user_course` VALUES ('5', '2', '3'); 59 INSERT INTO `user_course` VALUES ('6', '3', '2');
表内容:
当我们要查询小张上的所有课程相关信息的时候,需要这样写一条长长的SQL语句,如下:
1 SELECT 2 `uc`.`id` AS `id`, 3 `u`.`name` AS `username`, 4 `c`.`name` AS `coursename` 5 FROM 6 `user` `u` 7 LEFT JOIN `user_course` `uc` ON ((`u`.`id` = `uc`.`userid`)) 8 LEFT JOIN `course` `c` ON ((`uc`.`courseid` = `c`.`id`)) 9 WHERE 10 u.`name` = '小张';
我们可以通过视图简化操作,创建视图view_user_course如下:
1 -- ---------------------------- 2 -- View structure for `view_user_course` 3 -- ---------------------------- 4 DROP VIEW 5 IF EXISTS `view_user_course`; 6 7 CREATE ALGORITHM = UNDEFINED 8 DEFINER = `root`@`localhost` SQL SECURITY DEFINER 9 VIEW `view_user_course` AS ( 10 SELECT 11 `uc`.`id` AS `id`, 12 `u`.`name` AS `username`, 13 `c`.`name` AS `coursename` 14 FROM 15 ( 16 ( 17 `user` `u` 18 LEFT JOIN `user_course` `uc` ON ((`u`.`id` = `uc`.`userid`)) 19 ) 20 LEFT JOIN `course` `c` ON ((`uc`.`courseid` = `c`.`id`)) 21 ) 22 );
几点说明(MySQL中的视图在标准SQL的基础上做了扩展)
ALGORITHM=UNDEFINED:指定视图的处理算法
DEFINER=`root`@`localhost`:指定视图创建者
SQL SECURITY DEFINER:指定视图查询数据时的安全验证方式
创建好视图之后,我们可以直接用以下SQL语句在视图上查询小张上的所有课程的信息,如下:
1 SELECT 2 vuc.username, 3 vuc.coursename 4 FROM 5 view_user_course vuc 6 WHERE 7 vuc.username = '小张';
查询结果: