• Mysql的视图


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

    查询结果:

  • 相关阅读:
    2019年9月15日晚间测试-T1
    机房巨佬的随机名称生成器
    初来乍到
    GKurumi记
    GKurumi记
    小P的团战
    什么才算是真正的编程能力?
    java冒泡排序和快速排序
    “转行做程序员”很难?这里有4个重要建议
    Linux文件I/O(一)
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/13618260.html
Copyright © 2020-2023  润新知