更新中
本专栏是博主在大学浪了近两年啥也没学后重学计算机专业时写的,方便个人学习和复习,本人菜鸟一枚,如有错误或能优化的地方欢迎指正,也特别欢迎交流学习。
motto共勉:心之所向,素履以往;做喜欢的事不需要坚持
目录
第一章 绪论
1.1.1 数据库4个基本概念
数据
是数据库存储的对象
定义:描述事物的符号记录
语义:对数据的解释
记录:计算机中对数据(结构)表示和存储的一种格式
数据库(Data Base)
定义:长期存储在计算机中,有组织可共享的大量数据的集合
通俗解释:存放大量数据的仓库
特点:永久存储、有组织、可共享
数据库管理系统 DBMS (Data Base Manegement System)
定义:管理和控制数据库的系统软件
主要功能:1.数据定义功能
提供DDL(Data Definition Language)对数据的组成和结构定义
2.数据组织、存储和管理功能
目的是提高空间存储利用率和数据存取效率
3.数据操纵功能
提供DML(Data Manipulation Language)实现对数据库的基本操作:查找和更新(插入、删除、修改)
4.数据库事务管理和运行管理
DBMS统一对数据库管理控制保证了数据的安全性和完整性(包括正确性、有效性和相容性)、多用户的并发控制和系统故障恢复
5.数据库的建立和维护功能
6.其他功能
数据库系统 DBS(Data Base System)
定义 由数据库,数据库管理系统(及其应用开发工具),应用程序和数据库管理员 DBA(Data Base Administrator)组成的存储、管理、处理和维护数据的系统
数据库系统
1.1.2 数据管理技术的产生和发展
数据处理
指对数据收集、存储、加工、传播的一系列活动的总和
数据管理
数据处理的核心问题。指数据的分类、编码、存储、检索和维护
数据管理技术发展阶段
每一个阶段都是以减小数据冗余、增强数据独立性和方便操作数据为目的进行发展
三个阶段比较表
从文件系统阶段到数据库系统阶段标志着数据管理技术的飞跃
注:文件系统中数据被组织成互相独立的数据文件,程序按照按照文件名访问数据
数据库系统
1.1.3 数据库系统特点
数据结构化
文件系统与数据库系统的本质区别 ;
整体结构化:数据库的数据不在仅仅面向某个应用,而是面向整个系统;不仅数据内部有结构,数据之间也有联系
数据的共享性高、冗余度低且易扩充
共享性:数据面向整个系统,因此数据可以被多个应用多个用户共享使用
冗余度:数据共享可以大大降低冗余度,节约存储空间。数据共享还可以避免数据的不相容性和不一致性
不一致性:数据被重复存储时,同一数据的副本值(copy)不同
易扩充:数据面向系统后,不仅可以被多个应用共享使用,还易增加应用,使得系统弹性大,易扩充
数据独立性高
数据独立性包括逻辑独立性和物理独立性,由数据库管理系统提供的二级映像功能保证
逻辑独立性:用户的应用程序与数据库的逻辑结构相互独立。即数据的逻辑结构改变,用户的应用程序不用改变
物理独立性:用户的应用程序与数据库的物理存储相互独立。即数据的存储结构改变,用户的应用程序不用改变
由数据库管理系统统一管理控制
由于数据库的共享是并发的,即允许多个用户同一时间使用、修改数据库,甚至允许多个用户同一时间使用、修改同一数据,而这会带来用户之间相互干扰的隐患。为此,数据库管理系统提供以下数据控制功能:
1.数据的安全性保护
保护数据以防止不合法使用造成的数据泄密和破坏
2.数据的完整性检查
数据的完整性指数据的正确性、有效性和相容性。将数据控制在一定范围内,并保证数据之间满足一定关系
3.并发控制
对多用户并发操作控制和协调
4.数据库恢复
计算机系统的硬件故障、软件故障、操作员的操作失误或故意破坏等都会影响数据库的数据正确性,甚至造成数据库的部分或全部数据丢失。数据库恢复即将数据库从错误状态恢复到某一已知的正确状态
总结 Conclusion
数据库是长期存储在计算机内、有组织、可共享的大量数据集合。它共享性高、冗余度低、易扩充、数据独立性高。数据库管理系统在数据库建立、运行和维护时对数据库统一管理控制,以保证数据的安全性和完整性,多用户的并发控制和系统故障恢复。
数据库系统的出现使信息系统从以加工数据的程序为中心转向以围绕共享的数据库为中心的新阶段。数据库系统便于数据的集中管理,简化程序的研制和维护,提高了数据的利用率和相容性,提高决策的正确性等等
1.2数据模型
模型
对现实世界的模拟和抽象
数据模型
数据模型是数据库的核心和基础
定义 对现实世界的数据特征的抽象,用来描述数据、组织数据、对数据进行操作
why 计算机不可能直接处理现实世界的具体事物,所以需要人们提前将事物转换成计算机能处理的数据,这个过程即数字化,把现实世界中具体的人、物、活动、概念用数据模型这个工具来抽象、表示和处理
重要性 机器上的数据库管理系统必须基于或支持某个数据模型
1.2.1 两类数据模型
概念模型(信息模型)
定义:按用户的观点对数据和信息建模,主要用于数据库设计
逻辑模型和物理模型
逻辑模型:按计算机系统的观点对数据建模,主要用于数据库管理系统的实现。包括层次模型(hierarchical model)、网状模型(network model)、关系模型(relational model)、面向对象模型(object oriented model)和对象关系数据模型(object relational data model)、半结构化数据模型(semistructured data model)等。
物理模型:对数据最底层的抽象,描述数据在系统内部的表示方式和存取方式
现实世界中客观对象的抽象过程
将现实世界抽象为信息世界,再将信息世界转换为机器世界:将现实世界的客观对象抽象为某一种信息结构,信息结构独立于任何其他层次,是概念级的模型,再将概念模型转换成某一数据库管理系统支持的数据模型
其中,现实世界到信息模型的转换由数据库设计人员完成,概念模型到逻辑模型的转换由数据库设计人员或数据库设计工具的协助人员完成,逻辑模型到物理模型主要由数据库管理系统完成
现实世界中客观对象的抽象过程
1.2.2 概念模型
基本术语
实体:客观存在的能相互区别的事物。实体可以是具体的人、事或抽象的概念和联系,如一个部门、一个学生、部门的一次订单、教师和院系的工作关系等
属性:实体具有的特性。一个实体可由多个属性刻画,如学生实体可由学号、姓名、性别、所在院系等属性组成,这个属性组合表征了学生
码(key):唯一标识实体的属性集。如学号是学生实体的码
实体型:具有相同属性的同类实体的描述。用实体名及其属性名集合来抽象和描述同类实体。如学生(学号,姓名,性别,所在院系,入学时间)
实体集:同一实体型集合。如全体学生
联系:在现实世界中事物内部,事物之间都存在联系,这些联系反映到信息世界即实体(型)内部和实体(型)之间的联系。实体内部联系指属性间联系,实体之间的联系指实体集间的联系,有一对一、一对多、多对多等多种类型
表示方法
表示方法有很多,常用的是实体-联系方法(Entity-Relationship Approach),也叫E-R方法或E-R模型,该方法用E-R图描述现实世界的信息模型
1.2.3 数据模型的组成要素
数据模型是一组严格定义的概念,这些概念精确描述了系统的静态特性、动态特性和完整性约束条件
数据结构:描述数据库的组成对象和对象间联系。是对系统的静态特性描述
数据操作:对数据库中各种模式(型)的实例(值)允许执行的操作的集合,包括与操作有关的操作规则
完整性约束条件:一组完整性规则。保证数据的正确性、有效性和相容性
1.2.4 常用的数据模型
格式化模型
格式化模型指的是层次模型和网状模型
格式化模型的实体为记录,实体的属性对应记录的数据项(或字段)
格式化模型的数据结构的基本单位:基本层次联系,即两个记录以及他们之间的一对多(包括一对一)联系
层次模型
层次模型实际上是网状模型的一个特例
数据结构:树
基本层次联系满足条件:1.有且只有一个结点没有双亲结点,即根结点
2.除根结点外每个结点有且只有一个双亲结点
层次模型中,每个结点即一个记录类型,记录类型间联系用有向边表示,只能用于一对多的父子联系;每个记录模型可包括若干字段,每个记录类型可定义一个排序字段(码字段),码字段可以唯一标识一个记录值
层次模型基本特点:只能按层次路径查看记录值
数据操作:数据操作主要有查询、插入、删除和修改
完整性约束条件: 无相应的双亲结点值就不能插入子女结点值
如果删除双亲结点值,则相应的子女结点值也被同时删除
更新操作时,应更新所有相应记录,以保证数据的一致性
优点:数据结构清晰;方便查询
缺点:现实世界中很多事物联系是非层次的
一个层次模型的实例
教员学生的层次数据库模型
网状模型
典型的网状模型有数据库任务组DBTG(Data Base Task Group)系统,即数据系统语言研究会CODASYL(Conference On Data System Language)系统
数据结构:基本层次联系满足条件:1.允许一个以上的结点没有双亲结点
2.每个结点可以有多个双亲结点
也是一对多的父子联系,但层次模型的结点间联系唯一,而网状模型不唯一
数据操作和完整性约束条件:网状模型的约束条件没有层次模型那么严格
优点:更能直接描述现实世界
缺点:结构复杂
注:本人记性不太好,所以数据操作和完整性约束条件等笔记在初期都比较少,具体的完整内容预想的是等后期大量应用时自然地熟悉kkk
学生选课的网状模型
关系模型
关系模型是建立在严格的数学概念的基础上的,用户的观点看是关系模型由一组关系组成
术语
关系:表
元组:行
属性:列
码(码键):能唯一标识元组的属性组
域:相同数据类型的值集合
分量:元组的属性值
关系模式:对关系的描述,通常格式为 关系名(属性名1,属性名2......)
数据结构: 规范化的二维表
规范条件最基本一条是每个分量不可分
数据操纵: 主要包括查询、插入、删除和修改。关系模型的数据操纵都是集合操作,操作对象和操作结果都是关系。并且将存取路径向用户屏蔽,提高数据的独立性
完整性约束条件: 实体完整性、参照完整性和用户完整性
优点:与格式化模型不同,关系模型建立在严格数学概念的基础上
数据独立性高
缺点:存取路径屏蔽,查询效率低
1.3 数据库系统的结构
1.3.1数据库系统的模式
术语
型与值:型是指对某一类数据的结构和属性的描述,值是型的具体赋值
模式与实例:模式是对全体数据的逻辑结构和特征的描述,仅涉及型的描述。实例是模式的一个具体值
三级模式结构
虽然数据库管理系统产品种类很多,支持不同的数据模型,使用不同的数据库语言,建立在不同的操作系统上,数据的存储结构也不同,但他们在体系结构上具有相同的特征,即采用三级模式结构并提供二级映像功能
组成
模式(逻辑模式)
是数据库全体数据的逻辑结构和特征的描述
一个数据库只有一个模式,数据库模式以某一种数据模型为基础。数据库管理系统提供了模式DDL语言来严格定义模式
外模式(子模式或用户模式)
是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图(用户视图),是与某一应用有关的数据的逻辑表示
外模式通常是模式的子集,一个数据库可以有多个外模式。外模式是数据库安全性的一个有力措施,用户只能看见和访问所对应的外模式的数据。数据库管理系统提供了外模式DDL严格定义外模式
内模式(存储模式)
是数据物理结构和存储方式的描述,是数据在内部的组织方式
一个数据库只有一个内模式
三级模式结构
1.1.3 数据库的二级映像功能与数据独立性
三级模式结构是三层抽象,具体数据组织有数据库管理系统完成,为了能在系统内部实现这三个抽象层次的联系和转换,数据库管理系统在这三级模式之间提供了两层映像,这两层映像保证了数据库的数据具有较高的逻辑独立性和物理独立性
外模式/模式映像
对于每一个外模式都有一个外模式/模式映像,描述了外模式和模式间的对应关系,该映像定义通常包含在外模式的描述中
当模式改变(如增加新的关系、新的属性、改变属性的数据类型)时,由数据库管理员改变外模式/模式映像,外模式无需改变,而应用程序依据外模式编制,从而应用程序也无需改变,保证了数据和程序的逻辑结构独立性,简称数据的逻辑独立性
模式/内模式映像
一个数据库只有一个模式/内模式映像,描述了全局逻辑结构和存储结构间的关系,该映像定义在模式的描述中
当数据的存储结构改变时,由数据库管理员改变模式/内模式映像,模式不用改变,从而应用程序也不用改,保证了数据和程序的物理结构独立性,简称数据的物理独立性
各依赖关系
三级模式结构中,模式是中心,它独立于其他层次
内模式依赖于全局逻辑结构,独立于数据库的用户视图,即外模式,也独立于具体的存储设备;它是将全局逻辑结构(模式)定义的数据结构及其联系按一定的物理存储策略进行组织,以达到较高的时间和空间效率
外模式面向具体的应用程序,定义在逻辑模式之上,独立于存储结构和存储设备
特定的的应用程序在外模式定义的数据结构上编制,独立于模式和内模式,依赖于外模式,而二级映像功能从底层保证了外模式的稳定性,除非应用需求要修改,否则一般不用修改
1.4 数据库系统的组成
数据库系统由数据库、数据库管理系统(及其应用开发工具)、应用程序和数据库管理员组成
硬件平台与数据库
由于数据库的数据量很大,数据库管理系统的功能也很丰富,所以对硬件资源的要求高:
1.内存足够大
2.大容量磁盘或磁盘阵列
3.较高的通道能力,保证较高的数据传输率
软件
数据库的软件包括:
1.数据库管理系统:用于数据库的建立、运行、管理和维护的系统软件
2.支持数据库管理系统运行的操作系统
3.与数据库接口的高级语言及编译系统
4.以数据库管理系统为核心的应用开发工具
5.用于特定应用环境开发的数据库应用系统
人员
包括数据库管理员、系统分析员、数据库设计人员、应用程序员和最终用户,不同人员负责不同的数据抽象级别,有不同的数据视图
数据管理员负责全面管理数据库,具体职责如下:
1.决定数据库的信息结构与内容
2.决定数据库的存储结构与存储方式
3.定义数据的安全性要求和完整性约束条件
4.监控数据库的使用和运行
5.对数据库改进、重组和重构
系统分析员负责应用系统的需求分析和规范说明,要和用户和数据库管理员结合,确定系统的硬件软件配置,并参与数据库系统的概要设计
数据库设计人员负责确定数据和数据库各级模式的设计,必须参与用户需求调查和系统分析,然后进校数据库设计。很多情况下,数据库管理人员充当数据库设计人员
应用程序员负责设计和编写应用系统的程序模块,并进行调试和安装
最终用户通过应用系统的用户接口使用数据库,常用接口有浏览器、菜单驱动、表格操作、图形显示等等
用户可分类为偶然用户、简单用户和复杂用户
各人员的数据视图
由此可见,数据库不仅是计算机系统,还是人-机系统
第二章 关系数据库
关系数据库系统是支持关系模型的数据库系统,关系模型由数据结构、数据操作集合和完整性约束条件组成
2.1.1 关系
关系模型的数据结构是关系,从用户观点看就是一张二维表
这里从集合论的角度介绍关系数据结构的形式化定义
1.域
定义2.1:具有相同数据类型的值的集合
2.笛卡尔积
笛卡尔积是定义在域上的集合操作
定义2.2:给定一组域D1,D2,…,Dn,允许其中某些域是相同的。D1,D2,…,Dn的笛卡尔积为: D1×D2×…×Dn = {(d1,d2,…,dn)|di∈Di,i=1,2,…,n}
笛卡尔积中每一个元素(d1,d2,…,dn)叫作一个n元组(n-tuple)或简称元组
笛卡尔积元素(d1,d2,…,dn)中的每一个值di 叫作一个分量
若Di(i=1,2,…,n)为有限集,其基数为mi(i=1,2,…,n),则D1×D2×…×Dn的基数M为:
基数:一个域允许的不同值的个数,通俗讲就是笛卡尔积的元素(元组)个数
3.关系
定义2.3: D1×D2×…×Dn的子集叫做在域D1,D2,…,Dn的关系,表示为R(D1,D2,…,Dn)
R表示关系名(表名),n是关系的目或者度
关系中的每个元素是关系中的元组,通常用t表示
当n=1时,称该关系为单元关系或一元关系
当n=2时,称该关系为二元关系
n目关系必有n个属性
候选码:能唯一标识元组的最小属性组
若一个关系有多个候选码,则选定一个为主码
候选码的诸属性叫主属性,不包括在任何候选码的属性叫非主属性或非码属性
最简单的情况下,候选码只有一个属性,最极端的情况下,一个关系模式的全部属性为候选码,叫全码
关系类型
基本关系(基本表或基表):实际存在的表,是实际存储数据的逻辑表示
查询表 :查询结果对应的表
视图表: 由基本表或其他视图表导出的表,是虚表,不对应实际存储的数据
基本关系的6条性质:
列是同质的
不同的列可出自同一个域,其中的每一列称为一个属性,不同的属性要给予不同的属性名
列的顺序无所谓,列的次序可以任意交换
任意两个元组的候选码不能相同
行的顺序无所谓,行的次序可以任意交换
分量必须取原子值,这是规范条件中最基本的一条
2.1.2 关系模式
数据库要区分型和值。关系模式是型,关系是值。关系模式是对关系数据结构的描述
定义 2.4 关系的描述称为关系模式。它可以形式化地表示为 R( U, D, DOM, F )
其中,R为关系名,U为组成该关系的属性名集合,D为U中属性所来自的域,DOM为属性向域的映像集合,F为属性间数据的依赖关系集合
2.1.3 关系数据库
关系模式中,实体以及实体间的联系都是用关系来表示的
数据库的数据结构都是关系
2.1.4 关系模型的存储结构
表是关系数据的逻辑模型。有的关系数据库管理系统中一个表对应一个操作系统文件,将物理数据组织交给操作系统完成,有的关系数据库管理系统从操作系统那里申请若干个大的文件,自己花粉文件空间,组织表、索引等存储结构
2.2 关系操作
关系模型给出了关系操作的能力的说明,但不对关系数据库管理系统语言给出具体的语法要求,即不同的关系数据库管理系统可以定义和开发不同的语言来实现操作
2.2.1 基本的关系操作
关系模型中常用的关系操作有查询和更新(插入、删除、修改)两大部分
最主要的部分是查询,关系的查询表达能力很强。其中,选择、投影、并、差、笛卡尔积是查询操作的5种基本操作
关系操作的特点是集合操作方式,也叫一次一集合方式。非关系数据模型的数据操纵方式为一次一记录方式
2.2.2 关系数据语言的分类
早期的关系操作能力常用代数方式或逻辑方式表示,分别称为关系代数和关系演算。关系代数用对关系的运算表达查询要求,关系演算用谓词来表达。关系演算又可按谓词变元的基本对象分为元组关系演算和域关系演算。
这些都是抽象的查询语言,与关系数据库管理系统中实现的实际语言并不完全一样,但能用于评估实际关系数据库管理系统的查询语言能力的标准或基准
另外还有结构化查询语言SQL(Structured Query Language),不仅具有丰富的查询功能,还有数据定义语言、数据操纵语言和数据控制语言
特别地,SQL是高度非过程化语言,存取路径的选择由关系数据库管理系统的优化机制完成
关系数据语言分类
2.3 关系的完整性
关系模型的完整性规则是对关系的某种约束条件,这些约束条件实际上是现实世界的要求
关系模型有三种完整性约束:实体完整性、参照完整性、用户定义的完整性。其中,实体完整性和参照完整性是关系模型必须满足的,称为关系的两个不变性
2.3.1 实体完整性
规则 2.1 实体完整性规则 若属性A是基本关系R的主属性,则属性A不能取空值。空值就是“不知道”或“不存在”或“无意义”的值
实体完整性规则的说明
(1)实体完整性规则是针对基本关系而言的。 一个基本表通常对应现实世界的一个实体集。
(2)现实世界中的实体是可区分的,即它们具有某种唯一性标识。
(3)关系模型中以主码作为唯一性标识。
(4)主码中的属性即主属性不能取空值。主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,这与第(2)点相矛盾,因此这个规则称为实体完整性
2.3.2 参照完整性
关系间存在相互引用、相互约束的情况,引用外码的概念给出描述关系间相互引用约束的参照完整性的定义
外码
设F是基本关系R的一个或一组属性,但不是关系R的码。如果F与基本关系S的主码Ks相对应,则称F是R的外码
基本关系R称为参照关系,基本关系S称为被参照关系或目标关系
规则2.2 参照完整性规则
若属性(或属性组)F是基本关系R的外码它与基本关系S的主码Ks相对应(基本关系R和S不一定是不同的关系),则对于R中每个元组在F上的值必须为:
或者取空值(F的每个属性值均为空值)
或者等于S中某个元组的主码值
2.3.3 用户定义的完整性
用户定义的完整性就是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。例如,在学生关系中,若按照应用的要求学生不能没有姓名,则可定义学生姓名不能取空值
关系模型应提供定义和检验这类完整性的机制,以便用统一的系统的方法处理它们而不需由应用程序承担这一功能。
2.4关系代数
关系代数是一种抽象的查询语言,它用对关系的运算来表达查询。
任何一种运算都是将一定的运算符作用于一定的运算对象上,得到预期的运算结果。所以运算对象、运算符、运算结果是运算的三大要素。
关系代数的运算对象是关系,运算结果亦为关系。关系代数用到的运算符包括两类:集合运算符和专门的关系运算符
2.4.1传统的集合运算
传统的集合运算是二目运算,包括并、差、交、笛卡儿积4种运算。
设关系R和关系S具有相同的目n(即两个关系都有n个属性),且相应的属性取自同一个域,t是元组变量,t∈R表示t是R的一个元组。可以定义并、差、交运算如下
并
关系R与关系S的并记作
R U S = { t | t ∈ R ∨ t ∈ S }
其结果仍为n目关系,由属于R或属于S的元组组成
差
关系R与关系S的差记作
R - S = { t | t = R ∧ t ∉ S }
其结果关系仍为n目关系,由属于R而不属于S的所有元组组成
交
关系R与关系S的交记作
R ∩ S = { t | t ∈ R ∧ t ∈ S }
其结果关系仍为n目关系,由既属于R又属于S的元组组成。关系的交可以用差来表示,即
R ∩ S = R -( R - S )
笛卡尔积
这里的笛卡儿积严格地讲应该是广义的笛卡儿积,因为这里笛卡儿积的元素是元组。
两个分别为n目和m目的关系R和S的笛卡儿积是一个(n+m)列的元组的集合。元组的前n列是关系R的一个元组,后m列是关系S的一个元组。若R有k1个元组,S有k2个元组,则关系R和关系S的笛卡儿积有k₁×k2个元组。记作
R×S = { | tr ∈ R ∧ ts ∈ S }
举个栗子
第一张图为具有三个属性列的关系R、S。第二张为关系R与S的并,第三张为为关系R与S的交,第四张为关系R和S的差最后一张为为关系R和S的笛卡儿积
2.4.2 专门的关系运算
专门的关系运算包括选择、投影、连接、除运算等。为了叙述上的方便,先引入几个记号。
(1)设关系模式为R(A1,A2,…,An),它的一个关系设为R。t∈R表示t是R的一个元组。t[Ai]则表示元组t中相应于属性Ai的一个分量。
(2)若A={Ai1,Ai2,…,Aik},其中Ai1,Ai2,…,Aik是A1,A2,…,An中的一部分,则A称为属性列或属性组。t[A]=(t[Ai1],t[Ai2],…,t[Aik])表示元组t在属性列A上诸分量的集合,A拔 则表示{A1,A2,…,An}中去掉{Ai1,Ai2,…,Aik}后剩余的属性组
(3)R为n目关系,S为m目关系。tr∈R,ts∈S,称为元组的连接或元组的串接。它是一个(n+m)列的元组,前n个分量为R中的一个n元组,后m个分量为S
(4)给定一个关系R(X,Z),X和Z为属性组。当t[X]=x时,x在R中的象集定义为
Zx = { t[Z] | t ∈ R, t[X] = x }
它表示R中属性组X上值为x的诸元组在Z上分量的集合。
通俗讲就是选一次行再选一次列:先选值为x的所有行,再选这些行中除了x以外的列(选择x对应的值集合)
下面给出这些专门的关系运算的定义。
选择
选择又称为限制。它是在关系R中选择满足给定条件的诸元组,记作
σF(R) = { t | t ∈ R ∧ F(t) = '真' },其中F表示选择条件,它是一个逻辑表达式,取逻辑值“真”或“假”。
逻辑表达式F的基本形式为 X₁θY₁
其中θ表示比较运算符,它可以是>,≥,<,≤,=或<>。X₁,Y₁等是属性名,或为常量,或为简单函数;属性名也可以用它的序号来代替。在基本的选择条件上可以进一步进行逻辑运算,即进行求非(¬)、与(∧)、或(∨)运算。
选择运算实际上是从关系R中选取使逻辑表达式F为真的元组。这是从行的角度进行的运算。
投影
关系R上的投影是从R中选择出若干属性列组成新的关系。记作
πA(R) = { t[A] | t ∈ R }
其中A为R中的属性列。投影操作是从列的角度进行的运算。
220506更新随笔
这个月在不务正业,这学期搬到校外租房后首次装饰房间,养了一只猫,开了一些坑知乎号:道本元;精神障碍从初高中的愈来愈严重到现在慢慢自愈,虽然局部严重,比如这个几乎是荒废了的一个月,但是整体有了很大的改观。无论遇到什么,记住生命只有一次,大胆地去活,它自有出路!
是美短弟弟哦,小名是糖糖
第三章 关系数据库标准语言SQL
3.1 SQL概述
3.1.1 SQL
结构化查询语言(Structured Query Language)是关系数据库的标准语言
目前,没有一个数据库系统能够支持SQL标准的所有概念和特性,许多软件厂商对SQL基本命令集进行了不同程度的扩充和修改,可以支持标准以外的一些特性
3.1.2 SQL特点
1.综合统一
2.高度非过程化:存取路径的选择以及SQL操作过程由系统自动完成
3.面向集合的操作方式
4.以同一种语法结构提供多种使用方式:是独立语言又是嵌入式语言
5.语言简洁,易学易用
3.1.3 SQL基本概念
支持SQL的关系数据库管理系统同样支持关系数据库的三级模式结构
基本表是本身独立存在的表,在关系数据库管理系统中一个关系对应一个基本表
一个基本表对应若干存储文件,存储文件还可以存放索引,存储文件的逻辑结构组成了关系数据库的内模式,存储文件的物理结构对最终用户屏蔽。
视图是从一个或几个基本表导出的表,是虚表。
3.2 学生-课程数据库
以学生-课程数据库为例讲解SQL的数据定义、数据操纵、数据查询和数据控制语句
学生-课程模式 S-T :
学生表:Student(Sno,Sname,Ssex,Sage,Sdept)
课程表:Course(Cno,Cname,Cpno,Ccredit)
学生选课表:SC(Sno,Cno,Grade)
学号 Sno | 姓名 Sname | 性别 Ssex | 年龄 Sage | 所在系 Sdept |
201215121 | 李勇 | 男 | 20 | CS |
201215122 | 刘晨 | 女 | 19 | CS |
201215123 | 王敏 | 女 | 18 | MA |
201215125 | 张立 | 男 | 19 | IS |
课程号 Cno | 课程名 Cname | 先行课 Cpno | 学分 Ccredit |
1 | 数据库 | 5 | 4 |
2 | 数学 | 2 | |
3 | 信息系统 | 1 | 4 |
4 | 操作系统 | 6 | 3 |
5 | 数据结构 | 7 | 4 |
6 | 数据处理 | 2 | |
7 | PASCAL语言 | 6 | 4 |
学 号 Sno | 课程号 Cno | 成绩 Grade |
201215121 | 1 | 92 |
201215121 | 2 | 85 |
201215121 | 3 | 88 |
201215122 | 2 | 90 |
201215122 | 3 | 80 |
3.3 数据定义
SQL的数据定义功能: 模式定义 表定义 视图和索引的定义
3.3.1 模式的定义与删除
[例]为用户WANG定义一个学生-课程模式S-T
CREATE SCHEMA “S-T” AUTHORIZATION WANG;
若语句没有指定<模式名>,则<模式名>隐含为<用户名>
在CREATE SCHEMA中可以接受CREATE TABLE,CREATE VIEW和GRANT子句。 CREATE SCHEMA <模式名> AUTHORIZATION <用户名>[<表定义子句>|<视图定义子句>|<授权定义子句>]
[例]CREATE SCHEMA TEST AUTHORIZATION ZHANG
CREATE TABLE TAB1 ( COL1 SMALLINT,
COL2 INT,
COL3 CHAR(20),
COL4 NUMERIC(10,3),
COL5 DECIMAL(5,2)
);
DROP SCHEMA <模式名> <CASCADE|RESTRICT>
CASCADE(级联) :删除模式的同时把该模式中所有的数据库对象全部删除
RESTRICT(限制) : 仅当该模式中没有任何下属的对象时(如表、视图等)才能执行
[例]DROP SCHEMA ZHANG CASCADE;
3.3.2 基本表的定义、删除与修改
定义
[例] 建立“学生”表Student。学号是主码,姓名取值唯一。
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY, /* 列级完整性约束条件,Sno是主码*/ Sname CHAR(20) UNIQUE, /* Sname取唯一值*/
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);
[例] 建立一个“课程”表Course
CREATE TABLE Course
(Cno CHAR(4) PRIMARY KEY,
Cname CHAR(40),
Cpno CHAR(4),
Ccredit SMALLINT,
FOREIGN KEY (Cpno) REFERENCES Course(Cno)
);
[例] 建立一个学生选课表SC
CREATE TABLE SC
(Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY (Sno,Cno),
/* 主码由两个属性构成,必须作为表级完整性进行定义*/
FOREIGN KEY (Sno) REFERENCES Student(Sno),
/* 表级完整性约束条件,Sno是外码,被参照表是Student */
FOREIGN KEY (Cno)REFERENCES Course(Cno)
/* 表级完整性约束条件, Cno是外码,被参照表是Course*/
);
数据类型
关系模型中域很重要,每个属性来自一个域
数据类型 | 含义 |
CHAR(n),CHARACTER(n) | 长度为n的定长字符串 |
VARCHAR(n), CHARACTERVARYING(n) | 最大长度为n的变长字符串 |
CLOB | 字符串大对象 |
BLOB | 二进制大对象 |
INT,INTEGER | 长整数(4字节) |
SMALLINT | 短整数(2字节) |
BIGINT | 大整数(8字节) |
NUMERIC(p,d) | 定点数,由p位数字(不包括符号、小数点)组成,小数后面有d位数字 |
DECIMAL(p, d), DEC(p, d) | 同NUMERIC |
REAL | 取决于机器精度的单精度浮点数 |
DOUBLE PRECISION | 取决于机器精度的双精度浮点数 |
FLOAT(n) | 可选精度的浮点数,精度至少为n位数字 |
BOOLEAN | 逻辑布尔量 |
DATE | 日期,包含年、月、日,格式为YYYY-MM-DD |
TIME | 时间,包含一日的时、分、秒,格式为HH:MM:SS |
TIMESTAMP | 时间戳类型 |
INTERVAL | 时间间隔类型 |
模式与表
定义基本表所属模式
方法一:在表名中明显地给出模式名
Create table"S-T".Student(......);
方法二:在创建模式语句中同时创建表
方法三:设置所属的模式
每一个基本表都属于某一个模式,创建基本表(其他数据库对象也一样)时,若没有指定模式,系统根据搜索路径来确定该对象所属的模式
搜索路径语句:SHOW search_path;
搜索路径的当前默认值是:$user, PUBLIC 含义是首先搜索与用户名相同的模式名,如果没有则使用PUBLIC模式
数据库管理员用户可以设置搜索路径,然后定义基本表
SET search_path TO "S-T",PUBLIC;
Create table Student(......);
修改基本表
修改语句 :ALTER TABLE
ADD子句用于增加新列、新的列级完整性约束条件和新的表级完整性约束条件
DROP COLUMN子句用于删除表中的列,如果指定了CASCADE短语,则自动删除引用了该列的其他对象,如果指定了RESTRICT短语,则如果该列被其他对象引用,关系数据库管理系统将拒绝删除该列
DROP CONSTRAINT子句用于删除指定的完整性约束条件
ALTER COLUMN子句用于修改原有的列定义,包括修改列名和数据类型
一般格式
ALTER TABLE <表名>
[ ADD[COLUMN] <新列名> <数据类型> [ 完整性约束 ] ]
[ ADD <表级完整性约束>]
[ DROP [ COLUMN ] <列名> [CASCADE| RESTRICT] ]
[ DROP CONSTRAINT<完整性约束名>[ RESTRICT | CASCADE ] ]
[ALTER COLUMN <列名><数据类型> ] ;
[例] 向Student表增加“入学时间”列,其数据类型为日期型
ALTER TABLE Student ADD S_entrance DATE;
不管基本表中原来是否已有数据,新增加的列一律为空值
[例] 将年龄的数据类型由字符型(假设原来的数据类型是字符型)改为整数。
ALTER TABLE Student ALTER COLUMN Sage INT;
[例] 增加课程名称必须取唯一值的约束条件。
ALTER TABLE Course ADD UNIQUE(Cname);
删除基本表
DROP TABLE <表名>[RESTRICT| CASCADE];
[例] 删除Student表
DROP TABLE Student CASCADE;
3.3.3 索引的建立与删除
建立索引的目的:加快查询速度(存取效率)
关系数据库管理系统中常见索引:
顺序文件上的索引
B+树索引
散列(hash)索引
位图索引
特点:
B+树索引具有动态平衡的优点
HASH索引具有查找速度快的特点
语句格式
CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
<表名>:要建索引的基本表的名字
索引:可以建立在该表的一列或多列上,各列名之间用逗号分隔
<次序>:指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASC
UNIQUE:此索引的每一个索引值只对应唯一的数据记录
CLUSTER:表示要建立的索引是聚簇索引
[例] CREATE UNIQUE INDEX Stusno ON Student(Sno);
CREATE UNIQUE INDEX Coucno ON Course(Cno);
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);
修改索引
ALTER INDEX <旧索引名> RENAME TO <新索引名>
删除索引
DROP INDEX <索引名>;
3.3.4 数据字典
数据字典是关系数据库管理系统内部的一组系统表,它记录了数据库中所有定义信息:
关系模式定义
视图定义
索引定义
完整性约束定义
各类用户对数据库的操作权限
统计信息等
关系数据库管理系统在执行SQL的数据定义语句时,实际上就是在更新数据字典表中的相应信息
220510 更新
3.4 数据查询
查询语句一般格式
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>] …
FROM <表名或视图名>[,<表名或视图名> ]…|(SELECT 语句)
[AS]<别名>
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
SELECT子句:指定要显示的属性列
FROM子句:指定查询对象(基本表或视图)
WHERE子句:指定查询条件
GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。
HAVING短语:只有满足指定条件的组才予以输出
ORDER BY子句:对查询结果表按指定列值的升序或降序排序
3.4.1 单表查询
查询仅涉及一个表
1.选择表中的若干列
2.选择表中的若干元组
3.ORDER BY子句
4.聚集函数
5.GROUP BY子句
1.选择表中的若干列
查询指定列
[例] 查询全体学生的学号与姓名。
SELECT Sno,Sname
FROM Student;
查询全部列
选出所有属性列:
在SELECT关键字后面列出所有列名
将<目标列表达式>指定为 *
[例] 查询全体学生的详细记录
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
或 SELECT *
FROM Student;
查询经过计算的值
SELECT子句的<目标列表达式>不仅可以为表中的属性列,也可以是表达式
[例] 查全体学生的姓名及其出生年份。
SELECT Sname,2022-Sage
FROM Student;
输出结果:
Sname 2022-Sage
李勇 1994
刘晨 1995
王敏 1996
张立 1995
使用列别名改变查询结果的列标题
SELECT Sname NAME,'Year of Birth:' BIRTH, 2014-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT
FROM Student;
输出结果:
NAME BIRTH BIRTHDAY DEPARTMENT
李勇 Year of Birth: 1994 cs
刘晨 Year of Birth: 1995 cs
王敏 Year of Birth: 1996 ma
张立 Year of Birth: 1995 is
2.选择表中的若干元组
消除取值重复的行 如果没有指定DISTINCT关键词,则缺省(默认模式)为ALL
[例] 查询选修了课程的学生学号。
SELECT Sno FROM SC;
等价于:
SELECT ALL Sno FROM SC;
执行上面的SELECT语句后,结果为:
Sno
201215121
201215121
201215122
201215122
[例]指定DISTINCT关键词,去掉表中重复的行
SELECT DISTINCT Sno
FROM SC;
执行结果:
Sno
201215121
201215122
查询满足条件的元组
常用的查询条件
查 询 条 件
谓 词
比 较
=, >, <, >=, <=, !=, <>, !>, !<; NOT+上述比较运算符
确定范围
BETWEEN AND, NOT BETWEEN AND
确定集合
IN, NOT IN
字符匹配
LIKE, NOT LIKE
空 值
IS NULL, IS NOT NULL
多重条件(逻辑运算)
AND, OR, NOT
①比较大小
[例] 查询计算机科学系全体学生的名单。
SELECT Sname
FROM Student
WHERE Sdept=‘CS’;
[例]查询所有年龄在20岁以下的学生姓名及其年龄。
SELECT Sname,Sage
FROM Student
WHERE Sage < 20;
[例]查询考试成绩有不及格的学生的学号。
SELECT DISTINCT Sn
FROM SC
WHERE Grade<60;
②确定范围
谓词: BETWEEN … AND … NOT BETWEEN … AND …(都是闭区间)
[例] 查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄
SELECT Sname, Sdept, Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
[例] 查询年龄不在20~23岁之间的学生姓名、系别和年龄
SELECT Sname, Sdept, Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;
③确定集合
谓词:IN <值表>, NOT IN <值表>
[例]查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别。 SELECT Sname, Ssex
FROM Student
WHERE Sdept IN ('CS','MA’,'IS' );
[例]查询既不是计算机科学系、数学系,也不是信息系的学生的姓名和性别。
SELECT Sname, Ssex
FROM Student
WHERE Sdept NOT IN ('IS','MA’,'CS' );
④字符匹配
谓词: [NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’]
<匹配串>可以是一个完整的字符串,也可以含有通配符%和 _ % (百分号)
代表任意长度(长度可以为0)的字符串 例如a%b表示以a开头,以b结尾的任意长度的字符串 _ (下横线)
代表任意单个字符。 例如a_b表示以a开头,以b结尾的长度为3的任意字符串
匹配串为固定字符串
[例] 查询学号为201215121的学生的详细情况。
SELECT *
FROM Student
WHERE Sno LIKE ‘201215121';
等价于:
SELECT *
FROM Student
WHERE Sno = ' 201215121 ';
匹配串为含通配符的字符串
[例] 查询所有姓刘学生的姓名、学号和性别。
SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname LIKE '刘%';
[例] 查询姓"欧阳"且全名为三个汉字的学生的姓名。
SELECT Sname
FROM Student
WHERE Sname LIKE '欧阳__';
[例] 查询名字中第2个字为"阳"字的学生的姓名和学号。
SELECT Sname,Sno
FROM Student
WHERE Sname LIKE '__阳%';
[例] 查询所有不姓刘的学生姓名、学号和性别。
SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname NOT LIKE '刘%';
使用换码字符将通配符转义为普通字符
[例] 查询DB_Design课程的课程号和学分。
SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE 'DB\_Design' ESCAPE '\ ' ;
[例] 查询以"DB_"开头,且倒数第3个字符为 i的课程的详细情况。
SELECT *
FROM Course
WHERE Cname LIKE 'DB\_%i_ _' ESCAPE '\ ' ;
ESCAPE '\' 表示“ \” 为换码字符
220511 更新
⑤ 涉及空值的查询
谓词: IS NULL 或 IS NOT NULL “IS” 不能用 “=” 代替
[例] 某些学生选修课程后没有参加考试,所以有选课记录,但没 有考试成绩。查询缺少成绩的学生的学号和相应的课程号。
SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL
[例] 查所有有成绩的学生学号和课程号。
SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;
⑥多重条件查询
逻辑运算符:AND和 OR来连接多个查询条件
AND的优先级高于OR
可以用括号改变优先级
[例] 查询计算机系年龄在20岁以下的学生姓名。
SELECT Sname
FROM Student
WHERE Sdept= 'CS' AND Sage<20;
[例] 查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别。 SELECT Sname, Ssex
FROM Student
WHERE Sdept IN ('CS ','MA ','IS')
可改写为:
SELECT Sname, Ssex
FROM Student
WHERE Sdept= ' CS' OR Sdept= ' MA' OR Sdept= 'IS ';
3.ORDER BY子句
ORDER BY子句 可以按一个或多个属性列排序
升序:ASC;降序:DESC;缺省值为升序 对于空值,排序时显示的次序由具体系统实现来决定
[例]查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。
SELECT Sno, Grade
FROM SC
WHERE Cno= ' 3 '
ORDER BY Grade DESC;
[例]查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
SELECT *
FROM Student
ORDER BY Sdept, Sage DESC;
4.聚集函数
统计元组个数 COUNT(*) 统计一列中值的个数
COUNT([DISTINCT|ALL] <列名>) 计算一列值的总和(此列必须为数值型) SUM([DISTINCT|ALL] <列名>) 计算一列值的平均值(此列必须为数值型) AVG([DISTINCT|ALL] <列名>)
求一列中的最大值和最小值
MAX([DISTINCT|ALL] <列名>)
MIN([DISTINCT|ALL] <列名>)
[例] 查询学生总人数。
SELECT COUNT(*)
FROM Student;
[例] 查询选修了课程的学生人数。
SELECT COUNT(DISTINCT Sno)
FROM SC;
[例] 计算1号课程的学生平均成绩。
SELECT AVG(Grade)
FROM SC
WHERE Cno= ' 1 ';
[例] 查询选修1号课程的学生最高分数。
SELECT MAX(Grade)
FROM SC
WHERE Cno='1';
[例] 查询学生201215012选修课程的总学分数。
SELECT SUM(Ccredit)
FROM SC,Course
WHERE Sno='201215012' AND SC.Cno=Course.Cno;
5.GROUP BY子句
细化聚集函数的作用对象
如果未对查询结果分组,聚集函数将作用于整个查询结果
对查询结果分组后,聚集函数将分别作用于每个组
按指定的一列或多列值分组,值相等的为一组
[例] 求各个课程号及相应的选课人数。
SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;
查询结果可能为:
Cno COUNT(Sno)
1 22
2 34
3 44
4 33
5 48
[例] 查询选修了3门以上课程的学生学号。
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*) >3;
[例]查询平均成绩大于等于90分的学生学号和平均成绩 下面的语句是不对的:
SELECT Sno, AVG(Grade)
FROM SC
WHERE AVG(Grade)>=90
GROUP BY Sno;
因为WHERE子句中是不能用聚集函数作为条件表达式
正确的查询语句应该是:
SELECT Sno, AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=90;
HAVING短语与WHERE子句的区别:
作用对象不同 WHERE子句作用于基表或视图,从中选择满足条件的元组
HAVING短语作用于组,从中选择满足条件的组。
220512 更新
3.4.2 连接查询
连接查询:同时涉及两个以上的表的查询
连接条件或连接谓词:用来连接两个表的条件
一般格式:
[<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2>
[<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3>
连接字段:连接谓词中的列名称 连接条件中的各连接字段类型必须是可比的,但名字不必相同
1.等值与非等值连接查询
等值连接:连接运算符为=
[例 ] 查询每个学生及其选修课程的情况
SELECT Student.*, SC.*
FROM Student, SC
WHERE Student.Sno = SC.Sno;
查询结果:
连接操作的执行过程
(1)嵌套循环法
首先在表1中找到第一个元组,然后从头开始扫描表2,逐一查找满足连接件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。
表2全部查找完后,再找表1中第二个元组,然后再从头开始扫描表2,逐一查找满足连接条件的元组,找到后就将表1中的第二个元组与该元组拼接起来,形成结果表中一个元组。
重复上述操作,直到表1中的全部元组都处理完毕
(2)排序合并法
常用于=连接
首先按连接属性对表1和表2排序 对表1的第一个元组,从头开始扫描表2,顺序查找满足连接条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。当遇到表2中第一条大于表1连接字段值的元组时,对表2的查询不再继续
找到表1的第二条元组,然后从刚才的中断点处继续顺序扫描表2,查找满足连接条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。直接遇到表2中大于表1连接字段值的元组时,对表2的查询不再继续
重复上述操作,直到表1或表2中的全部元组都处理完毕为止
(3)索引连接
对表2按连接字段建立索引
对表1中的每个元组,依次根据其连接字段值查询表2的索引,从中找到满足条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组
自然连接
[例] 用自然连接完成。
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student,SC
WHERE Student.Sno = SC.Sno;
一条SQL语句可以同时完成选择和连接查询,这时WHERE子句是由连接谓词和选择谓词组成的复合条件。
[例]查询选修2号课程且成绩在90分以上的所有学生的学号和姓名。
SELECT Student.Sno, Sname
FROM Student, SC
WHERE Student.Sno=SC.Sno AND SC.Cno=' 2 ' AND SC.Grade>90;
执行过程: 先从SC中挑选出Cno='2'并且Grade>90的元组形成一个中间关系
再和Student中满足连接条件的元组进行连接得到最终的结果关系
2.自身连接
自身连接:一个表与其自己进行连接 需要给表起别名以示区别
由于所有属性名都是同名属性,因此必须使用别名前缀
[例]查询每一门课的间接先修课(即先修课的先修课)
SELECT FIRST.Cno, SECOND.Cpno
FROM Course FIRST, Course SECOND
WHERE FIRST.Cpno = SECOND.Cno;
查询结果:
Cno
Pcno
1
7
3
5
5
6
3.外连接
外连接与普通连接的区别
普通连接操作只输出满足连接条件的元组
外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出
左外连接 列出左边关系中所有的元组
右外连接 列出右边关系中所有的元组
[例]
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUT JOIN SC ON (Student.Sno=SC.Sno);
执行结果:
4.多表连接
多表连接:两个以上的表进行连接
[例]查询每个学生的学号、姓名、选修的课程名及成绩
SELECT Student.Sno, Sname, Cname, Grade
FROM Student, SC, Course /*多表连接*/
WHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno;
3.4.3 嵌套查询
嵌套查询概述 一个SELECT-FROM-WHERE语句称为一个查询块
将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询
上层的查询块称为外层查询或父查询
下层查询块称为内层查询或子查询
SQL语言允许多层嵌套查询 即一个子查询中还可以嵌套其他子查询
子查询的限制 不能使用ORDER BY子句
不相关子查询:
子查询的查询条件不依赖于父查询 由里向外 逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。
相关子查询:
子查询的查询条件依赖于父查询 首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表 然后再取外层表的下一个元组 重复这一过程,直至外层表全部检查完为止
1.带有IN谓词的子查询
[例] 查询与“刘晨”在同一个系学习的学生。
此查询要求可以分步来完成
① 确定“刘晨”所在系名
SELECT Sdept
FROM Student
WHERE Sname= ' 刘晨 ';
结果为: CS
② 查找所有在CS系学习的学生。
SELECT Sno, Sname, Sdept
FROM Student
WHERE Sdept= ' CS '; 结果为:
Sno
Sname
Sdept
201215121
李勇
CS
201215122
刘晨
CS
将第一步查询嵌入到第二步查询的条件中
SELECT Sno, Sname, Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname= ' 刘晨 '
);
此查询为不相关子查询
用自身连接完成查询要求
SELECT S1.Sno, S1.Sname,S1.Sdept
FROM Student S1,Student S2
WHERE S1.Sdept = S2.Sdept AND S2.Sname = '刘晨';
用连接查询实现
SELECT Sno,Sname
FROM Student,SC,Course
WHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno AND Course.Cname='信息系统';
2.带有比较运算符的子查询
当能确切知道内层查询返回单值时,可用比较运算符(>,<,=,>=,<=,!=或< >)。
[例 ]找出每个学生超过他选修课程平均成绩的课程号。
SELECT Sno, Cno
FROM SC x
WHERE Grade >=
(SELECT AVG(Grade)
FROM SC y
WHERE y.Sno=x.Sno
);
3.带有ANY(SOME)或ALL谓词的子查询
使用ANY或ALL谓词时必须同时使用比较运算
语义为:
> ANY 大于子查询结果中的某个值
> ALL 大于子查询结果中的所有值
< ANY 小于子查询结果中的某个值
< ALL 小于子查询结果中的所有值
>= ANY 大于等于子查询结果中的某个值
>= ALL 大于等于子查询结果中的所有值
<= ANY 小于等于子查询结果中的某个值
<= ALL 小于等于子查询结果中的所有值
= ANY 等于子查询结果中的某个值
=ALL 等于子查询结果中的所有值(通常没有实际意义)
!=(或<>)ANY 不等于子查询结果中的某个值
!=(或<>)ALL 不等于子查询结果中的任何一个值
[例] 查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄 SELECT Sname,Sage
FROM Student
WHERE Sage < ANY
( SELECT Sage
FROM Student
WHERE Sdept= ' CS '
)
AND Sdept <> ‘CS ' ; /*父查询块中的条件 */
结果:
Sname
Sage
王敏
18
张立
19
用聚集函数实现
SELECT Sname,Sage
FROM Student
WHERE Sage <
(SELECT MAX(Sage)
FROM Student
WHERE Sdept= 'CS '
)
AND Sdept <> ' CS ';
[例] 查询非计算机科学系中比计算机科学系所有学生年龄都小的学生姓名及年龄。
方法一:用ALL谓词
SELECT Sname,Sage
FROM Student
WHERE Sage < ALL
(SELECT Sage
FROM Student
WHERE Sdept= ' CS '
)
AND Sdept <> ' CS ’;
方法二:用聚集函数
SELECT Sname,Sage
FROM Student
WHERE Sage <
(SELECT MIN(Sage)
FROM Student
WHERE Sdept= ' CS '
)
AND Sdept <>' CS ';
ANY(或SOME),ALL谓词与聚集函数、IN谓词的等价转换关系
4.带有EXISTS谓词的子查询
EXISTS谓词 存在量词
带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。 若内层查询结果非空,则外层的WHERE子句返回真值 若内层查询结果为空,则外层的WHERE子句返回假值 由EXISTS引出的子查询,其目标列表达式通常都用 * ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义。
NOT EXISTS谓词 若内层查询结果非空,则外层的WHERE子句返回假值 若内层查询结果为空,则外层的WHERE子句返回真值
[例]查询所有选修了1号课程的学生姓名。
SELECT Sname
FROM Student
WHERE EXISTS
(SELECT *
FROM SC
WHERE Sno=Student.Sno AND Cno= ' 1 '
);
[例 ] 查询没有选修1号课程的学生姓名。
SELECT Sname
FROM Student
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE Sno = Student.Sno AND Cno='1'
);
220528 更新
带有EXISTS谓词的子查询(续)
不同形式的查询间的替换
一些带EXISTS或NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换
所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换
用EXISTS/NOT EXISTS实现全称量词(难点)
SQL语言中没有全称量词
可以把带有全称量词的谓词转换为等价的带有存在量词的谓词:
[例]查询与“刘晨”在同一个系学习的学生。
可以用带EXISTS谓词的子查询替换:
SELECT Sno,Sname,Sdept
FROM Student S1
WHERE EXISTS
(SELECT *
FROM Student S2
WHERE S2.Sdept = S1.Sdept AND S2.Sname = '刘晨');
[例] 查询选修了全部课程的学生姓名。
SELECT Sname
FROM Student
WHERE NOT EXISTS
(SELECT *
FROM Course
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE Sno= Student.Sno AND Cno= Course.Cno
)
);
用EXISTS/NOT EXISTS实现逻辑蕴涵(难点)
SQL语言中没有蕴涵(Implication)逻辑运算
可以利用谓词演算将逻辑蕴涵谓词等价转换为:
[例]查询至少选修了学生201215122选修的全部课程的学生号码。
解题思路:
用逻辑蕴涵表达:
查询学号为x的学生,对所有的课程y,只要201215122学生选修了课程y,则x也选修了y。 形式化表示:
用P表示谓词 “学生201215122选修了课程y”
用q表示谓词 “学生x选修了课程y”
则上述查询为:
等价变换:
用NOT EXISTS谓词表示:
SELECT DISTINCT Sno
FROM SC SCX
WHERE NOT EXISTS
(SELECT *
FROM SC SCY
WHERE SCY.Sno = ' 201215122 ' AND NOT EXISTS
(SELECT *
FROM SC SCZ
WHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno
)
);
3.4.4 集合查询
集合操作的种类
并操作UNION
交操作INTERSECT
差操作EXCEPT
参加集合操作的各查询结果的列数必须相同;
对应项的数据类型也必须相同
[例] 查询计算机科学系的学生及年龄不大于19岁的学生。
SELECT *
FROM Student
WHERE Sdept= 'CS'
UNION
SELECT *
FROM Student
WHERE Sage<=19;
UNION:将多个查询结果合并起来时,系统自动去掉重复元组
UNION ALL:将多个查询结果合并起来时,保留重复元组
[例\] 查询选修了课程1或者选修了课程2的学生。
SELECT Sno
FROM SC
WHERE Cno=' 1 '
UNION
SELECT Sno
FROM SC
WHERE Cno= ' 2 ';
[例] 查询计算机科学系的学生与年龄不大于19岁的学生的交集。
SELECT *
FROM Student
WHERE Sdept='CS'
INTERSECT
SELECT *
FROM Student
WHERE Sage<=19
[例] 实际上就是查询计算机科学系中年龄不大于19岁的学生。
SELECT *
FROM Student
WHERE Sdept= 'CS' AND Sage<=19;
[例]查询既选修了课程1又选修了课程2的学生。
SELECT Sno
FROM SC
WHERE Cno=' 1 '
INTERSECT
SELECT Sno
FROM SC
WHERE Cno='2 ';
[例]也可以表示为:
SELECT Sno
FROM SC
WHERE Cno=' 1 ' AND Sno IN
(SELECT Sno
FROM SC
WHERE Cno=' 2 '
);
[例] 查询计算机科学系的学生与年龄不大于19岁的学生的差集。
SELECT *
FROM Student
WHERE Sdept='CS'
EXCEPT
SELECT *
FROM Student
WHERE Sage <=19;
[例]实际上是查询计算机科学系中年龄大于19岁的学生
SELECT *
FROM Student
WHERE Sdept= 'CS' AND Sage>19;
3.4.5 基于派生表的查询
子查询不仅可以出现在WHERE子句中,还可以出现在FROM子句中,这时子查询生成的临时派生表(Derived Table)成为主查询的查询对象
[例]找出每个学生超过他自己选修课程平均成绩的课程号
SELECT Sno, Cno
FROM SC, (SELECTSno, Avg(Grade)
FROM SC
GROUP BY Sno)
AS Avg_sc(avg_sno,avg_grade)
WHERE SC.Sno = Avg_sc.avg_sno and SC.Grade >=Avg_sc.avg_grade
如果子查询中没有聚集函数,派生表可以不指定属性列,子查询SELECT子句后面的列名为其缺省属性。
[例]查询所有选修了1号课程的学生姓名,可以用如下查询完成:
SELECT Sname
FROM Student,
(SELECT Sno
FROM SC
WHERE Cno=' 1 ')
AS SC1
WHERE Student.Sno=SC1.Sno;
3.4.6 SELECT语句的一般形式
SELECT [ALL|DISTINCT]
<目标列表达式> [别名] [ ,<目标列表达式> [别名]] …
FROM <表名或视图名> [别名] [ ,<表名或视图名> [别名]] … |(<SELECT语句>)
[AS]<别名> [WHERE <条件表达式>] [GROUP BY <列名1>[HAVING<条件表达式>]] [ORDER BY <列名2> [ASC|DESC]];
目标列表达式的可选格式
目标列表达式格式
(1) *
(2) <表名>.*
(3) COUNT([DISTINCT|ALL]* )
(4) [<表名>.]<属性列名表达式>[,<表名>.]<属性列名表达式>]…
其中<属性列名表达式>可以是由属性列、作用于属性列 的聚集函数和常量的任意算术运算(+,-,*,/)组成的运算公式
聚集函数的一般格式
WHERE子句的条件表达式的可选格式
待更新......