1.信息(Information)
- 1.指现实世界事物的存在方式或运动状态
- 2.通过符号(如文字,图像等)和信号(如某种含义的动作,光电信号等)等具体形式表现出来
- 3.信息具有可感知,可存储,可加工,可再生等自然属性,是各行各业不可或缺的资源
2.数据(Data)
- 1.指描述事物的符号记录
- 2.数据库中存储的基本对象,是信息的载体
- 3.数据可以有很多表现形式(数字,文本,图片,视频等)
1.数据的含义(Meaning of Data)
3.数据库(Database,DB)
- 1.指存放数据的仓库
- 2.指长期储存在计算机内,有组织的,可共享的大量数据的集合
1.数据库数据的三个基本特点
- 1.永久存储
- 2.有组织
- 3.可共享
2.数据库的特性
- 1.数据库是具有逻辑关系和确定意义的数据集合
- 2.一个数据库反映了客观事物的某些方面,且需要与客观事物的状态始终保持一致
- 3.数据库中存放的数据独立于应用程序。数据的存取操作由数据库管理系统(
DBMS
)负责,极大减少了应用程序维护的成本。且数据库中的数据可以被新的应用程序所使用,增强了数据库的共享性和易扩充性- 5.数据库集中了各种应用程序的数据,这些数据可长期存储在计算机的辅助存储器中,用户只有向数据库管理系统提出某些明确请求时,才能到数据库中对数据进行各种操作
- 6.数据库将多个应用程序的数据统一存储并集中使用,将数据库中的多个文件组织起来,相互之间建立密切的联系,尽可能避免同一数据的重复存储,减少和控制了数据冗余,保证了整个系统数据的一致性
4.数据库管理系统(Database Management System,DBMS):
- 1.位于用户与操作系统之间的一层数据管理软件
- 2.一种操纵和管理数据库的大型软件,用于建立,使用和维护数据库
- 3.对数据库进行统一的管理和控制,以保证数据库的安全性和完整性
- 4.用户通过数据库管理系统访问数据库中的数据,数据库管理员也通过数据库管理系统进行数据库的维护工作
- 5.数据库管理系统使多个应用程序和用户可以用不同的方法在同一时刻或不同时刻去建立、修改和询问数据库
- 6.数据库管理系统是数据库系统的核心,是管理数据的软件,是数据库系统的一个重要组成部分
- 7.数据库管理系统帮助用户把抽象的逻辑数据处理转换为计算机中具体的物理数据处理。这样用户可以对数据进行抽象的逻辑处理,而不必理会这些数据在计算机中的布局和物理位置
1.数据库管理系统的功能
- 1.数据定义功能
- 1.提供数据定义语言(
Data Definition Language,DDL
)用于描述数据的结构,约束性条件和访问控制条件,为数据库构建数据框架,以便操作和控制数据- 2.定义数据库中的数据对象
- 2.数据组织,存储和管理功能
- 1.实现数据之间的联系
- 2.分类组织,存储和管理各种数据
- 3.确定组织数据的文件结构和存取方式,提供多种存取方法提高存取效率
- 3.数据操纵功能功能
- 1.提供数据操作语言(
Data Manipulation Language,DML
)- 2.实现对数据库的基本操作(查询,插入,删除,修改)
- 4.数据库的事务管理和运行管理功能
- 1.数据库在建立,运行和维护时由数据库管理系统统一管理和控制
- 2.保证数据的安全性,完整性,多用户对数据的并发使用
- 3.发生故障后的系统恢复
- 5.数据库的建立和维护功能
- 1.包括初始数据输入,数据库转储,恢复功能
- 2.数据库的重组织功能和性能监视,分析功能
- 6.其他功能
- 1.包括数据库系统管理系统与网络中其他软件系统的通信功能
- 2.异构数据库之间的互访和互操作功能
5.数据库管理员(DataBase Administrator,DBA)
- 1.负责数据库的总体信息控制
1.DBA的具体职责
- 1.决定数据库中的信息内容和结构
- 2.决定数据库的存储结构和存取策略
- 3.定义数据库的安全性要求和完整性约束条件
- 4.监控数据库的使用和运行
- 5.改进数据库的性能,对数据库进行重组和重构,以提高系统的性能。
6.数据库系统(Database System,DBS)
- 1.指由数据库,数据库管理系统,数据库应用程序和数据库管理员组成的存储,管理,处理和维护数据的系统
7.总结
1.数据模型定义
- 1.指对现实世界数据特征的抽象
- 2.数据库中用数据模型工具来抽象表示和处理现实世界中的数据和信息
- 3.即 数据模型就是现实世界的模拟
- 4.数据模型是数据库系统(
DBS
)的核心和基础
1.数据模型应满足三方面要求
- 1.能比较真实的模拟现实世界
- 2.容易为人所理解
- 3.便于在计算机上实现
1.概念模型(或信息模型)
1.指按用户的观点来对数据和信息建模。
2.用途
- 1.概念模型用于信息世界的建模
- 2.是现实世界到机器世界的一个中间层次
- 3.是数据库设计的有力工具
- 4.是数据库设计人员和用户之间进行交流的语言
3.信息世界的基本概念:
- 1.实体(Entity)
- 指客观存在并可互相区别的事物,可以是具体的人,事,物,或抽象的概念
- 例:一个学生,一门课,学生的一门成绩,学生与院系的关系(即学生就读某个院系)
- 2.属性(Attribute):
- 指实体所具有的某一特性,一个实体可以由若干个属性来刻画。
- 例:学生实体可以由学号,姓名,性别,出生年月,所在院系等属性组成
- 3.码(Key):
- 指唯一标识实体的属性或属性集
- 例:在一个学校中,一个学号一般是唯一标识一个学生的码,而所有学号是学生实体的码
- 4.实体型(EntityType):
- 指用实体名及其属性名集合来抽象和刻画同类实体
- 例:学生(学号,姓名,性别,出生年月,所在院系,入学时间)就是一个实体型,学生是实体名,括号里的是属性名集合
- 5.实体集(Entity Set):
- 指同一类型实体的集合
- 例:全体学生就是一个实体集
- 6.联系(Relationship):
- 指现实世界中实体内部以及实体之间的联系
- 实体内部的联系通常是指组成实体的各属性之间的联系
- 例:学生实体中一个学号对应一个学生的姓名,学号属性和姓名属性是一一对应关系
- 实体之间的联系通常是指不同实体集之间的联系
- 例:学生选课,课程被学生选。学生实体和课程实体就是有联系的
- 实体之间的关系
- 1.一对一
- 如果对于实体集A中的每一个实体,实体B中至多有一个(也可以没有)实体与之联系,反之亦然,则称实体集A与实体集B具有一对一联系
- 例:系和系主任
- 2.一对多
- 如果对于实体集A中的每个实体,实体集B中有n个实体(n>=0)与之联系,反之,对于实体集B中的每一个实体,实体集A中至多只有一个实体与之联系,则称实体集A与实体集B具有一对多联系
- 例:班级和学生
- 3.多对多
- 如果对于实体集A中的每个一实体,实体B中有n个实体与之联系,反之亦然,则称实体集A与实体集B具有多对多联系
- 例:课程和学生
4.概念模型的表示方法
2.逻辑模型和物理模型
- 1.逻辑模型主要包括:
- 1.层次模型
- 2.网状模型
- 3.关系模型
- 4.面向对象数据模型
- 5.对象关系数据模型
- 6.半结构化数据模型等
- 2.逻辑模型按计算机系统的观点对数据建模,用于
DBMS
(数据库管理系统)实现- 3.物理模型是对数据最底层的抽象,描述数据在系统内部的表示方式和存取方法,在磁盘或磁带上的存储方式和存取方法
3.客观对象的抽象过程
4.数据模型的组成要素
- 1.数据结构
1.指描述数据库的组成对象以及对象之间的联系
2.数据结构描述的内容有两类
- 1.与对象的类型,内容,性质有关
- 2.与对象之间联系有关
3.数据结构是对系统静态特征的描述
- 2.数据操作
- 1.指对数据库中各种对象的实例允许执行的操作的集合,包括操作及有关的操作规则
- 2.数据库主要有查询,更新两大类操作
- 3.数据模型必须定义这些操作的确切含义,操作符号,操作规则,实现操作的语言
- 4.数据操作是对系统动态特性的描述
- 3.数据的完整性约束条件
- 条件1:完整性规则
- 指给定的数据模型中数据及其联系所具有的制约和依存规则,用以限定符合数据模型的数据库状态以及状态的变换,以保证数据的正确,有效和相容
- 4.数据模型对完整性约束条件的定义:
- 指反映规定必须遵守的基本的通用的完整性约束
- 此外数据模型还应该提供定义完整性约束条件的机制,以反映具体应用所涉及的数据必须遵守的特定的语义约束条件
1.层次模型
- 1.层次模型的定义
- 1.层次模型是数据库系统中最早出现的数据模型
- 2.层次数据库系统的典型代表是IBM公司的IMS数据库管理系统
- 3.层次模型用树形结构来表示各类实体以及实体间的联系
- 2.满足下面两个条件的基本层次联系的集合为层次模型
- 1.有且只有一个结点没有双亲结点,这个结点称为根结点
- 2.根以外的其它结点有且只有一个双亲结点
- 3.层次模型中的术语:
- 4.层次模型的特点:
- 1.节点的双亲是唯一的
- 2.只能直接处理一对多的实体联系
- 3.每个记录类型可以定义一个排序字段,也称为码字段
- 4.任何记录值只有按其路径查看时,才能显出它的全部意义
- 5.没有一个子女记录值能够脱离双亲记录值而独立存在
- 5.层次模型的数据操纵
- 1.查询
- 2.插入
- 3.删除
- 4.更新
- 6.层次模型的完整性约束条件
- 1.无相应的双亲结点值就不能插入子女结点值
- 2.如果删除删除双亲结点值,则相应的子女结点值也被同时删除
- 3.更新操作时,应更新所有相应记录,以保持数据的一致性
- 7.层次模型的优缺点
- 1.优点
- 1.层次模型的数据结构比较简单清晰
- 2.查询效率高,性能优于关系模型,不低于网状模型
- 3.层次数据模型提供了良好的完整性支持
- 2.缺点
- 1.结点之间的多对多联系表示不自然
- 2.对插入和删除操作的限制多,应用程序的编写比较复杂
- 3.查询子女结点必须通过双亲结点
- 4.层次命令趋于程序化
2.网状模型
1.网状模型的定义
- 1.网状数据库系统采用网状模型作为数据的组织方式
- 典型代表是DBTG系统(也称为CODASYL系统),20世纪70年代由DBTC(数据库任务组)提出的一个系统方案
2.满足下面两个条件的基本层次联系的集合
- 1.允许一个以上的结点无双亲
- 2.一个结点可以有多于一个的双亲
3.网状模型的数据结构
- 1.实体型:用记录类型描述,每个结点表示一个记录类型(实体)
- 2.属性:用字段描述,每个记录类型可包含若干个字段
- 3.联系:用结点之间的连线表示记录类型(实体)之间的一对多的父子联系
4.网状模型与层次模型的区别:
- 1.网状模型允许多个结点没有双亲结点
- 2.允许结点有多个双亲结点
- 3.还允许两个结点之间有多种联系(复合联系)
- 4.所有网状模型可以更直接地描述现实世界
- 5.层次模型实际上是网状模型的一个特例
5.注意
6.多对多联系在网状模型中表示
7.网状模型的完整性约束条件
- 1.码:唯一标识记录的数据项的集合
- 2.一个联系中双亲记录与子女记录之间是一对多联系
- 3.支持双亲记录和子女记录之间某些约束条件
8.网状模型的优缺点:
- 优点
- 1.能够更为直接地描述现实世界
- 2.具有良好的性能,存取效率较高
- 2.缺点
- 1.结构比较复杂,而且随着应用环境的扩大,数据库的结构就变得越来越复杂,不利于最终用户掌握
- 2.
DDL
,DML
语言复杂,用户不容易使用- 3.记录之间联系是通过存取路径实现的,用户必须了解系统结构的细节
3.关系模型
- 1.关系模型的定义
- 1.关系模型中数据的逻辑结构是一张二维表,它由行和列组成
- 2.一个关系对应通常所说的一张表
- 3.例:学生登记表就是一个关系
- 2.关系模型的数据结构
- 3.关系术语对应的表格术语
- 4.关系模式
- 5.实体及实体间的联系的表示方法
- 6.最基本的规范条件:关系的每一个分量必须是一个不可分的数据项,不允许表中还有表
- 7.关系的主要操作包括
- 1.查询
- 2.插入
- 3.删除
- 4.更新
- 8.关系的完整性约束条件
- 1.实体完整性
- 2.参照完整性
- 3.用户定义的完整性
- 9.关系模型的优缺点:
- 优点
- 1.建立在严格的数学概念的基础上
- 2.概念单一
- 3.实体和各类联系都用关系来表示
- 4.对数据的检索结果也是关系
- 5.关系模型的存取路径对用户透明
- 6.具有更高的数据独立性,更好的安全保密性
- 7.简化了程序员的工作和数据库开发建立的工作
- 缺点:
- 1.存取路径对用户透明,查询效率往往不如格式化数据模型
- 2.为提高性能,必须对用户的查询请求进行优化,增加了开发数据库管理系统的难度
- 10.关系数据库系统
- 采用关系模型作为数据的组织方式
5. 面向对象数据模型
6.对象关系数据模型
7.半结构化数据模型
1.数据库系统模式的概念
- 1.型(Type):是对某一类数据的结构和属性的说明
- 2.值(Value):是对型的一个具体赋值
- 3.模式(Schema):是数据库中全体数据的逻辑结构和特征的描述
- 1.是型的的描述,不涉及具体值
- 2.反映的是数据的结构及其联系
- 3.模式是相对稳定的
- 4.实例(Instance):是模式的一个具体值
- 1.反映数据库某一个时刻的状态
- 2.同一个模式可以有很多实例
- 3.实例随数据库中的数据的更新而变动
2.数据库系统的三级模式结构
1.模式(也称逻辑模式)
- 1.是数据库中全体数据的逻辑结构和特征的描述
- 2.是所有用户的公共数据视图
- 3.一个数据库只有一个模式
- 4.模式是数据库系统模式结构的中间层
- 5.与数据的物理存储细节和硬件环境无关
- 6.与具体的应用程序,开法工具及高级程序设计语言也无关
- 7.定义模式时需要:
- 1.定义数据的逻辑结构(例:数据记录由哪些数据项构成,数据项的名字,类型,取值范围等)
- 2.定义数据之间的联系
- 3.定义与数据有关的安全性,完整性要求
2.外模式(也称子模式或用户模式)
1.指数据库用户(包括应用程序员和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述
2.数据库用户的数据视图,是与某一应用有关的数据打的逻辑表示
3.是保证数据库安全性的一个有力措施
4.每个用户只能看见和访问所对应的外模式的数据,数据库中的其余数据是不可见的
5.外模式的地位:
- 介于模式和应用之间
6.模式和外模式的关系:
- 1.一对多
- 2.外模式通常是模式的子集
- 3.一个数据库可以有多个外模式。反映了不同的用户的应用需求,看待数据的方式,对数据保密的要求
- 4.对模式中同一数据,在外模式中的结构,类型,长度,保密级别等都可以不同
7.外模式与应用的关系:
- 1.一对多
- 2.同一外模式也可以为某一用户的多个应用系统所使用
- 3.但一个应用程序只能使用一个外模式
3.内模式(存储模式)
- 1.是数据物理结构和存储方式的描述
- 2.是数据在数据库内部的表示方式
- 3.一个数据库只有一个内模式
- 4.说明:
- 三级模式是对数据的三个抽象级别
3.数据库系统的二级映像
- 1.指外模式/模式映像和模式/内模式映像
- 2.二级映像在数据库管理系统内部实现这三个抽象层次的联系和转换
1.外模式/模式映像
- 1.模式:描述的是数据的全局逻辑结构
- 2.外模式:描述的是数据的局部逻辑结构
- 3.同一个模式可以有人任意多个外模式
- 4.每一个外模式,数据库系统都有一个外模式/模式映像,定义外模式与模式之间的对应关系
- 5.映像定义通常包含在各自外模式的描述中
- 6.外模式/模式映像保证了数据的逻辑独立性
- 1.当模式改变时,数据库管理员对外模式/模式映像作相应改变,使外模式保持不变
- 2.应用程序时依据数据的外模式编写的,应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性
2.模式/内模式映像
- 1.模式/内模式映像定义了数据全局逻辑结构与存储结构之间的对应关系
- 2.数据库中模式/内模式映像是唯一的
- 3.该映像定义通常包含在模式描述中
- 4.模式/内模式映像保证了数据的物理独立性
- 1.当数据库的存储结构改变了(例如选用了另一种存储结构),数据库管理员修改模式/内模式映像,使模式保持不变
- 2.应用程序不受影响。保证了数据与程序的物理独立性,简称数据的物理独立性
数据库模式
- 1.即全局逻辑结构是数据库的中心与关键
- 2.独立于数据库的其他层次
- 3.设计数据库模式结构时应首先确定数据库的逻辑模式
数据库的内模式:
- 1.依赖于它的全局逻辑结构
- 2.独立于数据库的用户视图,即外模式
- 3.独立于具体的存储设备
- 4.将全局逻辑结构中所定义的数据结构及其联系按照一定的物理存储策略进行组织,以达到较好的时间与空间效率
数据库的外模式
- 1.面向具体的应用程序
- 2.定义在逻辑模式之上
- 3.独立于存储模式和存储设备
- 4.当应用需求发生较大变化,相应外模式不能满足其视图要求时,该模式就得做相应改动
- 5.设计外模式时应充分考虑到应用的扩展性
特定的应用程序
- 1.是在外模式描述的数据库结构上编制的,它依赖于特定的外模式
- 2.与数据库的模式和存储结构独立
- 3.不同的应用程序有时可以共用同一个外模式
- 4.数据库的二级映像保证了数据库外模式的稳定性
- 5.数据与程序之间的独立性,使得数据的定义和描述可以从应用程序中分离出去
- 6.数据的存取由数据库管理系统管理,简化了应用程序的编制,大大减少了应用程序的维护和修改
4.数据库系统的组成
数据库系统的对硬件资源的要求
- 1.足够大的内存
- 2.足够大的磁盘或磁盘阵列等设备
- 3.较高的通信能力,提高数据传输速率
数据库的软件主要包括
- 1.数据库管理系统
- 2.支持数据库管理系统运行的操作系统
- 3.与数据库接口的高级语言及其编译系统
- 4.以数据库管理系统为核心的应用开发工具
- 5.为特定应用环境开发的数据库应用系统
开发,管理和使用数据库系统的人员主要包括有
数据库管理员的具体职责
- 1.决定数据库中的信息内容和结构
- 2.决定数据库的存储结构和存取策略
- 3.定义数据的安全性要求和完整性约束条件
- 4.监视数据库的使用和运行
- 5.周期性转储数据库
- 6.包括数据文件和日志文件
- 7.系统故障恢复
- 8.介质故障恢复
- 9.监视审计文件
- 10.数据库的改进和重组
- 11.性能监控和调优
- 12.定期对数据库进行重组织,以提高系统的性能
- 13.需求增加和改变时,需要对数据库重新构造
系统分析员的主要职责
- 1.负责应用系统的需求分析和规范说明
- 2.与用户及数据库管理员结合,确定系统的硬软件配置
- 3.参与数据库系统的概要设计
数据库设计人员主要职责
- 1.负责数据库中数据的确定及数据库各级模式的设计
- 2.参加用户需求调查和系统分析
- 3.进行数据库设计
应用程序员的主要职责
- 1.设计和编写应用系统的程序模块
- 2.进行调试和安装
用户
- 1.最终用户:
- 通过应用系统的用户接口使用数据库
- 2.偶然用户:
- 不经常访问数据库,但每次访问数据库时往往需要不同的数据库信息
- 例:企业或组织机构的高中级管理人员
- 3.简单用户:
- 主要工作是查询和更新数据库
- 例:银行的职员,机票预订人员,旅馆总台服务员
- 4.复杂用户:
- 直接使用数据库语言访问数据库,甚至能够基于数据库管理系统的应用程序接口编制自己的应用程序
- 例:工程师,科学家,经济学家,科技工作者等
1.SQL语言
- SQL(
Structured Query Language
)
- 1.结构化查询语言,是关系数据库的标准语言
- 2.
SQL
是一个通用的,功能极强的关系数据库语言
1.SQL语言的特点
- 1.综合统一
- 1.集数据定义语言(
DDL
),数据操纵语言(DML
),数据控制语言(DCL
)功能于一体- 2.可以独立完成数据库生命周期中的全部活动:
- 1.定义和修改,删除关系模式,定义和删除视图,插入数据,建立数据库
- 2.对数据库中的数据进行查询和更新
- 3.数据库重构和维护
- 4.数据库安全性,完整性控制,以及事务控制
- 2.高度非过程化
- 1.非关系数据库模型的数据操纵语言面向过程,必须制定存取路径
- 2.
SQL
只要提出做什么,无须了解存取路径- 3.存取路径的选择以及
SQL
的操作过程由系统自动完成- 3.面向集合的操作方式
- 1.非关系数据模型采用面向记录的操作方式,操作对象是一条记录
- 2.
SQL
采用集合操作方式- 3.操作对象,查找结果可以是元组的集合
- 4.一次插入,删除,更新操作的对象可以是元组的集合
- 4.以同一种语法结构提供多种使用方式
- 1.
SQL
是独立的语言,能够独立地用于联机交互的使用方式- 2.
SQL
又是嵌入式语言- 3.
SQL
能够嵌入到高级语言程序中,供程序员设计程序时使用- 5.语言简洁,易学易用
- 1.
SQL
功能极强,完成核心功能只用了9个动词
- 2.数据查询使用
SELECT
- 3.数据定义使用
CREATE
进行创建,DROP
进行删除,ALTER
进行修改- 4.数据操纵使用
INSERT
插入数据,UPDATE
更新数据,DELETE
删除数据- 5.数据控制使用
GRANT
进行授权,REVOKE
收回权限- 6.大小写字母不敏感(大写小写一样)
2.SQL的基本概念
1.概念
1.SQL的数据定义功能
2.表和模式的关系
- 1.表是定义在模式之下,每一个基本表都属于某一个模式
- 2.一个模式包含多个基本表
- 3.定义基本表所属模式的方法:
- 方法一:在表名中明显地给出模式名
--在创建表时,直接把模式名放在表名之前 模式名为S-T Create table “S-T”.Student(...); Create table "S-T".Cource(...); Create table "S-T".SC(...);
- 方法二:在创建模式语句中同时创建表
CREATE SCHEMA <模式名> AUTHORIZATION <用户名> CREATE TABLE TAB1 (...);
- 方法三:设置表所属的模式
-- 设置的方法是定义一个搜索路径 -- 用SET语句对参数search_path设置一个值 -- 这个值就是模式的名称,这样在系统接收到定义表的语句时,可以自动地去为这个表设定模式 -- 创建基本表(其他数据库对象也一样)时,若没有指定模式,系统根据搜索路径来确定该对象所属的模式 SET search_path TO "S-T",public; Create table Student(...); -- 结果建立了S-T.Student基本表 -- 关系数据库系统发现搜索路径中第一个模式名为S-T -- 就把该模式作为基本表Student所属的模式
2.数据库
1.数据库的创建
- 创建一:
CREATE DATABASE <数据库名称> 例:创建一个学生选课管理系统数据库 CREATE DATABASE SCSMS;
3.模式
1.模式的创建
- 1.模式实际上指一个目录或命名空间
- 2.定义模式实际定义了一个命名空间
- 定义一:
CREATE SCHEMA <模式名> AUTHORIZATION <用户名> 例:为用户WANG定义一个学生-课程模式S-T CREATE SCHEMA "S-T" AUTHORIZATION WANG;
- 说明:
- 1.
CREATE SCHEMA
后面跟着一个名字,把这样的一个模式(S-T
)授权给某一个用户(WANG
)- 定义二:
CREATE SCHEMA AUTHORIZATION <用户名> 例:不指定模式名: CREATE SCHEMA AUTHORIZATION WANG
- 说明:
- 1.该句没有指定<模式名>,<模式名>隐含为<用户名>
- 2.
CREATE SCHEMA
之后就可以创建在这个模式下所包含的其他数据库对象,例如基本表,视图,索引等- 定义三:
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>[<表定义子句>|><视图定义子句>|<授权定义子句>] 例:为用户ZHANG创建了一个模式TEST,并且在其中定义一个表TAB1 CREATE SCHEMA TEST AUTHORIZATION ZHANG CREATE TABLE TAB1 ( COL1 SMALLINT COL2 INT COL3 CHAR(20) COL4 NUMERIC(10,3) COL5 DECIMAL(5,2) );
- 说明:
- 1.可以在创建模式的同时用
CREATE SCHEMA
来创建表,视图等这些对象- 2.
CREATE SCHEMA
中可以接受CREATE TABLE,CREATE VIEW
和GRANT
子句
2.模式的删除
- 1.模式的删除有两种方式(在后面删除各种对象时,也有这两个选项)
- 1.
CASCADE
级联- 2.
RESTRICT
限制- 2.
CASCADE
级联
- 1.表示删除模式的同时把该模式中所有的数据库对象全部删除,而不需要逐一的问询删除
- 3.
RESTRICT
限制
- 1.表示如果该模式中定义了下属的数据库对象(如表,视图等),则拒绝删除语句的执行
- 2.仅当该模式中没有任何下属的对象时才能执行
DROP SCHEMA <模式名> <CASCADE|RESTRICT> 例:DROP SCHEMA WANG CASCADE; 删除该模式同时该模式中定义的表TAB1也被删除 例:DROP SCHEMA WANG RESTRICT 因为存在表TAB1,所以拒绝删除语句的执行
4.数据表
1.基本表的创建
CREATE TABLE <表名> (<列名><数据类型>[<列级完整性约束条件>] [,<列名><数据类型>[<列级完整性约束条件>]] ... [,<表级完整性约束条件>]);
- 说明:
- 1.<表名>:所要定义的基本表的名字
- 2.<列名>:组成该表的各个属性(列)
- 3.<列级完整性约束条件>:涉及相应属性列的完整性约束条件
- 4.<表级完整性约束条件>:涉及一个或多个属性列的完整性约束条件
- 注意
- 如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级
例:建立“学生”表Student。学号是主码,姓名取值唯一 CREATE TABLE Student (Sno CHAR(9) PRIMARY KEY, Sname CHAR(20) UNIQUE, Ssex CHAR(2), Sage SMALLINT, Sdept CHAR(20) );
- 说明:
- 1.
Sno CHAR(9)
表示学号,字符型,宽度为9,- 2.
PRIMARY KEY
是一个列级完整性约束条件,表示Sno
是主码,姓名,字符型,宽度为20- 3.
UNIQUE
是一个列级完整性约束条件,表示Sname
取唯一值,性别,字符型,宽度为2- 4.年龄,短整型
- 5.学生所在系,字符型,宽度为20
例:建立一个"课程"表Course CREATE TABLE Course (Cno CHAR(20) PRIMARY KEY, Cname CHAR(40), Cpno CHAR(4), Ccredit SMALLINT, FOREIGN KEY (Cpno) REFERENCES Course(Cno) );
- 说明:
- 1.
FOREIGN KEY (Cpno) REFERENCES Course(Cno)
是一个表级完整性约束,表示Cpno
这个字段是一个外码,它参照的是课程表Course
的Cno
,被参照表是Course
,被参照列是Cno
例:建立一个学生选课表SC CREATE TABLE SC (Sno CHAR(9), Cno CHAR(4), Grade SMALLINT PRIMARY KEY(Sno,Cno) FOREIGN KEY(Sno) REFERENCES Student(Sno) FOREIGN KEY(Cno) REFERENCES Course(Cno) );
- 说明:
- 1.该学生选课表
SC
有三个表级的完整性约束条件- 2.一个是
PRIMARY KEY(Sno,Cno)
,由于该表的主码由两个属性构成,所以只能作为表级完整性进行定义- 3.另一个是
FOREIGN KEY(Sno) REFERENCES Student(Sno)
,表示Sno是外码,被参照表是Student- 4.最后一个是
FOREIGN KEY(Cno) REFERENCES Course(Cno)
外码约束条件,表示Cno是外码,被参照表是Course执行
CREATE TABLE
语句后:
- 1.有关表的定义,约束条件定义等等翻译成内部表存储在系统的数据字典中
- 2.在数据库中为基本表分配了(预留)存储空间
SQL中的数据类型
2.基本表的修改
修改:
ALTER TABLE <表名> [ADD[COLUMN]<新列名><数据结构><完整性约束>] [ADD<表级完整性约束>] [DROP[COLUMN]<列名>[CASCADE|RESTRICT]] [DROP CONSTRAINT<完整性约束名>[RESTRICT|CASCADE]] [ALTER COLUMN <列名><数据类型>];
说明:
- 1.<表名>是要修改的基本表
- 2.
ADD
子句用于增加新列,新的列级完整性约束条件和新的表级完整性约束条件- 3.
DROP COLUMN
子句用于删除表中的列
- 1.如果指定了
CASCADE
短语,则自动删除引用了该列的其他对象- 2.如果指定了
RESTRICT
短语,则如果该列被其他对象引用,关系数据库管理系统将拒绝删除该列- 4.
DROP CONSTRAINT
子句用于删除指定的完整性约束条件- 5.
ALTER COLUMN
子句用于修改原有的列定义,包括修改列名和数据类型- 6.不管基本表中原来是否已有数据,新增加的一列一律为空值
例:向Student表增加"入学时间"列,其数据类型为日期型 ALTER TABLE Student ADD S_entrance DATE;
例:将年龄的数据类型由字符类型(假设原来的数据类型是字符型)改为整数 ALTER TABLE Student ALTER COLUMN Sage INT;
例:增加课程名称必须取唯一值的约束条件 ALTER TABLE Course ADD UNIQUE(Cname);
3.基本表的删除
- 删除:
DROP TABLE <表名> [RESTRICT|CASCADE];
- 说明:
1.
RESTRICT
:删除表是有限制的
- 1.欲删除的基本表不能被其他表的约束所引用
- 2.如在这个表上建立过视图或索引
- 3.如果存在依赖该表的对象,则此表不能被删除
例:删除Student表 DROP TABLE Student RESTRICT;
2.
CASCADE
:删除该表没有限制
- 1.在删除基本表的同时,相关的依赖对象一起删除
- 2.基本表定义被删除,数据被删除
- 3.表上建立的索引,视图,触发器等全部被删除
例:删除Student表 DROP TABLE Student CASCADE;
例:若表上建有视图,选择RESTRICT时表不能删除;选择CASCADE时可以删除表,视图也自动删除 CREATE VIEW IS_Student AS SELECT Sno,Sname,Sage FROM Student WHERE Sdetp=‘IS';
DROP TABLE Student RESTRICT; --ERROR:cannot drop table Student because other objects depend on it
DROP TABLE Student CASCADE; --NOTICE:drop cascades to view IS_Student
SELECT * FROM IS_Student; --ERROR:relation "IS_Student" does not exist
5.索引
1.索引的建立
CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名> (<列名>[<次序>][,<列名>[<次序>]]...);
- 1.建立索引的目的:加快查询速度
- 2.关系数据库管理系统中的常见索引
- 1.顺序文件上的索引
- 2.B+树索引
- 3.散列(hash)索引
- 4.位图索引
- 3.谁可以建立索引
- 1.数据库管理员或建立表的人
- 谁维护索引
- 1.关系数据库管理系统自动完成
- 5.使用索引
- 1.关系数据库管理系统自动选择合适地索引作为存取路径,用户不必也不能显示地选择索引
- 说明:
- 1.其中有两个选项
[UNIQUE] [CLUSTER]
也可以没有选项,没有选项就是普通的索引- 2.
UNIQUE
:此索引的每一个索引值只对应唯一的数据记录- 3.
CLUSTER
:表示要建立的索引是聚簇索引,是将索引对象按索引项上的值是否相同来进行聚类存储- 4.<表名>:要建索引的基本表的名字
- 5.索引:可以建立在该表的一列或多列上,各列名之间用逗号分隔
- 6.<次序>:指定索引值的排列次序
- 1.升序:
ASC
- 2.降序:
DESC
- 3.缺省值(默认值):
ASC
例:为学生-课程数据库中的Student,Course,SC三个表建立索引 Student表按学号升序建唯一索引 Course表按课程号升序建唯一索引 SC表按学号升序和课程号降序建唯一索引 CREATE UNIQUE INDEX Stusno ON Student(Sno); CREATE UNIQUE INDEX Coucno ON Course(Cno); CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);
- 说明:
- 1.这三个字段都是在码字段上建唯一索引
- 2.它的功效和定义它为
PRIMAY KEY
是一样的,一个字段上如果定义了它是PRIMARY KEY
,那么为了维护实体完整性,系统会自动的为这个字段建立唯一索引
2.索引的修改
ALTER INDEX <旧索引名> RENAME TO <新索引名> 例:将SC表的SCno索引名改为SCSno ALTER INDEX SCno RENAME TO SCSno;
3.索引的删除
DROP INDEX <索引名>; 例:删除Student表的Stusname索引 DROP INDEX Stusname;
- 说明:
- 1.删除索引时,系统会从数据字典中删去有关该索引的描述
- 2.删除索引不会影响基本表的数据,也不会影响基本信息的丢失,所以它不需要
RESTRICT
和CASCADE
这两个选项
6.数据字典
- 1.数据字典是关系数据库系统内部的一组系统表,它记录了数据库中的所有定义信息:
- 1.关系模式定义
- 2.视图定义
- 3.索引定义
- 4.完整性约束定义
- 5.各类用户对数据库的操作权限
- 6.统计信息
- 2.关系数据库管理系统在执行
SQL
的数据定义语句时,实际上就是在更新数据字典表中的相应信息
1.查询的语句格式
SELECT [ALL|DISTINCT] <目标列表达式> [,<目标表达式>] ... FROM <表名或视图名>[,<表名或视图名>] ... |(SELECT 语句)[AS]<别名> [WHERE<条件表达式>] [GROUP BY <列名1>[HAVING <表达式>]] [ORDER BY<列名>[ASC|DESC]]
- 说明
- 1.
SELECT
子句:指定要显示地属性列- 2.
ALL
:表示显示查询所有的结果,有重复值- 3.
DISTINCT
:表示显示去掉有重复值的查询结果,无重复值- 4.
FROM
子句:指定查询对象(基本表或视图)- 5.
WHERE
子句:指定查询条件- 6.
GROUP BY
子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数- 7.
HAVING
短语:只有满足指定条件的组才予以输出- 8.
ORDER BY
子句:对查询结果表按指定列值的升序或降序排序- 9.
SELECT,FROM,WHERE
是最基本的结构- 10.
GROUP BY
和HAVING
是一块,是对中间结构进行分组,计算分组的聚集结果,然后在进行筛选- 11.
ORDER BY
是对结构做排序的一个说明
2.单表查询
例:查询全体学生的学号与姓名 SELECT Sno,Sname FROM Student
例:查询全体学生的姓名,学号,所在系 SELECT Sname,Sno,Sdept FROM Student
例:查询全体学生的详细记录 SELECT Sno,Sname,Ssex,Sage,Sdept FROM Student; 或 SELECT * FROM Student;
- 1.指查询仅涉及一个表,可选择表中的若干列或选择表中的若干元组
- 2.可使用
ORDER BY
子句进行排序或使用聚集函数
计算分组的聚集结果,及其使用GROUP BY
子句按照某些字段进行分组- 说明:
- 1.可以选出指定的属性列:即在
SELECT
关键字后面直接给出属性列的名称,不同的属性列名用逗号隔开- 2.可以选定全部属性列:即在
SELECT
关键字后面直接给出所有属性列的名称,不同的属性列名用逗号
隔开或者直接将<目标列表达式
>指定为*
1.表达式
例:查询全体学生的姓名,出生年月和所在的院系,要求用小写字母表示系名 SELECT Sname,’Year of Birth:’,2014-Sage,LOWER(Sdept) FROM Student;
例:查找全体学生的姓名及其出生年份 SELECT Sname,2018-Sage FROM Student;
- 1.可以查询经过计算的值,即
SELECT
子句的<目标列表达式
>不仅可以表示为表中的属性列,也可以是表达式- 说明:
- 1.
Year of Birth
:是一个常量,将其作为列来对待,用英文的’…'将内容标注起来- 2.
LOWER(Sdept)
:表示把Sdept
用小写字母的形式来显示出来- 3.
UPPER(Sdept)
:表示把Sdept
用大写字母的形式来显示出来
2.别名
SELECT Sname NAME,’Year of Birth:’ BIRTH,2014-Sage BIRTHDAY,UPPER(Sdept) DEPARTMENT FROM Student
- 1.对于含有上述常量函数名的目标列表达式,用户可以通过指定
别名
来改变查询结果的列标题- 2.使用列别名改变查询结果的列标题时,别名在列名之后跟上就行,中间用空格隔开
3.去除值重复的行
例:查询选修了课程的学生学号 SELECT Sno FROM SC; 等价于: SELECT ALL Sno FROM SC;
例:查询选修了课程的学生学号,去掉重复值 SELECT DISTINCT Sno FROM SC;
- 1.在却省的情况下,
SELECT
结果是不续存的- 2.如果没有指定
DISTINCT
关键词,则缺省为ALL
,表示出现一次显示一次,有重复值- 说明:
- 1.把
SC
中选修课程的所有学号都列出来- 2.一个学生如果选修了几门课程,那么他的学号就会出现几次,所以就会造成相同的学号重复出现
- 3.指定
DISTINCT
关键词,去掉表中重复的行
4.查询满足条件的元组
1.比较
例:查询计算机科学系全体学生的名单 SELECT Sname FROM Student WHERE Sdept = 'CS';
例:查询所有年龄在18岁以上的学生姓名及其年龄 SELECT Sname,Sage FROM Student WHERE Sage > 18;
例:查询考试成绩有不及格的学生的学号 SELECT DISTINCT Sno FROM SC WHERE Grade < 60;
- 说明:
- 同一个学生有可能有多门课不及格,所以加上
DISTINCT
去掉重复的学号
2.确定范围
例:查询年龄在19~23岁(包括19岁和23岁)之间的学生的姓名,系别和年龄 SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 19 AND 23;
例:查询年龄不在19~23岁之间的学生姓名,系别和年龄 SELECT Sname,Sdept,Sage FROM Student WHERE Sage NOT BETWEEN 19 AND 23;
- 1.
BETWEEN ... AND ...
- 2.
NOT BETWEEN ... AND ...
- 3.表示数值在某一个范围之内和不在某一个范围之内
3.确定集合
例:查询计算机科学系(CS),数学系(MA)和信息系(IS)学生的姓名和性别 SELECT Sname,Ssex FROM Student WHERE Sdept IN('CS','MA','IS');
例:查询既不是计算机科学系,数学系,也不是信息系的学生的姓名和性别 SELECT Sname,Ssex FROM Student WHERE Sdept NOT IN ('IS' , 'CS');
- 1.
IN <值表>
:表示属于该集合- 2.
NOT IN <值表>
:表示不属于该集合- 注意: 值表中的值需要用英文
''
标注
4.字符匹配
[NOT] LIKE '<匹配串>' [ESCAPE '<换码字符>']
- 1.
LIKE
:表示字符匹配- 2.
NOT LIKE
:表示字符不匹配- 说明:
- 1.最重要的是<
匹配串
>,<匹配串
>可以是一个完整的字符串,也可以含有通配符%
和_
- 2.
通配符%
(百分号):代表任意长度(长度可以为0)的字符串- 3.
通配符_
(下划线): 代表任意单个字符例:a%b表示以a开头,以b结尾的任意长度的字符串 例:a_b表示以a开头,以b结尾的长度为3的任意字符串 例:查询学号为201215121的学生的详细情况 SELECT * FROM Student WHERE Sno LIKE '201215121'; 等价于: SELECT * FROM Student WHERE Sno = '201215121';
- 说明:
- 1.因为在这里没有包含任何的通配符,所以可以用等号来代替
- 2.<
匹配串
>需要用英文的''
标注例:查询所有姓刘学生的姓名,学号和性别 SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE '刘%';
- 说明:
- 第一个字母是刘,之后任意长度
例:查询姓“欧阳”且全名为三个汉字的学生的姓名 SELECT Sname FROM Student WHERE Sname LIKE ’欧阳__‘;
- 说明:
- 1.一个汉字和字母所需的
_
(下划线)一样- 2.匹配串前面和中间:一个下划线代表一个汉字,且不能带空格
- 3.匹配串后面出现:一个下划线代表一个汉字;两个下划(中间无空格)代表一个汉字或两个汉字,两个下划线(中间有空格)代表一个汉字
- NOT LIKE 和 LIKE 相反
例:查询名字中第二个字为“阳”字的学生的姓名和学号 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 '\';
5.空值
某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。 例:查询缺少成绩的学生的学号和相应的课程号 SELECT Sno,Cno FROM SC WHERE Grade IS NULL;
- 1.
IS NULL
: 表示空值,不知道或不确定的值- 2.
IS NOT NULL
: 表示不是空值,不知道或不确定的值- 3.
IS
不能用=
代替例:查询所有有成绩的学生学号和课程号 SELECT Sno,Cno FROM SC WHERE Grade IS NOT NULL;
6.多重条件(逻辑运算)
例:查询计算机系年龄在20岁以下的学生姓名 SELECT Sname FROM Student WHERE Sdept = 'CS' AND Sage < 20;
- 1.逻辑运算符:**
AND
和OR
**来连接多个查询条件- 2.
AND
的优先级高于OR
- 3.可以用括号改变优先级
例:查询计算机科学系(CS),数学系和信息系(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';
7.ORDER BY子句
例:查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列 SELECT Sno,Grade FROM SC WHERE Cno = '3' ORDER BY Grade DESC;
- 1.可以按一个或多个属性列排序
- 1.升序:
ASC
- 2.降序:
DESC
- 3.缺省值为升序
- 2.对于空值,排序时显示的次序由具体系统实现来决定
例:查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列 SELECT * FROM Student ORDER BY Sdept ,Sage DESC;
- 说明:
- 1.
Sdept
是第一排序字段- 2.
Sage
是第二排序字段- 3.在系相同的情况下再按照年龄来排序
- 4.不同的排序字段中间用逗号隔开
8.聚集函数
例:查询学生总人数 SELECT COUNT(*) 学生总人数 FROM Student;
- 1.所谓聚集函数就是要做一些统计,对一个集合整体性质的描述
- 2.聚聚函数通常是和
GROUP BY
结合起来使用,如果没有GROUP BY
语句对表做分组的话,那就是对整个表整体进行计算- 3.常见聚集函数:
- 1.统计元组个数:
COUNT(*)
- 2.统计一列值的个数:
COUNT([DISTINCT|ALL] <列名>)
- 3.计算一列值的总和(此列必须为数值型):
SUM([DISTINCT|ALL] <列名>)
- 4.计算一列值的平均值(此列必须为数值型):
AVG([DISTINCT|ALL] <列名>)
- 5.求一列中的最大值和最小值:
- 1.
MAX([DISTINCT|ALL] <列名>)
- 2.
MIN([DISTINCT|ALL] <列名>)
查询选修了课程的学生人数 SELECT COUNT(DISTINCT Sno) FROM SC;
查询有多少条选课记录 SELECT COUNT(ALL Sno) FROM SC;
例:计算1号课程的学生平均成绩 SELECT AVG(Grade) FROM SC WHERE Cno = '1';
例:查询选修1号课程的学生最高分数 SELECT MAS(Grade) 最高分 FROM SC WHERE Cno = '1';
例:查询学生201215121选修课程的总学分数 SELECT SUM(Credit) 总学分 FROM SC,Course WHERE Sno = '201215012' AND SC.Cno = Course.Cno;
- 说明:
- 1.这里用到一个多表查询,其中
SC
表和Course
的连接条件是课程号相同- 2.因为学生的选课涉及SC表,课程的学分涉及Course表,所以需要SC,Course
9.GROUP BY子句
例:求各个课程号及相应的选课人数 SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno;
- 分组: 细化聚集函数的作用对象
- 1.如果未对查询结果分组,聚集函数将作用于整个查询结果
- 2.对查询结果分组后,聚集函数将分别作用于每个组
- 3.按指定的一列或多列值分组,值相等的为一组
- 说明:
- 1.查询对象是
SC
,按照课程号进行分组,把选修了同一门课程的放到一组- 2.然后统计下一各组的学生,也就是每门课程的选课人数
例:查询选修了3门以上课程的学生学号 SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*) > 3;
- 说明:
- 1.查询对象是
SC
,按照学号进行分组,把每个学生选修的课程放到一组- 2.统计一下每组的个数,即每个学生选的课程门数,把超过3门课程的学生选出来
- 3.
COUNT(*) > 3
只能放在HAVING
语句中而不能放在WHERE
语句中例:查询平均成绩大于等于90分的学生学号和平均成绩 下面语句是错误的: SELECT Sno,AVG(Grade) FROM SC WHERE AVG(Grade) >= 90 GROUP BY Sno; 下面语句是正确的: SELECT Sno,AVG(AVG) FROM SC GROUP BY Sno HAVING AVG(Grade) >= 90;
- 说明:
- 1.条件表达式只能放在
HAVING
语句中而不能放在WHERE
语句中- 2.因为
WHERE
子句中是不能用聚集函数作为条件表达式- 3.
WHERE
是对记录的描述,而不是对分组的描述
10.HAVING短语与WHERE子句的区别
- 作用对象不同:
- 1.
WHRER
子句作用于基表或视图,从中选择满足条件的元组;- 2.
HAVING
短语作用于组,从中选择满足条件的组
3.多表查询
一般格式: [<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2> [<表名1>.]<列名1> BETWEEN [<表名2>]<列名2> AND [<表名2>.]<列名3>
- 1.指同时涉及两个以上的表的查询
- 2.连接条件或连接谓词:用来连接两个表的条件
- 3.连接字段: 连接谓词中的列名称,连接条件中的各连接字段类型必须是可比的,但名字不必相同
1.等值与非等值连接查询
- 等值连接:连接运算符为 =
例:查询每个学生及其选修课程的情况 SELECT Student.*,SC.* FROM Student,SC WHERE Student.Sno = SC.Sno
- 说明:
Student.Sno
和SC.Sno
是重复的,可以在SELECT
语句中显示的把相关的属性列列出来(自然连接),即可消去重复列例:上述例子用自然连接完成 SELECT Student.Sno,Sname,Ssex,Sage,Sdept,S_entrsnce,DB_Design,Cno,Grade FROM Student,SC WHERE Student.Sno = SC.Sno;
- 说明:
- 在
SELECT
中的Sno
必须要加上Student
这个前缀表示保留下来的是Student
表中的Sno
,由于SC
表中也有Sno
,尽管值是一样的,但系统并不清楚,为防止歧义必须说明是那一个表的Sno
2.连接操作的执行有3种方法
- 1.嵌套循环法(NESTED-LOOP)
- 1.首先在
表1
中找到第一个元组,然后从头开始扫描表2
,逐一查找满足条件的元组,找到后就将表1
中的第一个元组与该元组拼接起来,形成结果表中一个元组- 2.
表2
全部查找完后,再找表1
中的第二个元组,然后再从头开始扫描表2
,逐一查找满足条件的元组,找到后就将表1
中的第二个元组与该元组拼接起来,形成结果表中一个元组- 3.重复上述操作,直到
表1
中的全部元组都处理- 2.排序合并法(SORT-MERGE)
- 1.常用于 = 连接
- 2.首先按连接属性对
表1
和表2
排序- 3.对
表1
的第一个元组,从头开始扫描表2
,顺序查找满足连接条件的元组,找到后就将表1
中的第一个元组与该元组与该元组拼接起来,形成结果表中一个元组。当遇到表2
中第一条大于表1
连接字段值的元组时,对表2
的查询不再继续- 4.找到
表1
的第二条元组,然后从刚才的中断点出继续顺序扫描表2
,查找满足连接条件的元组,找到后就将表1
中的一个元组与该元组拼接起来,形成结果表中一个元组。直到遇到表2
中大于表1
连接字段值的元组时,对表2
的查询不再继续- 重复上述操作,直到
表1
或表2
中的全部元组处理完毕为止- 3.索引连接(INDEX-JOIN)
- 1.对
表2
按连接字段建立索引- 2.对
表1
中的每个元组,依次根据其连接字段值查询表2
的索引,从中找到满足条件的元组,找到后就将表1
中的第一个元组与该元组拼接起来,形成结果表中一个元组例:查询选修2号课程且成绩在90分以上的所有学生的学号和姓名 SELECT Student.Sno,Sname FROM Student,SC WHERE Student.Sno = Sno.Sno AND SC.Cno = '2' AND SC.Grade > 90;
- 说明:
- 1.一条
SQL
语句可以同时完成选择和连接查询,这时WHERE
子句是由连接谓词和选择谓词组成的复合条件- 2.执行过程
- 1.先从
SC
中挑选出Cno = '2'
并且Grade > 90
的元组形成一个中间关系- 2.再和
Student
中满足连接条件的元组进行连接得到最终的结果关系
3.自身连接
例:查询每一门课的间接先修课(即先修课的先修课) SELECT DISTINCT FIRST.Cno,SECOND.Cpno FROM Course AS FIRST,Course AS SECOND WHERE FIRST.Cpno = SECOND.Cno;
- 1.一个表与其自己进行连接
- 2.需要给表起别名以示区别
- 3.由于所有属性名都是同名属性,因此必须使用别名前缀
- 4.别名的语法格式:
SELECT [ALL|DISTINCT] 列名1 [AS] 列别名1 [,列名2 [AS] 列别名2 ...] FROM 表名1 [AS] 表别名1,表名2 [AS] 表别名2
- 说明
- 1.分别用
FIRST
和SECOND
作为两张表的别名- 2.在第一张表的后面输入空格,然后
FIRST
表示它的的别名- 3.在第二张表的后面输入空格,然后
SECOND
表示它的别名- 4.在
SELECT
语句中列出FIRST.Cno
与SECOND.Cpno
表示出某一门课与它的间接先修课的名称
4.外连接
- 1.外连接与普通连接的区别
- 普通连接操作只输出满足连接条件的元组
- 外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出
- 2.左外连接:
- 列出左边关系中所以的元组
- 3.右外连接
- 列出右边关系中所以的元组
- 4.外连接表示的方法:
- 1.在
FROM
子句中显示地说明要做外连接,关键词
是OUT JOIN
- 1.左外连接是:
LEFT OUT JOIN
- 2.右外连接是:
RIGHT OUTER JOIN
- 3.全外连接是:
FULLO
改写UTER JOIN
例:查询每个学生及其选修课程的情况 SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student LEFT OUT JOIN SC ON (Student.Sno = SC.Sno);
4.嵌套查询
SELECT Sname FROM Student WHERE Sno IN( SELECT Sno FROM SC WHERE Cno = '2' );
- 1.查询块:一个
SELECT-FROM-WHRER
语句称为一个查询块- 2.将一个查询块嵌套在另一个查询块的
WHERE
子句或HAVING
短语中的查询- 3.上层的查询块称为外层查询或父查询
- 4.下层查询称为内层查询或子查询
- 5.
SQL
语言允许多层嵌套查询,即一个子查询中还可以嵌套其他子查询- 6.子查询的限制
- 1.不能使用
ORDER BY
子句,因为ORDER BY
是对最终结果排序的,所以它只能出现在外层的主查询中- 7.不相关子查询:子查询的查询条件不依赖于父查询
- 由里向外,逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立父查询的查找条件
- 8.相关子查询:子查询的查询条件依赖于父查询
- 通过某些属性将外层和内层查询关联起来,这样就不能先直接独立的处理内层查询,执行的过程是
- 1.首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若
WHERE
子句返回值为真,则取此元组放入结果表- 2.然后再取外层表的下一个元组
- 3.重复这一过程,直至外层表全部检查完为止
1.带有IN谓词的子查询
例:查询与'刘成'在同一个系学习的学生,此查询要求可以分步来完成 1.确定'刘成'所在系名 SELECT Sdept FROM Student WHERE Sname = '刘成'; 结果为:CS 2.查找所有在CS系学习的学生 SELECT Sno,Sname,Sdept FROM Student WHERE Sdept = 'CS'; 3.将第一步查询嵌入到第二步查询的条件中 SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN ( SELECT Sdept FROM Student WHERE Sname = '刘成' );
- 说明
- 1.此查询为不相关子查询
- 2.父查询中列出学号,姓名和学生所在的系,由于不知道学生在哪个系学习,所以在
WHERE
条件中使用运算符IN
后面把刘成所在的系通过子查询得到,而刘成所在的系的查询并不依赖于父查询的任何输入,可以独立的执行
此查询结果为CS,只有一个元素的集合,这里也可以用等号来代替,但如果刘成不止在一个系学习,那么用等号来代替就可能会出现语法错误- 1.不相关子查询可以转换为连接查询
- 2.上述查询也可以转换为用自身连接完成查询要求,学生与学生自己进行连接
SELECT S1.Sno,S1.Sname,S1,Sdept FROM Student S1,Student S2 WHERE S1.Sdpt = S2.Sdept AND S2.Sname = '刘成';
例:查询选修了课程名为'信息系统'的学生学号和姓名 SELECT Sno,Sname FROM Student WHERE Sno IN (SELECT Sno FROM SC WHERE Cno IN (SELECT Cno FROM Course WHERE Cname = '信息系统' ) ); # 这个查询涉及三张表Student,SC,Course # 但是条件是Cname等于信息系统 # 首先在Course关系中找出’信息系统‘的课程号,为3号 # 然后在SC关系中找出选修了3号课程的学生学号 # 最后在Student关系中取出Sno和Sname # 所以是一个三层嵌套 SELECT Sno,Sname FROM Student,SC,Course WHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno AND Course.Cname = '信息系统';
2.带有ANY(SOME)或ALL谓词的子查询
# 例:查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄 SELECT Sname,Sage FROM Student WHERE Sage < ANY(SELECT Sage FROM Student WHERE Sdept = 'CS') AND Sdept <> 'CS';
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';
4.带有EXISTS谓词的子查询
- 1.
EXISTS
代表存在量词
- 2.带有
EXISTS
谓词的子查询不返回任何数据,只产生逻辑真值true
或逻辑假值false
- 3.若内层查询结果非空,则外层的
WHERE
子句返回真值- 4.若内层查询结果为空,则外层的
WHERE
子句返回假值- 5.由
EXISTS
引出的子查询,其目标列表达式通常都用*
,因为带EXISTS
的子查询只返回真值或假值,给出列名无实际意义
NOT EXISTS
谓词
- 1.若内层查询结果非空,则外层的
WHERE
子句返回假值- 若内层查询结果为空,则外层的
WHERE
子句返回真值例:查询选修了1号课程的学生姓名 # 查询涉及Studen和SC关系 # 在Student中依次取每个元组的Sno值,用此值取检查SC表 # 若SC中存在这样的元组,其Sno值等于此Student.Sno值,并且其Cno = '1',则取此Student.Sname送入结果表 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');
5.集合查询:
1.并操作UNION
2.交操作INTERSECT
3.差运算EXCEPT
6.基于派生表的查询