【SQL Server数据库】视图的使用

news2024/11/26 16:35:52

一、用SQL语句完成下列功能。

1.建立一视图View_CSTeacher,列出计算机系各个老师的资料(姓名、性别、职称)。

create view View_CSTeacher as

select Teac_name, Teac_sex, TechPost

from Teacher

where Depar_id in (select Depar_id from Deparment where Depar_name = '计算机系');

2.建立一视图View_Class,列出每个班级的名称、系别和班级人数。

create view VIEW_Class(Class_name, Depar_id, 班级人数)

as

select c.Class_name, d.Depar_id, count(Stu_id) '班级人数'

from Class c

         join Deparment d on c.Depar_id = D.Depar_id

         join Student s on c.Class_id = s.Class_id

group by c.Class_name, d.Depar_id;

3.建立一视图View_Student,列出每个学生的学号、选修课程门数和平均成绩,并按平均成绩从大到小排列。

(体验在视图中使用order by。注意观察视图中数据是否实现按成绩排序?为什么?)

/*************************没有包含未选课的****************************8*/

create view VIEW_Student as

select top 100 percent Stu_id, count(course_id) '选修课程门数', avg(Grade) '平均成绩'

from StudentGrade

group by Stu_id

order by avg(Grade) desc;


-- △如果order by没有加上TOP 100 percent:

-- 那么报错:除非另外还指定了 TOP、OFFSET 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。


/*************************包含了未选课的******************************/

create view VIEW_Student as

select TOP 100 percent s.Stu_id, count(course_id) '选修课程门数', avg(Grade) '平均成绩'

from Student s

         left join StudentGrade sg on s.Stu_id = sg.Stu_id

group by s.Stu_id

order by avg(Grade) desc;

        视图中的数据没有按成绩排序。

4.查询平均成绩大于85分的学生的所有信息。

(要求使用视图View_Student完成查询)

select s.*,vs.平均成绩

from VIEW_Student vs,

     Student s

where vs.平均成绩 > 85

  and vs.Stu_id = s.Stu_id;

5.修改视图View_Student(修改视图定义),列出每个学生的学号、姓名、选修课程门数和平均成绩。

/*包含未选课学生*/

    alter view View_Student as

    select s.Stu_id, s.Stu_name, count(Course_id) '选修课程门数', avg(Grade) '平均成绩'

    from Student s

             left join StudentGrade SG on s.Stu_id = SG.Stu_id

    group by s.Stu_id, s.Stu_name;

6.要通过视图View_Student,将学号为“000503002”的平均成绩改为90分,是否可以实现?并说明原因

UPDATE View_Student 

SET 平均成绩 = 90 WHERE Stu_id = '000503002';

/* 报错:对视图或函数 'View_Student' 的更新或插入失败,因其包含派生域或常量域。

不可以实现,因为平均成绩是聚合函数查询,而基本表中没有对应的属性,修改的含义不确定,故视图不可更新。*/

7.删除视图View_CSTeacher。

drop view View_CSTeacher;

8.建一视图View_Studentnum,列出每个班级信息以及班级人数。

/*包含没选课的班级*/

create view View_Studentnum as

select c.Class_id, Class_name, Director, Monitor, Depar_id, count(s.Stu_id) '班级人数'

from Class c

         left join Student s on c.Class_id = s.Class_id

group by c.Class_id, Class_name, Director, Monitor, Depar_id;

二、小结

1.试述视图的优点;思考基本表与视图的区别和联系。

1.1 视图的优点

数据安全性:视图可以限制用户对数据的访问权限。通过在视图上设置适当的权限,可以控制用户只能访问他们需要的数据,而不是整个数据库。这提高了数据的安全性,防止未经授权的用户访问敏感数据

简化复杂查询:视图可以通过组合多个表、使用聚合函数等方式,将复杂的查询逻辑封装在一个视图中。这样,用户只需对视图进行简单的查询,而无需了解底层的复杂查询逻辑。视图的存在简化了用户对数据的操作,提高了查询的可读性和易用性。

数据抽象和封装:视图可以隐藏底层数据结构和表之间的关系,为用户提供一个抽象的数据层。通过定义视图,可以将数据的逻辑结构与物理结构分离,使用户更专注于数据的业务逻辑而不需要关注底层的实现细节。这提高了应用程序的模块化和可维护性。

简化数据更新:通过视图,可以简化对数据的更新操作。对于复杂的数据更新操作,可以通过在视图上定义触发器(Trigger)来自动处理。这样,用户只需对视图进行更新,而不需要直接操作底层的表,减少了错误和冗余的代码

提高性能:视图可以预先计算和缓存查询结果,以提高查询的性能。当多个用户频繁访问相同的查询逻辑时,使用视图可以避免重复计算,提高系统的响应速度

1.2 基本表与视图的区别和联系

1区别:

存储方式:基本表是实际存储数据的物理表,而视图是一个虚拟表,不存储实际的数据,只是对基本表的查询结果进行封装和展示。

数据更新:基本表可以直接进行数据的插入、更新和删除操作,而视图一般只能进行查询操作。对于某些特定的视图,可能允许进行部分的数据更新,但这些更新操作实际上是对基本表的操作。

数据结构:基本表具有自己的列和约束,而视图是基于一个或多个基本表的查询结果,其列和约束是由查询语句决定的。

存储空间:基本表需要占用实际的存储空间,而视图不需要额外的存储空间,只是在查询时动态生成结果。

2联系:

数据来源:视图是基于一个或多个基本表的查询结果,因此视图的数据来自于基本表

数据展示:视图可以对基本表的数据进行加工、过滤和组合,以提供更方便的数据展示形式。

数据访问权限:视图可以通过设置权限来限制用户对基本表的访问。通过视图,可以隐藏基本表的某些列或行,只允许用户访问他们需要的数据。

查询优化:视图可以提前计算和缓存查询结果,以提高查询性能。通过使用视图,可以避免重复执行复杂查询,减少系统的负载。

2.是否所有视图都可以更新?为什么?举例说明哪些视图不能更新

不是所有视图都可以更新,原因是视图的可更新性取决于视图的定义以及底层表的结构和约束

以下是一些情况下视图不能更新的示例

包含聚合函数的视图:如果视图中包含了聚合函数(如SUM、COUNT等),则该视图通常是不可更新的,因为聚合函数会导致数据的汇总和计算,无法直接反映到底层表中。

包含GROUP BY子句的视图:如果视图中包含了GROUP BY子句,用于对数据进行分组,那么该视图通常是不可更新的。因为分组操作会导致数据的合并和汇总,无法直接更新到底层表中。

包含DISTINCT关键字的视图:如果视图中使用了DISTINCT关键字,用于去重操作,那么该视图通常是不可更新的。因为去重操作会导致数据的合并和删除,无法直接更新到底层表中。

包含JOIN操作的视图:如果视图中包含了JOIN操作,用于连接多个表的数据,那么该视图通常是不可更新的。因为JOIN操作会导致数据来源的不唯一性,无法直接确定要更新哪个底层表的数据。

使用了子查询的视图:如果视图中包含了子查询,用于从其他表中检索数据,那么该视图通常是不可更新的。因为子查询的结果集无法直接映射到底层表中。

需要注意的是,即使视图本身是可更新的,也需要满足一些额外的条件才能进行更新,例如视图必须基于单个表、视图必须包含主键等。

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

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

相关文章

SpringCloudAlibaba基础四 微服务调用组件OpenFeign

JAVA 项目中如何实现接口调用? 1)Httpclient HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 Http 协议的客户端编程工具包,并且它支持 HTTP 协议最新版本和建议。HttpClient 相比传统 …

无人机飞行操作技巧

要想充分利用无人机,掌握其操作技巧非常关键。以下是一些基础而重要的无人机操作技巧,可以帮助你更安全、更有效地使用无人机。 扫描式拍摄:这种方法涉及慢慢地将无人机从一个点移动到另一个点,同时保持相机对准一个特定的主题。…

Kafka 位移

Consumer位移管理机制 将Consumer的位移数据作为一条条普通的Kafka消息,提交到__consumer_offsets中。可以这么说,__consumer_offsets的主要作用是保存Kafka消费者的位移信息。使用Kafka主题来保存位移。 消息格式 位移主题就是普通的Kafka主题。也是…

windows MSVC编译安装libcurl

$ git clone https://github.com/curl/curl.git $ cd curl/winbuild依照curl/winbuild/README.md的指示, 启动visual studio的命令行工具,这里要注意别选错. 如果要编译出x64版本的libcurl,就用x64的命令行工具;如果要编译出x86…

VSCode插件开发经验小结

从零基础接手DX扩展开发维护,到完成DX扩展从O2平台迁移到 VSCode 平台,现在也积累了一些经验,本文将对这一过程中的学习经历做一个简单小结,也希望可以通过本文帮助想要开发 VSCode 扩展的同学可以更快速的上手。 VSCode (Visual …

福昕阅读器再打开PDF文件时,总是单页显示,如何设置打开后就自动显示单页连续的模式呢

希望默认进入连续模式 设置方法 参考链接 如何设置使福昕阅读器每次启动时不是阅读模式 每次启动后都要退出阅读模式 麻烦_百度知道 (baidu.com)https://zhidao.baidu.com/question/346796551.html#:~:text%E5%9C%A8%E3%80%90%E5%B7%A5%E5%85%B7%E3%80%91%E9%87%8C%E6%9C%89%E…

使用ROS2的RCLCPP客户端库来实现话题通信

1.创建发布者目录文件 cd d2lros2/ mkdir -p chapt3/chapt3_ws/src cd chapt3/chapt3_ws/src 2.创建发布者节点 ros2 pkg create example_topic_rclcpp --build-type ament_cmake --dependencies rclcpp 3.新建发布者类 touch example_topic_rclcpp/src/topic_publisher_01.…

[CAN] Intel 格式与 Motorola 格式的区别

编码格式 数据传输规则一、Intel 格式编码二、Motorola 格式编码三、分析总结🙋 前言 CAN 总线信号的编码格式有两种定义:Intel 格式与 Motorola 格式。究竟两种编码格式有什么样的区别呢?设计者、dbc 文件编辑者或者测试人员又该如何判断两种格式,并进行有效正确的配置和解…

下载旧版本vscode及扩展,离线下载远程linux服务器插件

背景 工作的内网没有网络,无法使用网络来下载插件和vscode软件,且有远程linux服务器需求,linux服务器中lib相关库比较旧且无法更新,所以需要选择一个旧版本的vscode,相应插件也需要选择旧版本的 旧版本vscode下载 没…

SQL 29 计算用户的平均次日留存率题解

问题截图如下: SQL建表代码: drop table if exists user_profile; drop table if exists question_practice_detail; drop table if exists question_detail; CREATE TABLE user_profile ( id int NOT NULL, device_id int NOT NULL, gender varchar…

金融科技如何以细颗粒度服务提升用户体验与满意度

在金融科技迅速发展的当下,各种技术手段被广泛应用于提升用户体验与满意度。这些技术手段不仅提供了更为精准、个性化的服务,还通过优化操作流程、提升服务效率等方式,显著改善了用户的金融生活。以下将详细探讨金融科技如何运用这些技术手段…

短视频哪个软件好用?成都柏煜文化传媒有限公司

短视频哪个软件好用?一文带你了解各大平台特色 随着移动互联网的飞速发展,短视频已经成为现代人生活中不可或缺的一部分。市面上涌现出众多短视频平台,它们各具特色,满足了不同用户的需求。那么,短视频哪个软件好用呢…

Python学习笔记五

1.当循环执行完整后&#xff0c;就会执行else里面的代码 s0 i1 while i<100:sii1 else:print(s) 当循环不完整就会如下 s0 i1 while i<100:sii1if s6:break; else:print(s) 2. 实现密码匹配&#xff0c;可以输入三次&#xff0c;若输入三次错误会退出&#xff0c;或者输…

Linux高并发服务器开发(六)线程

文章目录 1. 前言2 线程相关操作3 线程的创建4 进程数据段共享和回收5 线程分离6 线程退出和取消7 线程属性&#xff08;了解&#xff09;8 资源竞争9 互斥锁9.1 同步与互斥9.2 互斥锁 10 死锁11 读写锁12 条件变量13 生产者消费者模型14 信号量15 哲学家就餐 1. 前言 进程是C…

vue3-openlayers 图标闪烁、icon闪烁、marker闪烁

本篇介绍一下使用vue3-openlayers 图标闪烁、icon闪烁、marker闪烁 1 需求 图标闪烁、icon闪烁、marker闪烁 2 分析 图标闪烁、icon闪烁、marker闪烁使用ol-animation-fade组件 3 实现 <template><ol-map:loadTilesWhileAnimating"true":loadTilesWh…

PyScript:在浏览器中释放Python的强大

PyScript&#xff1a;Python代码&#xff0c;直接在网页上运行。- 精选真开源&#xff0c;释放新价值。 概览 PyScript是一个创新的框架&#xff0c;它打破了传统编程环境的界限&#xff0c;允许开发者直接在浏览器中使用Python语言来创建丰富的网络应用。结合了HTML界面、Pyo…

美国总统对决影响比特币价格

刚刚&#xff0c;2024 年首场总统辩论之后&#xff0c;政治格局发生了翻天覆地的变化&#xff0c;数字货币市场也感受到了这种震动。这场辩论的时间安排史无前例&#xff0c;交锋激烈&#xff0c;在民主党内部引发了一系列猜测和战略。正如我们的 CNN 快报民意调查和摇摆州焦点…

STM32人体心电采集系统

资料下载地址&#xff1a;STM32人体心电采集系统 1、项目功能介绍 此项目主要实现了以STM32为核心的人体心电采集系统软硬件的设计。软件设计过程是在STM32上移植的uCGUI做图形界面&#xff0c;并如实显示采集到的心电波形信号&#xff0c;有SD卡存储和USB数据传输功能。 2、实…

1.SQL注入-数字型

SQL注入-数字型(post) 查询1的时候发现url后面的链接没有传入1的参数。验证为post请求方式&#xff0c;仅显示用户和邮箱 通过图中的显示的字段&#xff0c;我们可以猜测传入数据库里面的语句&#xff0c;例如&#xff1a; select 字段1,字段2 from 表名 where id1; 编辑一个…

RabbitMQ 的经典问题

文章目录 前言一、防止消息丢失1.1 ConfirmCallback/ReturnCallback1.2 持久化1.3 消费者确认消息 二、防止重复消费三、处理消息堆积四、有序消费消息五、实现延时队列六、小结推荐阅读 前言 当设计和运维消息队列系统时&#xff0c;如 RabbitMQ&#xff0c;有几个关键问题需…