MySQL_04_视图
@
视图
视图:虚拟表(从一个或多个表/视图导出数据形成)
1)视图不含实际数据(数据仍在原表中),只存储视图本身的定义
2)表中数据发生变化,视图查询的数据也会随之改变
视图作用 | 说明 |
---|---|
简化查询 | 抽取多表数据建立虚拟表,就可以操作像单表一样操作 |
保证安全 | 限制用户对数据库的访问范围 |
避免数据冗余 | 只使用SELECT语句,所有数据都保存在数据库表中 |
保证逻辑独立 | 可以使应用程序和数据库表在一定程度上独立 |
多角度查看数据 | 视图机制可使用户以不同方式查看同一数据 |
1)视图对用户而言,操作方法和对数据表的操作方法是一样的
2)DBMS(数据库管理系统)而言,对视图的操作最终都会转化为对表的操作
查看视图相关信息的指令如下:
1)列出当前数据库中所有的表和视图:SHOW TABLES;
2)列出创建视图时的MySQL语句:SHOW CREATE TABLE 视图名;
3)查看视图结构:DESC 视图名;
4)查看所有视图的详细信息:
SELECT * FROM information_SCHEMA.views;
// MYSQL中所有视图定义存储在系统数据库information_schema的views表中
视图的规则如下:
1)视图的创建无数量限制,但命名需有唯一性;
2)视图可嵌套,其他视图可在视图的基础上再创建新视图;
3)视图不能被索引,也不能有关联的触发器或默认值;
4)视图可和表一起使用(如:子查询和连接查询等);
创建视图
视图创建格式:
CREATE VIEW 视图名[视图字段列表] AS SELECT (字段名1[,···,字段名N]) [WHERE 条件表达式] [WITH [LOCAL|CASCADED] CHECK OPTION];
1)视图名称必须唯一,且不能与表/视图重名
2)AS不同于查询中的AS(设别名)
3)建议在视图名加前缀“VIEW_”或者后缀“_VIEW”以便管理
//在视图基础上建立视图,需给视图设置别名
//视图可以建立在表上或视图上,但表不能建立在视图上
如:利用视图查询cust_name为TNT2的cust_contact
(1)视图分为:检查视图
和普通视图
(默认)
1)有WITH CHECK OPTION
的为检查视图
2)检查视图更新数据时,需满足检查条件(视图定义中WHERE语句条件)
(2)检查视图分为:CASCADED视图
(默认)和LOCAL视图
1)CASCADED视图更新数据时,数据需满足本身检查条件的同时还需满足其底层表/视图的所有检查条件,更新语句才能执行
2)LOCAL视图对更新数据时,数据只需满足该视图的检查条件的更新语句就能执行
管理视图
视图修改格式:
ALTER VIEW 视图名|视图字段列表 AS SELECT (字段名1[,···,字段名N]) [WITH[LOCAL|CASCADED]CHECK OPTION];
1)视图的修改不同于表的修改(如:增加字段不能直接使用ADD)
视图删除格式:
DROP VIEW 视图名;
1)删除视图不会对表产生影响,不同于删除表(DROP TABLE 表名)
2)但需注意依赖关系(存在其他视图依赖删除的视图)
插入数据格式(和表完全相同):
INSERT INTO 视图名(视图名1[,···,视图名N]) VALUES (数据1 [,···,数据N]);
更新数据格式(和表完全相同):
UPDATE 视图名 SET 视图名1=值1 [,···,字段名N=值N] WHERE 条件表达式;
删除数据格式(和表完全相同):
DELETE FROM 视图名 WHERE 条件表达式;
1)视图为虚拟表,但视图的数据更新最终会转化为对表的更新(更改原表数据)
2)部分视图是不可更新的,因为不能唯一地有意义的转换成对应的表的更新
3)不能同时修改来自两个或多个表的视图数据;
4)若更新检查视图(含WITH CHECK OPTION选项),则
进行更新的数据需满足原查询条件(子查询中的条件表达式)
视图定义中有以下情况不能进行数据的更新 |
---|
FROM子句中包含多个表或者UNION运算符 |
指定了WITH CHECK OPTION,修改数据不满足视图定义的范围 |
SELECT语句包含聚合函数、列的运算、GROUP BY子句、DISTINCT选项 |
UPDATE、DELETE执行前提条件: 数据必须在视图的结果集中(查询后包含该数据) |
使用视图
视图检索数据格式(和表完全相同):
SELECT [ALL|DISTINCT] 字段名 FROM 视图 [WHERE 条件表达式] [GROUP BY 字段名|位置 [ASC|DESC] [HAVING 条件表达式]] [ORDER BY 字段名|表达式|位置[ASC|DESC]] [LIMIT M[,N]];
如:利用视图查询cust_id为10003的cust_id和cust_email
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 我在厂里搞 wine 的日子
· 如何通过向量化技术比较两段文本是否相似?
· 35+程序员的转型之路:经济寒冬中的希望与策略
· JavaScript中如何遍历对象?
· 领域模型应用
· 独立项目运营一周年经验分享
· 一款开源免费、通用的 WPF 主题控件包
· 独立开发,这条路可行吗?
· 【定时任务核心】究竟是谁在负责盯着时间,并在恰当时机触发任务?
· 解决了AI聊天的10个痛点后,我又做了一个新功能:交叉分析表