SQL Server的视图

news2024/11/24 6:47:17

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.coloradmin.cn/o/1930824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在 Linux 系统中安装MySQL 8.x(Ubuntu和CentOS)

文章目录 0. 前言1. 查看 Linux 的发行版本2. 在 Ubuntu 中安装MySQL 8.x2.1 更新包索引2.1.1 更改 Ubuntu 的镜像源2.1.2 更新软件包、升级软件包(耗时可能较长)2.1.3 可能遇到的问题 2.2 安装MySQL2.3 安全配置2.3.1 密码安全级别2.3.2 删除匿名用户2.…

昇思25天学习打卡营第25天|GAN图像生成

学AI还能赢奖品?每天30分钟,25天打通AI任督二脉 (qq.com) GAN图像生成 模型简介 生成式对抗网络(Generative Adversarial Networks,GAN)是一种生成式机器学习模型,是近年来复杂分布上无监督学习最具前景的方法之一。 GAN论文逐…

iOS——MRC与ARC以及自动释放池深入底层学习

MRC与ARC再回顾 在前面,我们简单学了MRC与ARC。MRC指手动内存管理,需要开发者使用retain、release等手动管理对象的引用计数,确保对象在必要时被释放。ARC指自动内存管理,由编译器自动管理对象的引用计数,开发者不需要…

SQL注入问题

一、什么是sql注入 public class TestSql {public static void main(String[] args) {Scanner inScanner new Scanner(System.in);System.out.println("请输入用户名");String username inScanner.nextLine();System.out.println("请输入密码");String …

php基础: 三角形

包含&#xff1a;左三角、左上三角、右三角、右上三角、等腰三角、倒等腰三角。注意空格的数量&#xff0c;因为*号后面加了空格 /*** * 左三角形* param $n* return void*/ function triangleLeft($n){echo <pre>;for ($i 1; $i < $n; $i) {for ($j 1; $j < $i…

MongoDB常用命令大全

文章目录 一、MongoDB简介二、服务启动停止备份三、数据库相关四、集合操作五、文档操作六、其他常用命令 一、MongoDB简介 MongoDB是一款流行的NoSQL数据库&#xff0c;以其灵活的文档模型、高可用性、易于扩展等特性而受到广泛关注。 MongoDB 是由C语言编写的&#xff0c;是…

C# modbus 图表

控件&#xff1a;chart1(图表)&#xff0c;cartesianChart1(第三方添加图表)&#xff0c;timer(时间) 添加第三方&#xff1a; 效果&#xff1a;图标会根据连接的温度&#xff0c;湿度用timer时间进行改变 Chart1控件样式&#xff1a;Series添加线条&#xff0c;颜色&#xf…

劳易测应用案例 汽车零部件装配线光电传感器解决方案

汽车零部件种类繁多&#xff0c;形状、尺寸、功能各异&#xff0c;生产线的规划与布局必须紧密贴合产品的独特工艺、精细装配流程及高效生产需求。随着电动汽车时代的到来&#xff0c;生产标准愈加严格&#xff0c;对生产线的设计和装配周期提出了更高要求。市场要求生产线不仅…

EE trade:强平和爆仓的区别

在金融交易市场中&#xff0c;杠杆交易的引入&#xff0c;让投资者可以用少量的资金撬动更大的头寸&#xff0c;获取更大的收益。然而&#xff0c;杠杆交易也带来了更大的风险&#xff0c;一旦市场波动&#xff0c;投资者可能会面临强平或爆仓的风险。了解强平和爆仓的区别&…

MySQL-对数据库和表的DDL命令

文章目录 一、什么是DDL操作二、数据库编码集和数据库校验集三、使用步骤对数据库的增删查改1.创建数据库2.进入数据库3.显示数据库4.修改数据库mysqldump 5.删除数据库 对表的增删查改1.添加/创建表2.插入表内容3.查看表查看所有表查看表结构查看表内容 4.修改表修改表的名字修…

保障低压设备安全!中国星坤连接器精密工艺解析!

在现代电子设备中&#xff0c;连接器扮演着至关重要的角色&#xff0c;它们是电子系统之间沟通的桥梁。随着技术的发展&#xff0c;对连接器的需求也在不断提升&#xff0c;特别是在低电压应用领域。中国星坤最新推出的低压连接器&#xff0c;以其精密性和安全性&#xff0c;为…

Msql数据库之DDL(数据定义语言)的相关操作

数据定义语言(DDL)&#xff1a;用于创建、修改和删除数据库对象&#xff0c;如数据库、表、视图、索引等 一、数据库的相关操作&#xff1a; 1、创建数据库 语法&#xff1a;create database [if not exists ] 数据库名; 例&#xff1a;create database if not exists test…

2024-07-16 Unity插件 Odin Inspector6 —— Group Attributes

文章目录 1 说明2 Group 特性2.1 BoxGroup2.2 ButtonGroup2.3 FoldoutGroup2.4 ShowIfGroup / HideIfGroup2.5 HorizontalGroup2.6 ResponsiveButtonGroup2.7 TabGroup2.8 ToggleGroup2.9 VerticalGroup 1 说明 ​ 本文介绍 Odin Inspector 插件中有关 Group 特性的使用方法。…

【Apache POI】Java解析Excel文件并处理合并单元格-粘贴即用

同为牛马&#xff0c;点个赞吧&#xff01; 一、Excel文件样例 二、工具类源码 import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFWorkbookFactory; import org.springframework.web.multip…

【B树、B-树、B+、B*树】

目录 一、B-树&#xff08;即B树&#xff09;的定义及操作1.1、定义1.2、操作1.2.1、查找1.2.2、插入1.2.3、删除 二、B树的定义及操作2.1、定义2.2、操作2.2.1、查找2.2.2、插入2.2.3、删除 三、B*树 一、B-树&#xff08;即B树&#xff09;的定义及操作 1.1、定义 B-tree即…

解决vue3中el-input在form表单按下回车刷新页面

问题&#xff1a;在input框中点击回车之后不是调用我写的回车事件&#xff0c;而是刷新页面 原因&#xff1a; 如果表单中只有一个input 框则按下回车会直接关闭表单 所以导致刷新页面 解决方法 &#xff1a; 再写一个input 表单 &#xff0c;并设置style"display:none&…

【对顶堆 优先队列】2102. 序列顺序查询

本文涉及知识点 对顶堆 优先队列 LeetCode 2102. 序列顺序查询 一个观光景点由它的名字 name 和景点评分 score 组成&#xff0c;其中 name 是所有观光景点中 唯一 的字符串&#xff0c;score 是一个整数。景点按照最好到最坏排序。景点评分 越高 &#xff0c;这个景点越好。…

再谈有关JVM中的四种引用

1.强引用 强引用就是我们平时使用最多的那种引用&#xff0c;就比如以下的代码 //创建一个对象 Object obj new Object();//强引用 这个例子就是创建了一个对象并建立了强引用&#xff0c;强引用一般就是默认支持的当内存不足的时候&#xff0c;JVM开始垃圾回收&#xff0c…

【Java--数据结构】二叉树oj题(上)

前言 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 判断是否是相同的树 oj链接 要判断树是否一样&#xff0c;要满足3个条件 根的 结构 和 值 一样左子树的结构和值一样右子树的结构和值一样 所以就可以总结以下思路…

js补环境系列之剖析:原型、原型对象、实例对象三者互相转化(不讲废话、全是干货)

【作者主页】&#xff1a;小鱼神1024 【擅长领域】&#xff1a;JS逆向、小程序逆向、AST还原、验证码突防、Python开发、浏览器插件开发、React前端开发、NestJS后端开发等等 思考下&#xff1a;js补环境中&#xff0c;什么场景会用到原型、原型对象、实例对象&#xff1f; 举…