SQL Server的视图

SQL Server的视图

一、基础

SQL 视图(Views)是一种虚拟表,是基于 SQL 查询结果生成的。这些虚拟表可以包含来自一个或多个表的数据,并且可以像表一样查询;视图是一个表中的数据经过某种筛选后的显示方式,或者多个表中的数据经过连接筛选后的显示方式。使用视图可以简化复杂查询,提高查询的可读性和可维护性,并提供数据的不同视图。

视图由一个预定义的查询(SELECT语句)组成,可以像基本表一样用于SELECT语句中;如果视图满足一定条件,还可以用在INSERT、UPDATE和DELETE语句中,对视图所调用的基本表进行插入、更新和删除数据操作。

1.1、视图引例

  • 示例:查询“心理学”考试成绩大于等于90的学生的“学号”、“姓名”和“所属院系”三个字段。

分析:“心理学”是stu_course表中“课名”字段的值,考试成绩是score表中“考试成绩”字段的值,而“学号”、“姓名”和“所属院系”是stu_info表中的字段。因此,想要得到本例要求的结果,则必须对stu_course、score和stu_info三个表进行连接查询。

SELECT stu_info.id AS 学号,stu_info.name AS 姓名,stu_info.institute AS 所属院系

FROM stu_info, stu_course, score

WHERE stu_course.course = '心理学'

   AND score.result1 >= 90

   AND stu_info.id = score.s_id

       AND stu_course.ID = score.c_id;

编写该SELECT语句时,首先需要了解基本表的结构,然后还要知道表之间连接的方法,最后还要编写复杂的SELECT语句。如果用户经常使用上面的查询,并且每次都要编写这一复杂的SELECT语句,如果将上面的SELECT语句保存到数据库里,每次使用时直接读取岂不是很方便,视图就是为了这种目的而诞生的。

视图里存放了SELECT语句,而并非是查询结果,每次在SQL语句中使用视图,其实就是在执行视图内存放的SELECT语句,因此通过视图总能够得到最新的数据。

  • 示例2:定义一个视图vw1,将上例的SELECT语句存放到该视图内。

CREATE VIEW vw1 AS

SELECT stu_info.id AS 学号,stu_info.name AS 姓名,stu_info.institute AS 所属院系

FROM stu_info, stu_course, score

WHERE stu_course.course = '心理学'

    AND score.result1 >= 90

    AND stu_info.id = score.s_id

    AND stu_course.ID = score.c_id;

视图被定义后可以像基本表一样使用。

因为视图本身不包含数据,其数据属于实际的基本表,所以如果改变了基本表中的数据,则视图返回的数据也会随之改变。目前所有主流数据库系统都支持视图。

注意:视图不是SELECT语句执行后的查询结果,即视图中不存在数据,它只是存放了SELECT语句;调用视图要考虑效率的损耗。例如,执行SELECT * FROM vw1时,实际上执行了两个SELECT语句,一个是该语句本身,另外一个是视图中存放的复杂连接的SELECT语句。

  1. 改变基本表的结构后应当删除视图并重建视图。视图是基于基本表创建的。如果基本表的结构发生变化(如添加、删除或修改列),可能会导致视图无法正常工作。由于视图的定义是静态的,它不会自动适应基础表的变化,因此需要手动删除并重新创建视图以确保视图定义与基本表结构一致。
  2. 删除基本表时应当删除视图。视图本身没有数据,其数据源自基础表。如果基础表被删除,视图将无法正常工作并导致错误。因此,在删除基础表之前,应先删除依赖于这些表的视图。
  3. 潜在的复杂性带来的性能下降问题。如果视图的定义包含复杂的查询(如多个表的连接、嵌套查询等),数据库在访问视图时必须执行这些复杂的查询,这可能会导致性能下降。为了减轻性能问题,可以优化视图的定义,或者考虑使用索引视图(在支持的情况下)来提高性能。
  • SQL Server不允许在视图定义中直接使用 ORDER BY 子句。这是因为视图本质上是一个虚拟表,其数据的排序应由查询视图时的 ORDER BY 子句来决定,而不是在定义视图时决定。
  • 视图本身是不可索引的。但是,在SQL Server中,可以创建索引视图(Indexed Views),也称为物化视图,这是对某些复杂查询进行优化的一种方法。索引视图在创建时需要满足一些特定的条件,比如视图必须使用 WITH SCHEMABINDING 选项,并且视图中的表必须包含唯一的聚集索引。
  • 视图不能直接拥有触发器或默认值。触发器和默认值只能应用于基础表。可以在基础表上定义触发器或默认值来实现相关功能,而不是在视图上。

二、视图的创建

2.1、利用视图提高数据安全性

利用视图可以提高数据安全性。视图可以使不同权限的用户只能操作相应权限范围内的数据,而对于权限外的数据则不可访问;例如,计科系的数据管理员只能操作计科系的学生信息,中文系的数据管理员只能操作中文系学生信息;对于计科系的数据管理员而言,其他系的学生信息是不可访问的、隐藏的,这就提高了数据安全性,大大减少了对数据误操作的概率。

  1. 隐藏列数据

有时需要将表中的某些列隐藏起来,只显示指定的列,这时可以使用视图达到这种目的。

  • 示例:创建一个只能查看“学号”、“姓名”和“性别”三个列的视图vw_stu1

CREATE VIEW vw_stu1

AS

SELECT id AS 学号,name AS 姓名,sex AS 性别

FROM stu_info;

  1. 隐藏行数据
  • 示例2:创建一个只能查看计科系学生信息的视图vw_stu2

CREATE VIEW vw_stu2

AS

SELECT *

FROM stu_info

WHERE institute = '计科系';

将视图vw_stu2上的权限授予计科系的数据管理员,则该管理员只能操作计科系学生的信息,而对stu_info表中其他院系的学生信息都是不可访问的。

2.2、利用视图得到汇总数据

可以使用视图对表中的数据进行及时汇总,当基本表中的底层数据被改变时,通过视图得到的是最新的数据。

  • 示例:创建一个视图vw_stu3,显示每个不同院系的学生人数。

CREATE VIEW vw_stu3

AS

SELECT institute AS 所属院系,COUNT(*) AS 人数

FROM stu_info

GROUP BY institute;

说明:

TIMESTAMPDIFF()函数是MySQL的函数,其返回值是两个日期型数据之间的差值。CURDATE()函数也是MySQL的函数,其返回值为当前系统时间。

DATEDIFF()函数是SQL Server的函数,其返回值是两个日期型数据之间的差值。GETDATE()函数也是SQL Server的函数,其返回值为当前系统时间。

WHERE子句的条件表达式中不可以使用别名,因为SELECT子句的执行顺序在WHERE子句之后,而ORDER BY子句中能够使用别名的原因是ORDER BY子句在所有子句中最后一个执行。

三、视图的修改/删除

当提供视图的底层数据的基本表(基础表)的结构发生变化时,可能需要修改/删除视图,以确保视图仍然正确地反映表的数据结构和内容。 以下是一些常见的基本表结构变化的情况:

  1. 添加新列
    • 如果基本表中添加了新的列,现有视图可能不会自动包含这些新列。 如果视图需要这些新列的数据,必须重新创建/修改视图。
  2. 删除列
    • 如果从基本表中删除了视图引用的某些列,视图将变得无效或无法正常工作,因为它引用的列不再存在。
  3. 修改列的数据类型
    • 如果基本表中某列的数据类型发生了变化,可能会导致视图中的数据类型不匹配,需要重新创建/修改视图以匹配新的数据类型。
  4. 重名名列
    • 如果基本表中某列被重命名,视图引用的旧列名将失效,视图需要更新以引用新的列名。
  5. 修改列的约束
    • 修改列的约束(例如添加或删除主键、外键、唯一约束等)可能会影响视图的逻辑,需要重新创建/修改视图以适应新的约束条件。
  6. 删除或重命名基本表
    • 如果删除了基本表或者重命名了基本表,所有基于该表的视图都将失效,必须更新视图定义以匹配新的表名或者删除并重新创建视图。

3.1、修改视图

修改视图可以适应基础表的变化、满足新的业务需求、优化查询性能以及增强安全性和权限管理。 在修改视图时,确保视图定义与基础表的结构和业务逻辑保持一致,以避免数据不一致或查询错误。

  • 示例:修改 employee_view 视图以包含 salary 排

ALTER VIEW employee_view AS

SELECT id, name, age, department, salary

FROM employees;

3.2、删除视图

删除视图是一个相对简单的操作,但在执行之前要确保该视图不再需要并且没有其他对象依赖于它。

可以使用 DROP VIEW 语句来删除视图:

DROP VIEW view_name;

DROP VIEW view_name1, view_name2;    --如果您需要删除多个视图,可以将视图名称用逗号分隔

注意事项

  1. 依赖关系:在删除视图之前,确保没有其他对象(如其他视图、存储过程、触发器等)依赖于该视图。
  2. 权限:确保您具有删除视图的权限。
  3. 备份:如果不确定是否应该删除视图,可以先备份视图的定义,以防需要恢复。

3.3、视图定义

视图的定义是指创建视图时所使用的 SQL 查询语句。它描述了视图的逻辑结构和内容,即视图从基础表中选择的数据,以及选择和过滤这些数据的条件。视图的定义决定了视图返回的数据集。

  • MySQL

在 MySQL 中,可以使用 SHOW CREATE VIEW 命令来获取视图的定义。

SHOW CREATE VIEW employee_view;

这个命令将返回视图的创建语句:

  • SQL Server

在 SQL Server 中,可以使用系统存储过程 sp_helptext 来获取视图的定义。

sp_helptext 'employee_view';

这个命令将返回视图的创建语句

3.4、备份视图定义到文件

  • MySQL

可以使用 MySQL 客户端命令行工具将输出重定向到文件:

mysql -u username -p -D database_name -e "SHOW CREATE VIEW employee_view" > employee_view_backup.sql

cat employee_view_backup.sql

  • username:您的 MySQL 用户名
  • database_name:包含视图的数据库名称
  • SQL Server

可以使用 SQL Server Management Studio (SSMS) 或 SQLCMD 将输出保存到文件:

sqlcmd -S servername -U username -P password -Q "sp_helptext 'employee_view'" > employee_view_backup.sql

  • -S为实例名称:默认可以写localhost
  • -U为用户名
  • -P为密码
  • 视图名称为示例 employee_view

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/801064.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Cornerstone3D导致浏览器崩溃的踩坑记录

WebGL: CONTEXT_LOST_WEBGL: loseContext: context lost ⛳️ 问题描述 在使用vue3vite重构Cornerstone相关项目后,在Mac本地运行良好,但是部署测试环境后,在window系统的Chrome浏览器中切换页面会导致页面崩溃。查看Chrome的任务管理器&am…

对话天润融通首席科学家:大模型的首要任务是为客户创造商业价值

2023年,AI大模型开启了企业数智化转型的新篇章。 不过前沿技术固然重要,但在增长见顶的存量背景下,先进技术带来的实用价值也尤为关键。 正如天润融通首席科学家田凤占所说:“现阶段最重要的是让大模型尽快和企业的业务相结合&a…

【Linux】进程间通信——消息队列和信号量

目录 消息队列(message queue) 信号量(Semaphore) system V版本的进程间通信方式有三种:共享内存,消息队列和信号量。之前我们已经说了共享内存,那么我们来看一下消息队列和信号量以及它们之间…

【嵌入式Linux】<总览> 网络编程(更新中)

文章目录 前言 一、网络知识概述 1. 网路结构分层 2. socket 3. IP地址 4. 端口号 5. 字节序 二、网络编程常用API 1. socket函数 2. bind函数 3. listen函数 4. accept函数 5. connect函数 6. read和recv函数 7. write和send函数 三、TCP编程 1. TCP介绍 2.…

新版本WPS不登录无法编辑的解决办法

原因分析:新版本的WPS因加入多种在线功能,建议登录账号获得更加体验 解决办法:首选第一种修改注册表后重启WPS,第二种仅作为临时满足工作需求,过一段时间会自动失效 方法一:键盘同时按下WINR键,…

【Python】基础语法(函数、列表和元组、字典、文件)

。一、函数 1、函数是什么 编程中的函数和数学中的函数有一定的相似之处。 数学上的函数,比如 y sin x,x 取不同的值,y 就会得到不同的结果。 编程中的函数是一段可以被重复使用的代码片段。 (1)求数列的和&…

MySQL索引特性(上)

目录 索引的重要 案例 认识磁盘 MySQL与存储 先来研究一下磁盘 扇区 定位扇区 结论 磁盘随机访问与连续访问 MySQL与磁盘交互基本单位 建立共识 索引的理解 建立测试表 插入多条记录 局部性原理 所有的MySQL的操作(增删查改)全部都是在MySQL当中的内存中进行的&am…

网友提问:HTML CSS JS很低级吗?

这话听起来就像有人在说披萨只是面团加奶酪,完全忽略了上面的美味配料和烘烤的艺术啊!HTML、CSS、JS这三位可是前端开发的铁三角,它们一点都不“低级”,反而相当关键。 HTML就像是房子的骨架,没有它,网页就…

【iOS】——MRC

一、引用计数 内存管理的核心是引用计数器,用一个整数来表示对象被引用的次数,系统需要根据引用计数器来判断对象是否需要被回收。 在每次 RunLoop 迭代结束后,都会检查对象的引用计数器,如果引用计数器等于 0,则说明…

单链表算法 - 链表分割

链表分割_牛客题霸_牛客网现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的。题目来自【牛客题霸】https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70思路: 代码: /* struct ListNode {int val;struct List…

烧掉一个亿就为造好一把椅子,西昊如何策划人体工学椅极致产品力

2011年到2015年这4年期间,功能单一,价值雷同的椅子市场趋于饱和,竞争的白热化和同质化带来了全行业的价格战,彼时西昊的经营陷入巨大的困境,所有的产品和钱都变成成库存,现金流几乎枯竭。因此,西…

文心一言《使用手册》,文心一言怎么用?

一、认识文心一言 (一)什么是文心一言 文心一言是百度研发的 人工智能大语言模型产品,能够通过上一句话,预测生成下一段话。 任何人都可以通过输入【指令】和文心一言进行对话互动、提出问题或要求,让文心一言高效地…

智能家居产品公司网站源码,自适应布局设计,带完整演示数据

适合各类智能家居电子产品使用的网站源码,深色大气设计,自适应布局设计,pc手机均可完美适配,带完整演示数据。 独家原创资源。源码是asp开发的,数据库是access,主流的虚拟主机空间都支持asp,直…

<Rust><GUI>rust语言GUI库tauri体验:前、后端结合创建一个窗口并修改其样式

前言 本文是rust语言下的GUI库:tauri来创建一个窗口的简单演示,主要说明一下,使用tauri这个库如何创建GUI以及如何添加部件、如何编写逻辑、如何修改风格等,所以,这也是一个专栏,将包括tauri库的多个方面。…

面对人工智能发展的伦理挑战:应对策略与未来方向

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

硬件开发笔记(二十六):AD21导入电感原理图库、封装库和3D模型

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140437290 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

SAP ERP与金蝶云星空的集成案例(新能源光伏行业)

一、项目环境 阳光新能源开发股份有限公司(简称“阳光电源”)是一家专注于新能源开发利用的国家高新技术企业。作为阳光电源(股票代码:300274)旗下的新能源开发投资平台,阳光新能源聚焦光伏、风电、风光…

暴雨让服务器不怕热҈热҈热҈热҈

在AI算力呈几何倍数增长的趋势下,算力逐渐朝着“高性能、高密度、高耗能“发展。在高耗能的算力下,AI服务器功率已逐步逼近风冷散热极限,而液冷作为更加高效、低能耗的制冷技术,逐渐成为了高密度算力散热场景的首选方案。 液冷的…

数据结构-java中链表的存储原理及使用方式

目录 链表(线性表的链式存储) 代码实例:(链表构建,头插尾插) LinkedList LinkedList的使用: 1、构造方法 2、操作方法 LinkedList 和 ArrayList 的区别 链表(线性表的链式存储…

Minio搭建文件服务器的学习

MinIO是一个高性能的开源对象存储服务器,与Amazon S3兼容。它使用Go语言编写,可以在多种操作系统上运行,如Linux、MacOS和Windows等。MinIO的分布式特性使其能够轻松扩展存储容量和处理能力,满足大规模数据存储的需求。 使用Docke…