MySQL中的视图

2023-05-16

视图概述

视图是一种虚拟存在的表,并不在数据库中实际存在,它的数据依赖于真实存在的数据表。通过视图不仅可以看到其依赖数据表中的数据,还可以像操作数据表一样,对数据表中的数据进行添加、修改和删除。与直接操作数据表相比,视图具有以下优点。

简化查询语句

视图不仅可以简化用户对数据的理解,也可以简化对数据的操作。

安全性

通过视图,可以更加方便的进行权限控制,使特定用户只能查询和修改指定的数据,而无法查看修改数据库中的其他数据。

逻辑数据独立性

视图可以帮助用户屏蔽数据表结构变化带来的影响。

视图管理

视图管理包括创建、查看、修改和删除视图。

创建视图

CREATE [OR REPLACE] VIEW 视图名 [(字段列表)] AS select_statement

关于上述语法格式的具体介绍如下。

(1)[OR REPLACE]:可选参数,表示若数据库中已经存在这个名称的视图就替换原有的视图,若不存在则创建视图;

(2)视图名:表示要创建的视图名称,该名称在数据库中必须是唯一的,不能与其他数据表或视图同名;

(3)select_statement:指一个完整的SELECT语句,表示从某个数据表或视图中查出满足条件的记录,将这些记录导入视图中。

视图的基本表可以是一张数据表,也可以是多张数据表,下面分别以视图的基本表为单表和多表这两种情况,通过案例演示如何创建视图,具体如下。

基于单表创建视图

例如,将员工工号empno、员工姓名ename、职位job和部门编号deptno查询出来创建视图view_emp,具体SQL语句如下所示。

CREATE VIEW view_emp AS SELECT empno,ename,job,deptno FROM emp;

下面使用SELECT语句查看view_emp视图,查询语句如下所示。

SELECT * FROM view_emp;

例如,创建一个新的视图view_emp2,视图view_emp2中包含的字段和视图view_emp相同,但视图view_emp2中字段名称和员工表中字段名称不一致,具体创建语句如下所示。

CREATE VIEW view_emp2 (e_no,e_name,e_job,e_deptno)
 AS SELECT empno,ename,job,deptno FROM emp;

基于多表创建视图

例如,视图中需要使用ems数据库中员工编号empno、员工姓名ename、职位job、部门编号deptno和部门名称dname的信息。 下面根据需求创建视图view_emp_dept,具体创建语句及执行结果如下所示。

CREATE VIEW view_emp_dept(e_no,e_name,e_job,e_deptno,e_deptname)
AS SELECT e.empno,e.ename,e.job,e.deptno,d.dname
   FROM emp e LEFT JOIN dept d ON e.deptno=d.deptno;

查看视图

创建好视图后,可以通过语句查看视图的字段信息、视图的状态信息、视图的创建语句。

(1)查看视图的字段信息

在MySQL中,使用DESCRIBE语句可以查看视图的字段名、字段类型等字段信息。DESCRIBE语句的基本语法格式如下所示。

DESCRIBE 视图名;

或简写为:

DESC 视图名;

 例如,使用DESCRIBE语句查看视图view_emp_dept的字段信息,具体语句如下所示。

DESCRIBE view_emp_dept;

(2)查看视图的状态信息

在MySQL中,可以使用SHOW TABLE STATUS语句可以查看视图和数据表的状态信息。SHOW TABLE STATUS语句的基本语法格式如下所示。

SHOW TABLE STATUS LIKE '视图名';

在上述格式中,LIKE表示后面匹配的是字符串,'视图名'表示要查看的视图的名称,视图名称需要使用单引号包裹起来。

例如,使用SHOW TABLE STATUS语句查看视图view_emp_dept的信息,具体语句如下所示。

SHOW TABLE STATUS LIKE 'view_emp_dept' \G

(3)查看视图的创建语句

SHOW CREATE VIEW 视图名;

例如:

SHOW CREATE VIEW view_emp_dept\G

修改视图

视图的修改指的是修改数据库中存在的视图的定义,当视图的基本表中字段发生变化时,需要对视图进行修改以保证查询的正确性。例如,view_emp视图的基本表emp中员工姓名字段修改了名称,此时再使用视图就会出错。在MySQL中,修改视图的方式有两种,具体如下。

(1)使用CREATE OR REPLACE VIEW语句修改视图

CREATE OR REPLACE VIEW 视图名 AS SELECT语句

使用该语句修改视图时,要求被修改的视图在数据库中已经存在,如果视图不存在,那么将创建一个新的视图。

例如,在视图view_emp_dept原有的基础上新增员工上级工号的字段,具体SQL语句如下所示。

CREATE OR REPLACE VIEW view_emp_dept(e_no,e_name,e_job,e_mgr,e_deptno,e_deptname)
AS SELECT e.empno,e.ename,e.job,e.mgr,e.deptno,d.dname
    FROM emp e LEFT JOIN dept d ON e.deptno=d.deptno;

(2)使用ALTER语句修改视图

ALTER VIEW <视图名> AS <SELECT语句>

例如,使用ALTER语句将视图view_emp_dept中的部门编号字段进行删除,具体语句如下所示。

ALTER VIEW view_emp_dept (e_no,e_name,e_job,e_mgr,e_deptname)
AS SELECT e.empno,e.ename,e.job,e.mgr,d.dname
    FROM emp e LEFT JOIN dept d ON e.deptno=d.deptno;

删除视图

当视图不再使用时,可以将其删除。删除视图时,只会删除所创建的视图,不会删除基本表中的数据。删除一个或多个视图可以使用DROP VIEW语句,删除视图的基本语法格式如下所示。

DROP VIEW  view_name [,view_name1,…];

例如,使用DROP VIEW语句删除视图view_emp,具体SQL语句如下所示。

DROP VIEW view_emp;

视图数据操作

视图数据操作,就是通过视图来查询、添加、修改和删除基本表中的数据。因为视图是一个虚拟表,不真实保存数据,所以通过视图来操作数据时,实际操作的是基本表中的数据。本节将对视图数据的添加、修改和删除进行讲解。

添加数据

通过视图向基本表添加数据可以使用INSERT语句。例如,通过视图在部门表中添加一个部门信息。 由于此时数据库中还没有部门表对应的视图,所以需要数据库管理员先创建部门表dept对应的视图,具体SQL语句如下所示。

CREATE VIEW view_dept(d_no,d_name) AS SELECT * FROM dept;

 通过视图向数据表中添加数据的方式与直接向数据表中添加数据的格式一样,具体SQL语句如下所示。

INSERT INTO view_dept VALUES(50, '人力资源部');

修改数据

通过视图修改基本表的数据,可以使用UPDATE语句。 例如,使用UPDATE语句,通过视图将研究院的部门名称修改为研究中心,具体SQL语句如下所示。

UPDATE view_dept SET d_name='研究中心' WHERE d_name='研究院';

删除数据

通过视图删除基本表的数据,可以使用DELETE语句。 例如,通过视图view_dept删除部门表dept中部门名称为人力资源部的记录,具体SQL语句如下所示。

DELETE FROM view_dept WHERE d_name='人力资源部';

上机实践:图书管理系统中视图的应用

# 创建一个只包含图书名称、图书上架时间和图书状态的视图view_book_state

# 创建一个只包含图书名称、借阅者名称和借阅时间的视图view_book_borrower

# 删除视图view_book_borrower

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL中的视图 的相关文章

随机推荐

  • 您的连接不是私密连接

    写在前面 xff1a 可能原因 xff1a 网站被封了 网站进行了迁移 网站是外网 xff08 需要 搭工具 xff09 试试打开普通常见的那些网站 xff0c 若是正常 xff0c 说明浏览器没有问题 xff0c 是当前你访问的该网站的问
  • Nginx 反向代理+负载均衡

    一 Nginx 的引入背景 公司产品出现瓶颈 xff1f 我们公司项目刚刚上线的时候 xff0c 并发量小 xff0c 用户使用的少 xff0c 所以在低并发的情况下 xff0c 一个jar包启动应用就够了 xff0c 然后内部tomcat
  • curl: (56) Recv failure: Connection reset by peer

    Docker 重定向问题 curl 56 Recv failure Connection reset by peer 解决思路 以下考虑情况 xff0c 针对的是docker部署springboot项目 我在springboot的配置文件
  • c#快速入门~在java基础上,知道C#和JAVA 的不同即可

    观看下文前提 xff1a 如果你的主语言是java xff0c 现在想再学一门新语言C xff0c 下文是在java基础上 xff0c 对比和java的不同 xff0c 快速上手C xff0c 当然不是说学C 的前提是需要java xff0
  • Visual Studio Code 常见的配置、常用好用插件以及【vsCode 开发相应项目推荐安装的插件】

    一 VsCode 常见的配置 1 取消更新 把插件的更新也一起取消了 2 设置编码为utf 8 xff1a 默认就是了 xff0c 不用设置了 3 设置常用的开发字体 xff1a Consolas 默认就是了 xff0c 不用设置了 字体对
  • vscode开发常用的工具栏选项,查看源码技巧以及【vscode常用的快捷键】

    一 开发常用的工具栏选项 1 当前打开的文件快速在左侧资源树中定位 xff1a 其实打开了当前的文件已经有在左侧资源树木定位了 xff0c 只是颜色比较浅 2 打开太多文件的时候 xff0c 可以关闭 3 设置查看当前类或文件的结构 OUT
  • lua变量、数据类型、if判断条件和数据结构table以及【lua 函数】

    一 lua变量 全局变量和局部变量和表中的域 Lua 变量有三种类型 xff1a 全局变量和局部变量和表中的域 全局变量 xff1a 默认情况下 xff0c Lua中所有的变量都是全局变量 局部变量 xff1a 使用local 显式声明在函
  • C++随机数

    C 43 43 随机数 C 43 43 提供了两个函数 xff0c 用于返回随机数 xff1a rand 和 srand rand 功能 xff1a 随机数发生器 用法 xff1a include lt stdlib h gt int ra
  • 进程如何判断是否在docker环境里运行

    一 判断根目录下 dockerenv 文件 docker环境下 xff1a ls alh dockerenv 非docker环境 xff0c 没有这个 dockerenv文件的 root 64 4cb54de415d4 ls alh doc
  • lua元表、元方法

    lua元表 元方法 lua官方参考手册 xff1a https www runoob com manual lua53doc manual html 2 4 一 总结 xff1a 1 普通的表 xff0c 找不到了 xff0c 或者无法进行
  • 一个less文件中引入另一个less文件

    假设有两个 less的文件1 less 和2 less 在1 less 中引入2 less文件 64 import 34 2 less 34 34 34 是一定不可以忘记的
  • Python——函数

    函数的创建和调用 xff1a 函数的创建和调用 为什么需要函数 xff1a 复用代码 隐藏实现细节 提高可维护性 提高可读性便于调试 函数的创建 def 函数名 输入参数 函数体 return xxx span class token ke
  • ubuntu18.04安装微信

    1 安装deepin wine 使用shell的方法下载各种deb包 1 具体的操作为 xff1a 在home中打开终端 xff08 terminal xff09 xff0c 运行以下语句 xff1a gedit install sh 弹出
  • 实现MySql的主从复制(两台虚拟机)详解

    实现MySql的主从复制 xff08 非单机 xff09 文章目录 实现MySql的主从复制 xff08 非单机 xff09 首先了解心跳线实现数据同步一 mysql主从复制原理是什么 xff1f 二 使用步骤1 安装Mysql2 数据库进
  • ubuntu安装完anaconda,添加快捷启动方式

    1 进入文件夹 xff0c 找到anaconda的bin文件并进入 home 用户 anaconda3 bin 2 进入后右键打开terminal 3 在terminal中输入 anaconda navigator 4 这时候就会发现ana
  • 分别用汇编语言、C语言编程实现LED流水灯

    一 C语言编程 1 先创建一个新的工程 2 文件名 3 右键Source Group创建一个 c文件 4 在 c文件中放入以下代码 APB2使能时钟寄存器 define RCC AP2ENR unsigned volatile int 0x
  • SyntaxError: invalid syntax的问题原因和解决办法

    写在这里的初衷 xff0c 一是备忘 xff0c 二是希望得到高人指点 xff0c 三是希望能遇到志同道合的朋友 目录 一 问题二 原因及解决办法 一 问题 span class token comment An highlighted b
  • Java 字符串匹配的三种方法

    文章目录 一 示例二 解释1 replace 方法2 replaceAll 方法3 replaceFirst 方法4 常用的字符列表 一 示例 如图 xff0c 都是为了替换字符串s中的 34 34 符号 xff0c 但三种匹配方法 xff
  • 【VMware+ubuntu】关闭还原虚拟机后网络断开的解决办法

    使用ifconfig和ip addr 发现对应网卡down掉了 手动执行ifcconfig ens33 up把网卡up起来 xff0c 发现网卡是起来了 xff0c 但是没有IP 重启网络服务sudo service network man
  • MySQL中的视图

    视图概述 视图是一种虚拟存在的表 xff0c 并不在数据库中实际存在 xff0c 它的数据依赖于真实存在的数据表 通过视图不仅可以看到其依赖数据表中的数据 xff0c 还可以像操作数据表一样 xff0c 对数据表中的数据进行添加 修改和删除