0

0

MySQl心得4--5--数据库视图_MySQL

php中文网

php中文网

发布时间:2016-06-01 13:42:12

|

1448人浏览过

|

来源于php中文网

原创

bitsCN.com  1.   修改、查询、删除记录时都会提示多少条记录被影响,但建表不会提示。当表的数据修改后反映到视图。      修改、查询、删除视图的命令跟建表时的一样。 视图是从一个或多个表(或视图)导出的表。视图是数据库的用户使用数据库的观点。可以根据他们的不同需求,在物理的数据库上定义他们对数据库所要求的数据结构,这种根据用户观点所定义的数据结构就是视图。 视图与表(有时为与视图区别,也称表为基本表——Base Table)不同,视图是一个虚表,即视图所对应的数据不进行实际存储,数据库中只存储视图的定义,对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表。 视图一经定义以后,就可以像表一样被查询、修改、删除和更新。2.使用视图有下列优点: (1)为用户集中数据,简化用户的数据查询和处理。有时用户所需要的数据分散在多个表中,定义视图可将它们集中在一起,从而方便用户的数据查询和处理。     (2)屏蔽数据库的复杂性。用户不必了解复杂的数据库中的表结构,并且数据库表的更改也不影响用户对数据库的使用。 (3)简化用户权限的管理。只需授予用户使用视图的权限,而不必指定用户只能使用表的特定列,也增加了安全性。 (4)便于数据共享。各用户不必都定义和存储自己所需的数据,可共享数据库的数据,这样同样的数据只需存储一次。 (5)可以重新组织数据以便输出到其他应用程序中。 3. 使用create view语句创建视图 语法格式: CREATE [re replace] [algorithm = {undefined | merge | temptable}]  view 视图名[(column_list)]  as select_statement  [with [cascaded| local] check option] 例:create view v_xs as select *from xs;(在xsdb库下创建) |xsdb.xs(在飞xsdb库下建xsdb里的表的视图) 说明: ●  column_list:要想为视图的列定义明确的名称,可使用可选的column_list子句,列出由逗号隔开的列名。column_list中的名称数目必须等于SELECT语句检索的列数。若使用与源表或视图中相同的列名时可以省略column_list。     ●  or replace:给定了OR REPLACE子句,语句能够替换已有的同名视图。 ●  algorithm子句:可选的ALGORITHM子句是对标准SQL的MySQL扩展,规定了MySQL的算法,算法会影响MySQL处理视图的方式。ALGORITHM可取3个值:MERGE、TEMPTABLE或UNDEFINED。如果没有ALGORITHM子句,默认算法是UNDEFINED(未定义的)。指定了MERGE选项,会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。MERGE算法要求视图中的行和基表中的行具有一对一的关系,如果不具有该关系,必须使用临时表取而代之。指定了TEMPTABLE选项,视图的结果将被置于临时表中,然后使用它执行语句。 ●   select_statement:用来创建视图的SELECT语句,可在SELECT语句中查询多个表或视图。但对SELECT语句有以下的限制: (1)定义视图的用户必须对所参照的表或视图有查询(即可执行SELECT语句)权限; (2)不能包含FROM子句中的子查询; (3)不能引用系统或用户变量; (4)不能引用预处理语句参数; (5)在定义中引用的表或视图必须存在; (6)若引用不是当前数据库的表或视图时,要在表或视图前加上数据库的名称; (7)在视图定义中允许使用ORDER BY,但是,如果从特定视图进行了选择,而该视图使用了具有自己ORDER BY的语句,则视图定义中的ORDER BY将被忽略。 (8)对于SELECT语句中的其他选项或子句,若视图中也包含了这些选项,则效果未定义。例如,如果在视图定义中包含LIMIT子句,而SELECT语句使用了自己的LIMIT子句,MySQL对使用哪个LIMIT未做定义。 ●   WITH CHECK OPTION:指出在可更新视图上所进行的修改都要符合select_statement所指定的限制条件,这样可以确保数据修改后,仍可通过视图看到修改的数据。当视图是根据另一个视图定义的时,WITH CHECK OPTION给出两个参数:LOCAL和CASCADED。它们决定了检查测试的范围。Local关键字使CHECK OPTION只对定义的视图进行检查,cascaded则会对所有视图进行检查。如果未给定任一关键字,默认值为CASCADED。 4. 注意,使用视图时,要注意下列事项: (1)在默认情况下,将在当前数据库创建新视图。要想在给定数据库中明确创建视图,创建时,应将名称指定为db_name.view_name。     (2)视图的命名必须遵循标志符命名规则,不能与表同名,且对每个用户视图名必须是唯一的,即对不同用户,即使是定义相同的视图,也必须使用不同的名字。 (3)不能把规则、默认值或触发器与视图相关联。 (4)不能在视图上建立任何索引,包括全文索引。 5.例1: 假设当前数据库是TEST,创建XSCJ数据库上的CS_KC视图,包括计算机专业各学生的学号、其选修的课程号及成绩。要保证对该视图的修改都要符合专业名为计算机这个条件。 CREATEOR REPLACE VIEW  XSCJ.CS_KC        AS  SELECT XS.学号,课程号,成绩        FROMXSCJ.XS,  XSCJ.XS_KC        WHERE  XS.学号 = XS_KC.学号 AND XS.专业名 = '计算机'  WITH CHECK OPTION; 例2: 查找平均成绩在80分以上的学生的学号和平均成绩。 本例首先创建学生平均成绩视图XS_KC_AVG,包括学号(在视图中列名为num)和平均成绩(在视图中列名为score_avg)。     创建学生平均成绩视图XS_KC_AVG: CREATEVIEW XS_KC_AVG ( num,score_avg )     AS  SELECT 学号, AVG(成绩)     FROMXS_KC  GROUP BY 学号; 再对XS_KC_AVG视图进行查询。 SELECT* FROM XS_KC_AVG     WHEREscore_avg>=80; 从以上两例可以看出,创建视图可以向最终用户隐藏复杂的表连接,简化了用户的SQL程序设计。 注意:使用视图查询时,若其关联的基本表中添加了新字段,则该视图将不包含新字段。例如,视图CS_XS中的列关联了XS表中所有列,若XS表新增了“籍贯”字段,那么CS_XS视图中将查询不到“籍贯”字段的数据。 如果与视图相关联的表或视图被删除,则该视图将不能再使用。 6.  可更新视图 要通过视图更新基本表数据,必须保证视图是可更新视图,即可以在INSET、UPDATE或DELETE等语句当中使用它们。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。还有一些特定的其他结构,这类结构会使得视图不可更新。 如果视图包含下述结构中的任何一种,那么它就是不可更新的:   (1)聚合函数; (2)DISTINCT关键字; (3)GROUP BY子句; (4)ORDER BY子句; (5)HAVING子句; (6)UNION运算符; (7)位于选择列表中的子查询; (8)FROM子句中包含多个表; (9)SELECT语句中引用了不可更新视图; (10)WHERE子句中的子查询,引用FROM子句中的表; (11)ALGORITHM 选项指定为TEMPTABLE(使用临时表总会使视图成为不可更新的)。 7.  插入数据 使用INSERT语句通过视图向基本表插入数据 例: 创建视图CS_XS,视图中包含计算机专业的学生信息,并向CS_XS视图中插入一条记录:('081255','李牧','计算机',1,'1990-10-21',50,NULL,NULL)。 首先创建视图CS_XS:(以下的删除、修改都是用该表) CREATEOR REPLACE VIEW CS_XS         AS  SELECT* FROM XS       WHERE 专业名 = '计算机'  WITH CHECK OPTION; 注意:在创建视图的时候加上WITH CHECK OPTION子句,是因为WITH CHECK OPTION子句会在更新数据的时候检查新数据是否符合视图定义中WHERE子句的条件。WITH CHECKOPTION子句只能和可更新视图一起使用。 接下来插入记录: INSERTINTO CS_XS      VALUES('081255', '李牧', '计算机', 1, '1990-10-14',50, NULL, NULL); 注意:这里插入记录时专业名只能为“计算机”。 这时,使用SELECT语句查询CS_XS视图和基本表XS,就可发现XS表中该记录已经被添加。 当视图所依赖的基本表有多个时,不能向该视图插入数据,因为这将会影响多个基本表。例如,不能向视图CS_KC插入数据,因为CS_KC依赖两个基本表:XS和XS_KC。 对INSERT语句还有一个限制:SELECT语句中必须包含FROM子句中指定表的所有不能为空的列。例如,若CS_XS视图定义的时候不加上“姓名”字段,则插入数据的时候会出错。   8.  修改数据 使用UPDATE语句可以通过视图修改基本表的数据 例: 将CS_XS视图中所有学生的总学分增加8。 UPDATECS_XS SET 总学分 = 总学分+ 8; 该语句实际上是将CS_XS视图所依赖的基本表XS中所有记录的总学分字段值在原来基础上增加8。 若一个视图依赖于多个基本表,则一次修改该视图只能变动一个基本表的数据。 例: 将CS_KC视图中学号为081101的学生的101课程成绩改为90。 UPDATECS_KC  SET 成绩=90     WHERE 学号='081101' AND 课程号='101'; 本例中,视图CS_KC依赖于两个基本表:XS和XS_KC,对CS_KC视图的一次修改只能改变学号(源于XS表)或者课程号和成绩(源于XS_KC表)。 以下的修改是错误的: UPDATECS_KC  SET 学号='081120',课程号='208'    WHERE 成绩=90; 9.  删除数据 使用DELETE语句可以通过视图删除基本表的数据 例: 删除CS_XS中女同学的记录。 DELETEFROM CS_XS  WHERE 性别 = 0; 注意:对依赖于多个基本表的视图,不能使用DELETE语句。例如,不能通过对CS_KC视图执行DELETE语句而删除与之相关的基本表XS及XS_KC表的数据。 10.使用ALTER语句可以对已有视图的定义进行修改。 语法格式: ALTER[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]     VIEW view_name [(column_list)]  AS select_statement     [WITH [CASCADED | LOCAL] CHECK OPTION] ALTERVIEW语句的语法和CREATE VIEW类似 例: 将CS_XS视图修改为只包含计算机专业学生的学号、姓名和总学分。 USEXSCJ; ALTERVIEW CS_XS AS  SELECT 学号,姓名,总学分  FROM XS       WHERE 专业名 = '计算机'; 11.  使用SQL语句删除视图   语法格式: dropVIEW [IF EXISTS] 视图名1 [,视图名2]...     [RESTRICT | CASCADE] 声明了IF EXISTS,若视图不存在的话,也不会出现错误信息。也可以声明restrict和cascade,但它们没什么影响。 使用DROP VIEW一次可删除多个视图。例如: DROP VIEW CS_KC, CS_XS;将删除视图CS_KC和CS_XS。   作者 tianyazaiheruan bitsCN.com

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

89

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

276

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

59

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

99

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

105

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

230

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

619

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

173

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 7.2万人学习

Excel 教程
Excel 教程

共162课时 | 21.4万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号