参考: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 = '小张';

查询结果:

 

 

posted on 2020-09-05 15:06  周伯通789  阅读(132)  评论(0编辑  收藏  举报