mysql进阶(视图)---py全栈

一、什么是视图?

视图是从一个或几个基本表中导出的表,它与基本表不同,是一个虚表。也就是说是一个动态表,所有的数据依然保存在基本表中,基本表发生变化,视图的结果也相应发生变化。

二、视图的特性

视图是对若干张基本表的引用,一张虚表,查询语句执行的结果,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变);

可以跟基本表一样,进行增删改查操作(ps:增删改操作有条件限制,基本上用于查找操作);

视图和基本表一样,使用show tables;可以看到视图表。

三、视图的优点

  1. 视图能够简化用户操作,

    视图机制用户可以将注意力集中在关心的数据上,如果这些数据不是直接来自基本表,则可以通过定义视图,使数据库看起来结构简单、清晰,并且可以简化用户的数据查询操作。可以极大的减小查询语句的复杂程度。

  2. 视图使用户能以不同的角度看待同样的数据

    对于固定 的一些基本表,我们可以给不同的用户建立不同的视图,这样不同的用户看到自己需要的信息就可以了。

  3. 视图对重构数据库提供了一定程度上的方便

    如果原来A表的数据被分割成了B表和C表,我们仍然可以在B表和C表的基础上构建一个视图A,而使用该数据表的程序可以不变(使用同样的方式去访问,透明访问)

  4. 视图能够对机密数据提供安全保护

    我们希望不同的用户只能看到自己的东西,其他的东西无法看到,这样我们可以通过视图去为每个用户建立一个视图。

四、使用场合

1、权限控制的时候,不希望用户访问表中的某些信息的时候

2、关键信息来源于多个复杂的关联表,可以创建视图提取我们需要的信息,简化操作。

五、视图基本操作

  1. 创建视图

    --格式:CREATE VIEW 视图名称 AS  SQL语句
    CREATE VIEW v1 AS
    SELET nid,
    name
    FROM
    A
    WHERE
    nid > 4
  2. 删除视图

    --格式:DROP VIEW 视图名称
    DROP VIEW v1
  3. 修改视图

    -- 格式:ALTER VIEW 视图名称 AS SQL语句
    
    ALTER VIEW v1 AS
    SELET A.nid,
    B. NAME
    FROM
    A
    LEFT JOIN B ON A.id = B.nid
    LEFT JOIN C ON A.id = C.nid
    WHERE
    A.id > 2
    AND C.nid < 5
  4. 使用视图

    使用视图的时候,可以将其当做表进行操作即可,

    -- 我们已经创建了v1视图
    select * from v1

六、案例

使用如下代码创建数据库结构:

-- 创建表结构
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0; -- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`description` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; -- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES (1, 'JAVA', 'JAVA课程');
INSERT INTO `course` VALUES (2, 'C++', 'C++课程');
INSERT INTO `course` VALUES (3, 'C语言', 'C语言课程'); -- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`account` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`others` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`others2` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; -- ----------------------------
-- Records of 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'); -- ----------------------------
-- Table structure for 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`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; -- ----------------------------
-- Records of 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); SET FOREIGN_KEY_CHECKS = 1;

当我们要向查询小张的所有课程相关信息的时候,需要这样写:

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`))
WHERE
u.`name` = '小张'

使用视图之后,

-- ----------------------------
-- View structure for `view_user_course`
-- ----------------------------
DROP VIEW
IF 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`))
)
); # 查询小张所有信息
SELECT
vuc.username,
vuc.coursename
FROM
view_user_course vuc
WHERE
vuc.username = '小张'

总结:

视图中的查询语句性能需要进行调优,并且视图功能建议只用作查询操作,不要对视图进行增删改查。因为涉及到多张表的数据。

MySQL进阶(视图)---py全栈的更多相关文章

  1. MySQL基础----py全栈

    目录 MySQL基础----py全栈 一.引言 1.什么是数据? 2.什么是数据库(DB)? 3.什么是数据库管理系统(DBMS)? 4.什么是数据库系统? 5.数据库管理系统由来 6.什么是数据模型 ...

  2. koa+mysql+vue+socket.io全栈开发之数据访问篇

    后端搭起大体的框架后,接着涉及到的就是如何将数据持久化的问题,也就是对数据库进行 CURD 操作. 关于数据库方案, mongodb 和 mysql 都使用过,但我选用的是 mysql,原因: 目前为 ...

  3. Ionic APP-Web SPA开发进阶(一)AngularJS全栈工程狮进阶

    AngularJS全栈工程狮进阶 前言 学习了一段时间AngularJS,开始接触移动端APP开发.为了响应公司开发需求,采用"Hybrid"混血开发方法.采用Ionic前端框架, ...

  4. koa+mysql+vue+socket.io全栈开发之web api篇

    目标是建立一个 web QQ的项目,使用的技术栈如下: 后端是基于koa2 的 web api 服务层,提供curd操作的http接口,登录验证使用的是 json web token,跨域方案使用的是 ...

  5. koa+mysql+vue+socket.io全栈开发之前端篇

    React 与 Vue 之间的对比,是前端的一大热门话题. vue 简易上手的脚手架,以及官方提供必备的基础组件,比如 vuex,vue-router,对新手真的比较友好:react 则把这些都交给社 ...

  6. 老男孩python3.5全栈开发第9期+课件笔记(1-15部全 共125天完整无加密)

    点击了解更多Python课程>>> 老男孩python3.5全栈开发第9期+课件笔记(1-15部全 共125天完整无加密)大小:236G 此课程为老男孩全栈开发最新完结课程,适合零基 ...

  7. Python全栈开发之路 【第四篇】:Python基础之函数

    本节内容 函数def: 1.位置参数,默认参数 2.位置参数,关键参数 3.如果参数中出现 *users,传递的参数就可以不再是固定的个数, 传过来的所有元素进行打包成元组 *args,**kwarg ...

  8. Python全栈之路----目录

    Module1 Python基本语法 Python全栈之路----编程基本情况介绍 Python全栈之路----常用数据类型--集合 Module2 数据类型.字符编码.文件操作 Python全栈之路 ...

  9. Python全栈之路----函数----返回值

    函数外部的代码想要获取函数的执行结果,就可以在函数里用return语句,把结果返回. def stu_register(name,age,course='PY',country='CN'): prin ...

随机推荐

  1. C++学习笔记(2)----模板

    1. 与其他任何类相同,我们既可以在类模板内部,也可以在类模板外部为其定义成员函数,且定义在类模板内的成员函数被隐式声明为内联函数. 2. 默认情况下,对于一个实例化了的类模板,其成员只有在使用时才被 ...

  2. 图片(imageView)

    图片(imageView): 常用属性: android:scaleType(图片显示的格式) android:src(图片源,一般使用的资源) android:scaleType属性的常用取值 0. ...

  3. 7.bootstrap HTML编码规范

    Bootstrap HTML编码规范 语法 用两个空格来代替制表符(tab) -- 这是唯一能保证在所有环境下获得一致展现的方法. 嵌套元素应当缩进一次(即两个空格). 对于属性的定义,确保全部使用双 ...

  4. JpaRepository 查询规范

    1.JpaRepository支持接口规范方法名查询.意思是如果在接口中定义的查询方法符合它的命名规则,就可以不用写实现,目前支持的关键字如下. Keyword Sample JPQL snippet ...

  5. Java学习-0

    Java简单介绍 第一个程序Hello World 基本数据类型 对象和类 数据声明 函数声明 参数传递 Java简单介绍 Java的优点:简单.可移植性 JDK (Java Development ...

  6. python字典的排序

    # -*- coding:UTF-8 -*- def dict_sort(): # 按照value的值从大到小的顺序进行排序 dic = {'a': 31, 'bc': 5, 'c': 3, 'asd ...

  7. MVC Controller的激活

    各Controller的继承关系 Controller最重要的是对Execute方法的调用,当目标Controller对象被激活后,对请求的后续处理和最终响应均是通过执行这个Execute方法来完成. ...

  8. Asp.Net MVC Identity 2.2.1 使用技巧(一)

    开发环境:vs2015 UP3  or  vs2017RC  项目环境:asp.net 4.6.1   identity版本为:asp.net identity 2.2.1 1.创建项目. 没什么好说 ...

  9. DNS配置范例

    这里使用CentOS 7作为DNS主服务器.(ip:172.18.7.77) 正向解析配置: ]# vim /etc/named.rfc1912.zones zone "opsnote.co ...

  10. Iptables教程

    iptables防火墙简介 Iptables也叫netfilter是Linux下自带的一款免费且优秀的基于包过滤的防火墙工具,它的功能十分强大,使用非常灵活,可以对流入.流出.流经服务器的数据包进行精 ...