MySQL 视图

本文详细介绍了MySQL中的视图概念,包括视图与表的区别与联系,不同类型视图的工作原理,以及如何创建、修改和删除视图。重点讲解了视图在权限控制和性能优化中的作用,以及视图在多表关联查询中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

😇作者介绍:一个有梦想、有理想、有目标的,且渴望能够学有所成的追梦人。

🎆学习格言:不读书的人,思想就会停止。——狄德罗

⛪️个人主页:进入博主主页

🗼专栏系列:MySQL知识集合

🌼欢迎小伙伴们访问到博主的文章内容,在浏览阅读过程发现需要纠正的地方,烦请指出,愿能与诸君一同成长!

目录

文章内容如下

✏️前言

✏️一、什么是视图

✏️二、视图概述

📝one / 视图和表的区别

📝two / 视图和表的联系

📝three / 视图的类型

✏️三、视图简单使用

📝one / 首先创建两张表

📝two / 创建视图(测试)

​编辑

📝three / 视图将多张表合到虚拟表(测试)

✏️三、视图的删除、修改

📝one / 删除视图

📝two / 修改视图

✏️总结


文章内容如下


✏️前言

什么是 MySQL 视图呢,其实就是一张由查询创建的虚拟表,所谓视图(View):视图是由查询结果形成一张虚拟的表。非临时表,只要不删除的话就会一直存放在磁盘上,但是没有对应的文件。视图的使用和正常的表的使用一样。


✏️一、什么是视图

视图是数据库中数据的定制的子集,可以限制用户直接访问原始表,确保用户通过视图来操作数据,这种机制有效地保护了用户和应用程序,减少了数据库结构变更对它们的影响。
视图是一种抽象层,动态地从表中提取信息,创建出一个看似实体的虚拟表。尽管视图在数据库中持久存在,除非被显式删除,但它们并不会自行更新或消失。
视图能够优化查询效率,尤其是在处理多表关联查询时,能够简化复杂的SQL语句和逻辑处理。与之相对的是临时表,它们通常存储在tempdb中,并且在查询完成后不会自动消失,可能会持续消耗资源。
视图通常与主数据库存储在相同的位置,而临时表则始终位于tempdb中。
建议在使用视图时用于多表连接的查询浏览,而不推荐用于数据的增删改操作。这样做不仅保持了数据的完整性,还能提高数据库的执行效率。


✏️二、视图概述

📝one / 视图和表的区别

视图可以被视为预编译的SQL查询,而表则不是。
视图并不存储数据记录,它们仅仅是逻辑表示,而表则包含实际的物理数据。
可以将表视为内容的容器,而视图则是查看这些内容的窗口。


表需要物理存储空间,而视图不占用任何物理空间。视图的变更只能通过重新创建其定义的SQL语句来实现,而表可以直接进行修改。


视图提供了一种查看数据表中特定字段组合的方法,它们是由SQL语句集合构成的逻辑概念。从安全角度来看,视图可以阻止用户直接访问数据表,从而保护表的结构不被用户了解。


表是全局模式下的实体,而视图属于局部模式,是虚拟的表。
创建或删除视图只会影响视图本身,而不会影响其对应的基本表。

📝two / 视图和表的联系

视图在MySQL中是一种基于一个或多个基本表的查询结果的虚拟表。它不存储数据,而是实时从基本表中检索数据。视图提供了一种逻辑上的抽象,允许用户以不同的方式查看和操作数据,同时提供数据安全性和独立性。视图的数据行和结构来源于基本表,当查询视图时,数据库系统会根据视图的定义从基本表中检索数据。视图可以简化复杂查询,并允许在不影响应用程序的情况下对基本表结构进行修改。

📝three / 视图的类型

在Mysql中视图的类型分为三种

👉1、MERGE(合并算法)

将视图的sql语句和引用视图的sql语句合并在一起,最后一起执行,当引用视图时,引用视图的语句与定义视图的语句合并。

👉2、TEMPTABLE(临时表算法)

将视图的结果集存放在临时表中,每次执行时从临时表中操作,当引用视图时,根据视图的创建语句建立一个临时表。

👉3、UNDEFINED(未定义算法)

当引用视图时,根据视图的创建语句建立一个临时表,默认的视图类型,DBMS倾向于选择而不是必定选择MERGE,因为MERGE的效率更高,更重要的是临时表视图不能更新,所以,这里推荐使用MERGE算法类型视图。


✏️三、视图简单使用

📝one / 首先创建两张表

create table emp
(
 eid int primary key auto_increment , 
 ename varchar(20) not null , 
 eage varchar(20) not null 

)engine = innodb default charset=utf8
insert into emp(ename,eage) values('张三','男');
insert into emp(ename,eage) values('李四','男');
insert into emp(ename,eage) values('王五','男');
select * from emp


-- 班级表
create table clasz
(
	cid int primary key auto_increment ,
	eid int not null ,
	cname varchar(20) not null 
)engine = innodb default charset = utf8


insert into clasz(eid,cname) values(1,'199');
insert into clasz(eid,cname) values(2,'186');
insert into clasz(eid,cname) values(3,'186');
select * from clasz

📝two / 创建视图(测试)

-- 创建视图(也就是虚拟表)它的关键字是(view)
create view v_eam1 as select * from emp
-- 查询虚拟表数据
select * from v_eam1

📝three / 视图将多张表合到虚拟表(测试)

-- 多表关联查询加入到虚拟表
create view v_em2 as select A.ename ,B.cname from emp as A join clasz as B on A.eid=B.eid
-- 查询
select * from v_em2


✏️三、视图的删除、修改

📝one / 删除视图

-- 删除视图
drop view v_eam2

📝two / 修改视图

-- 修改视图
alter view v_eam2 as select ename from emp 
select * from v_eam2


✏️总结

好了差不多了,这是一个简单的示例,希望能帮到需要帮助的小伙伴。
视图的优点有很多,比如:权限控制, 把表的权限封闭,但是开放相应的视图查看权限,视图中只开放部分数据。比如 一般情况下(无特殊优化)表的行数超过200w时,操作就会明显变慢,可以把一张表的数据,拆分成多张表来存放,利用视图,把多张表形成一张视图,看起来像是一整张表。还有就是数据表的整理,把A、B表合成C表,要想让原来的SQL不变,可以通过C表,把A、B表结构相同数据相同的视图创建出来继续使用。

### 创建、查询和管理 MySQL 视图的方法 #### 一、创建视图MySQL 中,可以通过 `CREATE VIEW` 语句来创建视图。以下是具体的语法: ```sql CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]; ``` - **`view_name`**: 表示要创建的视图名称。 - **`select_statement`**: 是一条标准的 SQL 查询语句,用于定义视图的内容[^4]。 ##### 示例 假设有一个名为 `employees` 的表,包含字段 `id`, `name`, 和 `salary`。如果想创建一个只显示员工姓名和薪水的视图,则可以这样写: ```sql CREATE VIEW employee_salary_view AS SELECT name, salary FROM employees; ``` 此命令将创建一个名为 `employee_salary_view` 的视图[^1]。 #### 二、查询视图 一旦视图被创建,就可以像对待普通表一样对其进行查询操作。例如,继续上面的例子,我们可以这样查询该视图: ```sql SELECT * FROM employee_salary_view WHERE salary > 5000; ``` 这将返回所有工资超过 5000 的员工的名字及其对应的薪资情况[^2]。 #### 三、管理视图 除了创建和查询之外,还需要掌握如何更新或者删除已有的视图。 ##### 修改视图 可以直接使用带有 OR REPLACE 子句的新 CREATE VIEW 命令重新定义现有视图而不必先将其删除再重建新版本: ```sql CREATE OR REPLACE VIEW employee_salary_view AS SELECT id, name, salary FROM employees WHERE department='Sales'; ``` 这里我们不仅增加了部门筛选条件还加入了 ID 字段作为额外信息展示的一部分[^3]。 ##### 删除视图 当不再需要某个特定视图时,应该考虑移除它以保持数据库整洁有序。执行如下指令即可完成这一过程: ```sql DROP VIEW IF EXISTS employee_salary_view; ``` 这条语句会安全地尝试销毁指定名字下的任何现存实例——即如果没有找到同名对象则不会报错而是静默忽略掉请求[^3]。 --- ### 注意事项 需要注意的是,在构建新的虚拟表格之前应当清楚了解哪些类型的 SELECT 结构支持转换成持久化形式供后续调用者反复利用。比如不能含有某些特殊关键字如 DISTINCT , GROUP BY 等等因为它们可能破坏了原本打算呈现出来的直观映射关系[^3]。 ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半杯可可

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值