数据库系统概论(超详解!!!)第三节 关系数据库标准语言SQL(Ⅵ)

1.空值的处理

空值就是“不知道”或“不存在”或“无意义”的值。

一般有以下几种情况: 该属性应该有一个值,但目前不知道它的具体值 ;该属性不应该有值 ;由于某种原因不便于填写。

1.空值的产生

空值是一个很特殊的值,含有不确定性。对关系运算带来特殊的问题,需要做特殊的处理

向SC表中插入一个元组,学生号是”201215126”,课程号是”1”,成绩为空。INSERT INTO SC(Sno,Cno,Grade)VALUES('201215126 ','1',NULL);   /*该学生还没有考试成绩,取空值*/
或INSERT INTO SC(Sno,Cno)VALUES(' 201215126 ','1');             /*没有赋值的属性,其值为空值*/将Student表中学生号为”201215200”的学生所属的系改为空值。UPDATE StudentSET Sdept = NULLWHERE Sno='201215200';

2.空值的判断

判断一个属性的值是否为空值,用IS NULL或IS NOT NULL来表示。

从Student表中找出漏填了数据的学生信息SELECT  *FROM StudentWHERE Sname IS NULL OR Ssex IS NULL OR Sage IS NULL OR Sdept IS NULL;

3.空值的约束条件

属性定义(或者域定义)中: 有NOT NULL约束条件的不能取空值 ;加了UNIQUE限制的属性不能取空值; 码属性不能取空值

4. 空值的算术运算、比较运算和逻辑运算

空值与另一个值(包括另一个空值)的算术运算的结果为空值

空值与另一个值(包括另一个空值)的比较运算的结果为UNKNOWN。

有UNKNOWN后,传统二值(TRUE,FALSE)逻辑就扩展成了三值逻辑。

找出选修1号课程的不及格的学生。SELECT SnoFROM SCWHERE Grade < 60 AND Cno='1';查询结果不包括缺考的学生,因为他们的Grade值为null。选出选修1号课程的不及格的学生以及缺考的学生。
SELECT Sno
FROM SC
WHERE Grade < 60 AND Cno='1'
UNION
SELECT Sno
FROM SC
WHERE Grade IS NULL AND Cno='1'
或者
SELECT Sno
FROM SC
WHERE Cno='1' AND (Grade<60 OR Grade IS NULL);

2.视图

视图的特点 :

虚表,是从一个或几个基本表(或视图)导出的表

只存放视图的定义,不存放视图对应的数据

基表中的数据发生变化,从视图中查询出的数据也随之改变

1.定义视图

1.建立视图

语句格式:     

CREATE  VIEW    <视图名>  [(<列名>  [,<列名>]…)]        

AS  <子查询>   

[WITH  CHECK  OPTION];

WITH CHECK OPTION :对视图进行UPDATE,INSERT和DELETE操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)

子查询可以是任意的SELECT语句,是否可以含有ORDER BY子句和DISTINCT短语,则决定具体系统的实现。

组成视图的属性列名:全部省略或全部指定

全部省略: 由子查询中SELECT目标列中的诸字段组成

明确指定视图的所有列名: 某个目标列是聚集函数或列表达式 ;多表连接时选出了几个同名列作为视图的字段 ;需要在视图中为某个列启用新的更合适的名字

关系数据库管理系统执行CREATE VIEW语句时只是把视图定义存入数据字典,并不执行其中的SELECT语句。

在对视图查询时,按视图的定义从基本表中将数据查出。

建立信息系学生的视图。CREATE VIEW IS_StudentAS SELECT Sno,Sname,SageFROM     StudentWHERE  Sdept= 'IS';建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生 。CREATE VIEW IS_StudentAS SELECT Sno,Sname,SageFROM  StudentWHERE  Sdept= 'IS'WITH CHECK OPTION;

定义IS_Student视图时加上了WITH CHECK OPTION子句,对该视图进行插入、修改和删除操作时,RDBMS会自动加上Sdept='IS'的条件。

若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和某些列,但保留了主码,我们称这类视图为行列子集视图。 IS_Student视图就是一个行列子集视图。

基于多个基表的视图:建立信息系选修了1号课程的学生的视图(包括学号、姓名、成绩)。CREATE VIEW IS_S1(Sno,Sname,Grade)AS SELECT Student.Sno,Sname,GradeFROM  Student,SCWHERE  Sdept= 'IS' ANDStudent.Sno=SC.Sno ANDSC.Cno= '1';基于视图的视图:
建立信息系选修了1号课程且成绩在90分以上的学生的视图。CREATE VIEW IS_S2ASSELECT Sno,Sname,GradeFROM  IS_S1WHERE  Grade>=90;带表达式的视图:
定义一个反映学生出生年份的视图。CREATE  VIEW BT_S(Sno,Sname,Sbirth)AS SELECT Sno,Sname,2014-SageFROM  Student;分组视图:
将学生的学号及平均成绩定义为一个视图CREAT  VIEW S_G(Sno,Gavg)AS  SELECT Sno,AVG(Grade)FROM  SCGROUP BY Sno;将Student表中所有女生记录定义为一个视图CREATE VIEW F_Student(F_Sno,name,sex,age,dept)ASSELECT  *                        /*没有指定属性列*/FROM  StudentWHERE Ssex=‘女’;缺点:修改基表Student的结构后,Student表与F_Student视图的映象关系被破坏,导致该视图不能正确工作。

2.删除视图

语句的格式:         

DROP  VIEW  <视图名>[CASCADE];

该语句从数据字典中删除指定的视图定义

如果该视图上还导出了其他视图,使用CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除

删除基表时,由该基表导出的所有视图定义都必须显式地使用DROP VIEW语句删除

删除视图BT_S和IS_S1DROP VIEW BT_S;	/*成功执行*/DROP VIEW IS_S1;	/*拒绝执行*/

2.查询视图

用户角度:查询视图与查询基本表相同

关系数据库管理系统实现视图查询的方法 :

视图消解法(View Resolution) :进行有效性检查 ;转换成等价的对基本表的查询 ;执行修正后的查询。

在信息系学生的视图中找出年龄小于20岁的学生。SELECT   Sno,SageFROM      IS_StudentWHERE   Sage<20;视图消解转换后的查询语句为:SELECT  Sno,Sage       FROM  StudentWHERE  Sdept= 'IS'  AND  Sage<20;查询选修了1号课程的信息系学生
SELECT  IS_Student.Sno,Sname
FROM     IS_Student,SC
WHERE  IS_Student.Sno =SC.Sno AND SC.Cno= '1';

视图消解法的局限:

有些情况下,视图消解法不能生成正确的查询。

在S_G视图中查询平均成绩在90分以上的学生学号和平均成绩
SELECT *
FROM   S_G
WHERE  Gavg>=90;S_G视图的子查询定义: 
CREATE VIEW S_G (Sno,Gavg)
AS 
SELECT  Sno,AVG(Grade)
FROM  SC
GROUP BY Sno;错误:
SELECT Sno,AVG(Grade)
FROM     SC
WHERE  AVG(Grade)>=90
GROUP BY Sno;正确:
SELECT  Sno,AVG(Grade)
FROM  SC
GROUP BY Sno
HAVING AVG(Grade)>=90;也可以用如下SQL语句完成SELECT *FROM  (SELECT Sno,AVG(Grade)FROM  SC GROUP BY Sno) AS S_G(Sno,Gavg)WHERE Gavg>=90;

3.更新视图

将信息系学生视图IS_Student中学号”201215122”的学生姓名改为”刘辰”。
UPDATE  IS_Student
SET  Sname= '刘辰'
WHERE  Sno= ' 201215122 ';
转换后的语句:
UPDATE  Student
SET Sname= '刘辰'
WHERE Sno= ' 201215122 ' AND Sdept= 'IS';向信息系学生视图IS_S中插入一个新的学生记录,其中学号为”201215129”,姓名为”赵新”,年龄为20岁
INSERT
INTO IS_Student
VALUES(‘201215129’,’赵新’,20);
转换为对基本表的更新:
INSERT
INTO   Student(Sno,Sname,Sage,Sdept)
VALUES(‘200215129 ','赵新',20,'IS' );删除信息系学生视图IS_Student中学号为”201215129”的记录 
DELETE
FROM IS_Student
WHERE Sno= ' 201215129 ';
转换为对基本表的更新:
DELETE
FROM Student
WHERE Sno= ' 201215129 ' AND Sdept= 'IS';

更新视图的限制:一些视图是不可更新的,因为对这些视图的更新不能唯一地有意义地转换成对相应基本表的更新

视图S_G为不可更新视图。
UPDATE  S_G
SET          Gavg=90
WHERE  Sno= '201215121';这个对视图的更新无法转换成对基本表SC的更新

允许对行列子集视图进行更新 对其他类型视图的更新不同系统有不同限制

将SC中成绩在平均成绩之上的元组定义成一个视图CREATE VIEW GOOD_SCAS SELECT  Sno,Cno,GradeFROM     SCWHERE Grade >(SELECT AVG(Grade)FROM     SC);一个不允许更新的视图上定义的视图也不允许更新

4.视图的作用

视图能够简化用户的操作:当视图中数据不是直接来自基本表时,定义视图能够简化用户的操作 基于多张表连接形成的视图 ;基于复杂嵌套查询的视图 ;含导出属性的视图

视图使用户能以多种角度看待同一数据:视图机制能使不同用户以不同方式看待同一数据,适应数据库共享的需要

视图对重构数据库提供了一定程度的逻辑独立性
学生关系Student(Sno,Sname,Ssex,Sage,Sdept) “垂直”地分成两个基本表:SX(Sno,Sname,Sage)        SY(Sno,Ssex,Sdept)通过建立一个视图Student:
CREATE VIEW  Student(Sno,Sname,Ssex,Sage,Sdept)
AS  SELECT  SX.Sno,SX.Sname,SY.Ssex,SX.Sage,SY.SdeptFROM  SX,SYWHERE  SX.Sno=SY.Sno;使用户的外模式保持不变,用户的应用程序通过视图仍然能够查找数据

视图对重构数据库提供了一定程度的逻辑独立性:由于对视图的更新是有条件的,因此应用程序中修改数据的语句可能仍会因基本表结构的改变而改变。

视图能够对机密数据提供安全保护:对不同用户定义不同视图,使每个用户只能看到他有权看到的数据

适当的利用视图可以更清晰的表达查询:经常需要执行这样的查询“对每个同学找出他获得最高成绩的课程号”。可以先定义一个视图,求出每个同学获得的最高成绩

CREATE VIEW VMGRADEASSELECT Sno, MAX(Grade)  MgradeFROM  SCGROUP BY Sno;
然后用如下的查询语句完成查询:SELECT SC.Sno,CnoFROM SC,VMGRADE WHERE SC.Sno=VMGRADE.Sno AND       SC.Grade=VMGRADE .Mgrade; 

3.练习

/*1.建立一个计算机科学与技术专业的学生视图V1*/
create view v1
as
select *
from Student
where Smajor='计算机科学与技术';/*2.建立一个'数据库系统概论'课程的选修情况视图(包括学号,姓名,成绩和所在专业)V2*/
create view v2
as
select student.Sno,Sname,Grade,Smajor,Cname
from Student,SC,Course
where Student.Sno=SC.Sno and SC.Cno=Course.Cno and Cname='数据库系统概论';/*3.建立计算机科学与技术专业选修了’数据库系统概论'的学生的视图(包括学号、姓名、成绩)V3*/
create view v3
as
select student.Sno,Sname,Grade
from Student,SC,Course
where Student.Sno=SC.Sno and SC.Cno=Course.Cno and Cname='数据库系统概论' and Smajor='计算机科学与技术';/*4.建立信息安全专业选修了’数据结构'且成绩不及格的学生视图(包括学号、姓名、成绩)V4*/
create view v4
as
select student.Sno,Sname,Grade
from Student,SC,Course
where Student.Sno=SC.Sno and SC.Cno=Course.Cno and Cname='数据结构'and Smajor='信息安全' and Grade<60;/*5.将每门课程的课程号,课程名、最高分、最低分和平均分定义为一个视图V5*/
create view v5
as
select Course.Cno,Cname,MAX(Grade)as max,MIN(Grade)as min,AVG(Grade)as avg
from Student,SC,Course
where Student.Sno=SC.Sno and SC.Cno=Course.Cno
group by Course.Cno,Cname;/*6.查询计算机科学与技术专业小于21岁的女生学号和姓名(基于以上视图实现)*/
select sno,sname
from v1
where YEAR(GETDATE())-YEAR(Sbirthdate)<21 and Ssex='女';/*7.查询既选了'数据库系统概论'又选了'数据结构'的学生学号和姓名(基于以上视图实现)*/
select v2.sno,sname
from v2,sc
where v2.Sno=SC.Sno and Cno in (select Cnofrom Coursewhere Cname='数据结构');/*8.查询平均分最高的课程号、课程名和平均分(基于以上视图实现)*/
select top (1) Cno,Cname, avg
from v5
order by avg desc;/*9.将计算机科学与技术专业的所有学生选修的81001号课程成绩加2分基于以上视图实现)*/
update  SC
set Grade
where Cno='81001' and Sno in (select snofrom v1);/*10.删除计算机科学与技术专业的学生视图V1*/
drop view v1;

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

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

相关文章

云仓酒庄旗下雷盛红酒入驻香港星怡SingLa餐厅共绘美食美酒新篇章

近日&#xff0c;云仓酒庄旗下品牌雷盛红酒正式入驻香港餐厅星怡SingLa&#xff0c;这一跨界合作不仅为香港市民和游客带来了全新的味蕾享受&#xff0c;也标志着美食与美酒文化的很好结合&#xff0c;共同绘就了一幅精彩绝伦的美食美酒新篇章。 云仓酒庄一直以来都致力于为消费…

Rust 程序设计语言学习——枚举模式匹配

枚举&#xff08;enumerations&#xff09;&#xff0c;也被称作 enums。match 允许我们将一个值与一系列的模式相比较&#xff0c;并根据相匹配的模式执行相应代码。 1 枚举的定义 假设我们要跨省出行&#xff0c;有多种交通工具供选择。常用的交通工具有飞机、火车、汽车和轮…

备战蓝桥杯Day37 - 真题 - 特殊日期

一、题目描述 思路&#xff1a; 1、统计2000年到2000000年的日期&#xff0c;肯定是需要遍历 2、闰年的2月是29天&#xff0c;非闰年的2月是28天。我们需要判断这一年是否是闰年。 1、3、5、7、8、10、12月是31天&#xff0c;4、6、9、11月是30天。 3、年份yy是月份mm的倍数…

【Entity Framework】EF配置文件设置详解

【Entity Framework】EF配置文件设置详解 文章目录 【Entity Framework】EF配置文件设置详解一、概述二、实体框架配置部分三、连接字符串四、EF数据库提供程序五、EF侦听器六、将数据库操作记录到文件中七、Code First默认连接工厂八、数据库初始值设定项 一、概述 EF实体框架…

OKR应用层级与试点部门选择:管理层与员工层的应用探讨

OKR&#xff08;Objectives and Key Results&#xff09;作为一种高效的目标管理工具&#xff0c;其应用层级的选择对于企业的实施效果至关重要。在管理层和员工层之间&#xff0c;并没有绝对的先后顺序&#xff0c;而是需要根据企业的具体情况和需求进行灵活应用。同时&#x…

python买铅笔 2024年3月青少年电子学会等级考试 中小学生python编程等级考试一级真题答案解析

目录 python买铅笔 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python买铅笔 2024年3月 python编程等级考试级编程题 一、题目要求 1、编…

【电路笔记】-逻辑非门

逻辑非门 文章目录 逻辑非门1、概述2、晶体管逻辑非门3、六角施密特反相器逻辑非门是所有逻辑门中最基本的,通常称为反相缓冲器或简称为反相器。 1、概述 反相非门是单输入器件,其输出电平通常为逻辑电平“1”,当其单个输入为逻辑电平“1”时,输出电平变为“低”至逻辑电平…

通用爬虫的概念简述

一、&#x1f308;什么是通用爬虫 通用爬虫&#xff08;General Purpose Web Crawler或Scalable Web Crawler&#xff09;是一种网络爬虫&#xff0c;其设计目标是对整个互联网或尽可能广泛的网络空间进行数据抓取。通用爬虫主要用于搜索引擎构建其庞大的网页索引数据库&#…

使用LIMIT进行分页

SELECT employee_id, first_name, salary FROM employees LIMIT 0, 5; 0为偏移量&#xff0c; 5为条目数 每页pageSize条记录&#xff0c;显示第page页 LIMIT (page - 1) * pageSize, pageSize; # 或者 LIMIT pageSize OFFSET (page - 1) * pageSize;

备战蓝桥杯---递归与DFS刷题2

1. 数据范围允许直接暴力把所有组合都写一遍&#xff0c;我们用Pair来存&#xff0c;在sort中分式比较只要把自己的分子与对方的分母乘比较即可&#xff0c;下面介绍一下st树的写法&#xff0c;具体原理就不说了&#xff0c;它是先[0/1,1/1]然后取分子分母的平均化成两个区间&a…

web学习笔记(五十三)身份认证

目录 1.Web 开发模式 1.1 服务端渲染的 Web 开发模式 1.2 服务端渲染的优缺点 1.3 前后端分离的 Web 开发模式 1.4 如何选择 Web 开发模式 2. 身份认证 2.1 Session 认证机制 3. 在 Express 中使用 Session 认证 3.1 安装express-session 中间件 3.2 配置 express-ses…

electron 打不同环境的包

我用的打包工具: electron-builder 1、在package.json 文件的同级下创建2个js文件 electron-builder-test.config.js electron-builder.config.js electron-builder-test.config.js const basejson require(./electron-builder.config.js); module.exports {extraMetada…

智能变电站协议系列-5、IEC 104协议细化解读(IEC 60870以及如何获取对应国标和行标)

一、前言 通过之前整体性的协议分析&#xff0c;目前确定先基于IEC104做深入分析&#xff0c;来结合分析电网常见的业务&#xff0c;以此从协议侧关联深入到业务侧。在国内该标准也应用比较稳定和广泛了&#xff0c;所以研究104协议相关资料也会更全一些。 二、资料及标准收集…

【强化学习的数学原理-赵世钰】课程笔记(二)贝尔曼公式

【强化学习的数学原理-赵世钰】课程笔记&#xff08;二&#xff09;贝尔曼公式 一. 内容概述 1. 第二章主要有两个内容 &#xff08;1&#xff09;一个核心概念&#xff1a;状态值&#xff08;state value&#xff09;&#xff1a;从一个状态出发&#xff0c;沿着一个策略我…

OWASP TOP10 漏洞详解

前言 该内容是 OWASP TOP 10 的学习笔记&#xff0c;笔记内容来源 B 站龙哥的视频【12.Top漏洞10&#xff1a;服务器请求伪造_哔哩哔哩_bilibili】 一、访问控制崩溃 概念 未对通过身份验证的用户实施恰当的访问控制。攻击者可以利用这些缺陷访问未经授权的功能或数据&#xf…

QA测试开发工程师面试题满分问答9: Python中内存管理的概念、原理、使用

概念原理 Python中的内存管理是由解释器自动处理的&#xff0c;它使用引用计数和垃圾回收机制来管理内存。以下是Python内存管理的一些关键概念、设计原理和最佳实践&#xff0c;以帮助您高效使用和管理内存&#xff1a; 引用计数&#xff1a;Python使用引用计数来追踪对象的引…

基于JAVA+SSM+微信小程序+MySql的图书捐赠管理系统设计与实现(前后端分类)

一、项目背景介绍&#xff1a; 在当今社会&#xff0c;图书捐赠是一种普遍而有益的行为&#xff0c;旨在促进阅读、教育和知识传播。图书捐赠可以帮助改善教育资源不足的地区、学校和社区的阅读环境&#xff0c;提供更多的学习机会和知识获取途径。随着互联网和移动技术的发展&…

Redis-更新策略,缓存穿透,缓存雪崩,缓存击穿

Redis-更新策略,缓存穿透,缓存雪崩,缓存击穿 1.缓存更新 策略 淘汰策略超时剔除主动更新 更新策略&#xff1a;先修改数据库还是先删除缓存 结论&#xff1a;先修改数据库&#xff0c;因为缓存的操作比较快&#xff0c;容易产生数据不一致更新缓存还是删除缓存&#xff1f; …

网络协议——HTTP协议

目录 ​编辑 一&#xff0c;HTTP协议基本认识 二&#xff0c;认识URL 三&#xff0c;http协议的格式 1&#xff0c;发送格式 2&#xff0c;回应格式 四&#xff0c;服务端代码 五&#xff0c;http报文细节 1&#xff0c;Post与Get方法 2&#xff0c;Content_lenth 3&…

html加载后端数据较慢问题记载

标题: html加载后端数据较慢问题记载 日期: 2024-04-06 22:29:00 标签: [html, flask] 分类: [Python, Flask] 网站页面最近加载很慢&#xff0c;不知道为什么&#xff0c;这里记录一下&#xff0c;一步一步查问题的思路。 说下环境 python3.8 flask2.3.3 mysql5.7 问题 刷…