数据库基础知识

    科技2022-08-17  113

    数据库

    一、数据库系统1、相关概念2、重点知识点 二、关系数据库1、相关概念2、重要知识点 三、SQL1、相关概念2、重要知识点 四、权限管理1、相关概念和知识 五、范式1、相关概念和知识点2、三范式详解 六、SQL语句总结1、常用关键词及解释2、样例 七、附加知识1、存储过程2、索引3、悲观锁4、乐观锁5、数据库的完整性约束6、事务特性

    一、数据库系统

    1、相关概念

    Data:数据,是数据库中存储的基本对象,是描述事物的符号记录。Database:数据库,是长期储存在计算机内、有组织的、可共享的大量数据的集合。DBMS:数据库管理系统,是位于用户与操作系统之间的一层数据管理软件,用于科学地组织、存储和管理数据、高效地获取和维护数据。DBS:数据库系统,指在计算机系统中引入数据库后的系统,一般由数据库、数据库管理系统、应用系统、数据库管理员(DBA)构成。数据模型:是用来抽象、表示和处理现实世界中的数据和信息的工具,是对现实世界的模拟,是数据库系统的核心和基础;其组成元素有数据结构、数据操作和完整性约束。包括概念模型和逻辑模型。常用的数据模型:层次模型、网状模型、面向对象模型、对象关系模型、关系模型。概念模型:也称信息模型,是按用户的观点来对数据和信息建模,主要用于数据库设计。(现实世界中对象的抽象)逻辑模型:是按计算机系统的观点对数据建模,用于DBMS 实现。(E-R图)物理模型:是对数据最底层的抽象,描述数据在系统内部的表示方式和存取方法,在磁盘或磁带上的存储方式和存取方法,是面向计算机系统的。实体和属性:客观存在并可相互区别的事物称为实体。实体所具有的某一特性称为属性。E-R 图:即实体-关系图,用于描述现实世界的事物及其相互关系,是数据库概念模型设计的主要工具。 实例用方框,联系用菱形,属性用椭圆。关系模式:从用户观点看,关系模式是由一组关系组成,每个关系的数据结构是一张规范化的二维表。型/值:型是对某一类数据的结构和属性的说明;值是型的一个具体赋值,是型的实例。数据库的三级系统结构:外模式、模式和内模式。模式:是对数据库中全体数据的逻辑结构(数据项的名字、类型、取值范围等)和特征(数据之间的联系以及数据有关的安全性、完整性要求)的描述。内模式:又称为存储模式,是对数据库物理结构和存储方式的描述,是数据在数据库内部的表示方式。一个数据库只有一个内模式。外模式:又称为子模式或用户模式,它是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图。通常是模式的子集。一个数据库可有多个外模式。数据库的二级映像:外模式/模式映像、模式/内模式映像。

    2、重点知识点

    数据库系统由数据库、数据库管理系统、应用系统和数据库管理员构成。

    数据模型的组成要素是:数据结构、数据操作、完整性约束条件。

    实体型之间的联系分为一对一、一对多和多对多三种类型。

    常见的数据模型包括:关系、层次、网状、面向对象、对象关系映射等几种。

    关系模型的完整性约束包括:实体完整性、参照完整性和用户定义完整性。

    阐述数据库三级模式、二级映象的含义及作用。 数据库三级模式反映的是数据的三个抽象层次: 模式是对数据库中全体数据的逻辑结构和特征的描述。内模式又称为存储模式,是对数据库物理结构和存储方式的描述。外模式又称为子模式或用户模式,是对特定数据库用户相关的局部数据的逻辑结构和特征的描述。

    数据库三级模式通过二级映象在 DBMS 内部实现这三个抽象层次的联系和转换。外模式面向应用程序, 通过外模式/模式映象与逻辑模式建立联系, 实现数据的逻辑独立性。 模式/内模式映象建立模式与内模式之间的一对一映射, 实现数据的物理独立性。

    二、关系数据库

    1、相关概念

    主键: 能够唯一地标识一个元组的属性或属性组称为关系的键或候选键。 若一个关系有多个候选键则可选其一作为主键(Primary key)。外键:如果一个关系的一个或一组属性引用(参照)了另一个关系的主键,则称这个或这组属性为外码或外键(Foreign key)。关系数据库: 依照关系模型建立的数据库称为关系数据库。 它是在某个应用领域的所有关系的集合。关系模式: 简单地说,关系模式就是对关系的型的定义, 包括关系的属性构成、各属性的数据类型、 属性间的依赖、 元组语义及完整性约束等。 关系是关系模式在某一时刻的状态或内容, 关系模型是型, 关系是值, 关系模型是静态的、 稳定的, 而关系是动态的、随时间不断变化的,因为关系操作在不断地更新着数据库中的数据。. 实体完整性:用于标识实体的唯一性。它要求基本关系必须要有一个能够标识元组唯一性的主键,主键不能为空,也不可取重复值。参照完整性: 用于维护实体之间的引用关系。 它要求一个关系的外键要么为空, 要么取与被参照关系对应的主键值,即外键值必须是主键中已存在的值。用户定义的完整性:就是针对某一具体应用的数据必须满足的语义约束。包括非空、 唯一和布尔条件约束三种情况。

    2、重要知识点

    关系数据库语言分为关系代数、关系演算和结构化查询语言三大类。

    关系的 5 种基本操作是选择、投影、并、差、笛卡尔积。

    关系模式是对关系的描述,五元组形式化表示为:R(U,D,DOM,F),其中

    R —— 关系名 U —— 组成该关系的属性名集合 D —— 属性组 U 中属性所来自的域 DOM —— 属性向域的映象集合 F —— 属性间的数据依赖关系集合

    笛卡尔乘积:

    设R是n元关系,S是m元关系,R和S的的笛卡尔积定义为 R×S={(r1,…,rn,s1,…,sm)|(r1,…, rn )∈R∧(s1, …,sm )∈S} 集合A{a1,a2,a3} 集合B{b1,b2} 笛卡尔积 A*B ={(a1,b1),(a1,b2),(a2,b1),(a2,b2),(a3,b1),(a3,b2)}

    选择运算:

    设R是一个n元关系,F是一个形如riθc的公式,其中θ∈{=,≠,>,<,≤,≥} R的选择操作定义为F®={(r1,…,ri ,…,rn )|(r1,…,ri ,…,rn )∈R∧riθc } 即取出符合条件的

    投影运算:

    设R是一个n元关系,R的投影操作定义为 ∏i1,i2,…,im® = {(ri1, …,rim)|(r1 ,…,ri1,…,rim,…,rn)∈R} 从R中选择符合条件的,同时看横行,两横行相同只保留一个

    三、SQL

    1、相关概念

    SQL:结构化查询语言(Structured Query Language)的简称, 是关系数据库的标准语言。SQL 是一种通用的、 功能极强的关系数据库语言, 是对关系数据存取的标准接口, 也是不同数据库系统之间互操作的基础。集数据查询、数据操作、数据定义、和数据控制功能于一体。数据定义:数据定义功能包括模式定义、表定义、视图和索引的定义。嵌套查询:指将一个查询块嵌套在另一个查询块的 WHERE 子句或 HAVING 短语的条件中的查询。

    2、重要知识点

    SQL 数据定义语句的操作对象有:模式、表、视图和索引。SQL 数据定义语句的命令动词是:CREATE、DROP 和 ALTER。RDBMS 中索引一般采用 B+树或 HASH 来实现。索引可以分为唯一索引、非唯一索引和聚簇索引三种类型。SQL 创建表语句的一般格式为CREATE TABLE <表名> ( <列名> <数据类型>[ <列级完整性约束> ] [<列名> <数据类型>[ <列级完整性约束>] ][<表级完整性约束> ] )- <数据类型>可以是数据库系统支持的各种数据类型,包括长度和精度。 - 列级完整性约束为针对单个列(本列)的完整性约束, 包括 PRIMARY KEYREFERENCES 表名(列名)UNIQUENOT NULL 等。 - 表级完整性约束可以是基于表中多列的约束,包括 PRIMARY KEY ( 列名列表)FOREIGN KEY REFERENCES 表名(列名) 等。 SQL 创建索引语句的一般格式为CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名> (<列名列表> )- UNIQUE:表示创建唯一索引,缺省为非唯一索引; - CLUSTER:表示创建聚簇索引,缺省为非聚簇索引; - <列名列表>:一个或逗号分隔的多个列名,每个列名后可跟 ASCDESC,表示升/降序,缺省为升序。多列时则按为多级排序。 SQL 查询语句的一般格式为SELECT [ALLDISTINCT] <算术表达式列表> FROM <表名或视图名列表> [ WHERE <条件表达式 1> ] [ GROUP BY <属性列表 1> [ HAVING <条件表达式 2 > ] ] [ ORDER BY <属性列表 2> [ ASCDESC ] ]- ALLDISTINCT: 缺省为 ALL, 即列出所有查询结果记录, 包括重复记录。DISTINCT 则对重复记录只列出一条。 - 算术表达式列表:一个或多个逗号分隔的算术表达式,表达式由常量(包括数字和字符串)、列名、函数和算术运算符构成。每个表达式后还可跟别名。也可用 *代表查询表中的所有列。 - <表名或视图名列表>: 一个或多个逗号分隔的表或视图名。 表或视图名后可跟别名。 - 条件表达式 1:包含关系或逻辑运算符的表达式,代表查询条件。 - 条件表达式 2:包含关系或逻辑运算符的表达式,代表分组条件。 - <属性列表 1>:一个或逗号分隔的多个列名。 - <属性列表 2>: 一个或逗号分隔的多个列名, 每个列名后可跟 ASCDESC, 表示升/降序,缺省为升序。 SQL 在表中添加、修改或删除列添加: ALTER TABLE <表名> ADD <列名> <数据类型> 修改: ALTER TABLE <表名> ALTER COLUMN <列名> <数据类型> 删除: ALTER TABLE <表名> DROP COLUMN <列名>

    四、权限管理

    1、相关概念和知识

    触发器是用户定义在基本表上的一类由事件驱动的特殊过程。由服务器自动激活, 能执行更为复杂的检查和操作,具有更精细和更强大的数据控制能力。使用 CREATE TRIGGER 命令建立触发器。计算机系统存在技术安全、管理安全和政策法律三类安全性问题。TCSEC/TDI 标准由安全策略、责任、保证和文档四个方面内容构成。常用存取控制方法包括自主存取控制(DAC)和强制存取控制(MAC)两种。自主存取控制(DAC)的 SQL 语句包括 GRANT 和 REVOKE 两个。 用户权限由数据对象和操作类型两部分构成。常见SQL 自主权限控制命令和例子 1) 把对 Student 和 Course 表的全部权限授予所有用户GRANT ALL PRIVILIGES ON TABLE Student, Course TO PUBLIC ; 2)把对 Student 表的查询权和姓名修改权授予用户 U4GRANT SELECTUPDATE(Sname) ON TABLE Student TO U4 ; 3)把对 SC 表的插入权限授予 U5 用户,并允许他传播该权限GRANT INSERT ON TABLE SC TO U5 WITH GRANT OPTION ; 4)把用户 U5 对 SC 表的 INSERT 权限收回,同时收回被他传播出去的授权REVOKE INSERT ON TABLE SC FROM U5 CASCADE ; 5)创建一个角色 R1,并使其对 Student 表具有数据查询和更新权限CREATE ROLE R1 ; GRANT SELECTUPDATE ON TABLE Student TO R1 ; 6)对修改 Student 表结构的操作进行审计AUDIT ALTER ON Student ;

    五、范式

    1、相关概念和知识点

    数据依赖:反映一个关系内部属性与属性之间的约束关系,是现实世界属性间相互联系的抽象,属于数据内在的性质和语义的体现。规范化理论:是用来设计良好的关系模式的基本理论。它通过分解关系模式来消除其中不合适的数据依赖,以解决插入异常、删除异常、更新异常和数据冗余问题。函数依赖:简单地说,对于关系模式的两个属性子集X 和Y,若X 的任一取值能唯一确定Y 的值,则称Y 函数依赖于X,记作X→Y。非平凡函数依赖:对于关系模式的两个属性子集X 和Y,如果X→Y,但Y!⊆X,则称X→Y 为非平凡函数依赖;如果X→Y,但Y⊆X,则称X→Y 为非平凡函数依赖。完全函数依赖:对于关系模式的两个属性子集X 和Y,如果X→Y,并且对于X 的任何一个真子集X’,都没有X’→Y,则称Y 对X 完全函数依赖。范式:指符合某一种级别的关系模式的集合。在设计关系数据库时,根据满足依赖关系要求的不同定义为不同的范式。规范化:指将一个低一级范式的关系模式,通过模式分解转换为若干个高一级范式的关系模式的集合的过程。1NF:若关系模式的所有属性都是不可分的基本数据项,则该关系模式属1NF。2NF:1NF 关系模式如果同时满足每一个非主属性完全函数依赖于码,则该关系模式属于2NF。3NF:若关系模式的每一个非主属性既不部分依赖于码也不传递依赖于码,则该关系模式属于3NF。BCNF:若一个关系模式的每一个决定因素都包含码,则该关系模式属BCNF。数据库设计:是指对于一个给定的应用环境,构造优化的数据库逻辑模式和物理结构,并据此建立数据库及其应用系统,使之能够有效地存储和管理数据,满足各种用户的应用需求,包括信息管理要求和数据操作要求。数据库设计的6 个基本步骤:需求分析,概念结构设计,逻辑结构设计,物理结构设计,数据库实施,数据库运行和维护。概念结构设计:指将需求分析得到的用户需求抽象为信息结构即概念模型的过程。也就是通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS 的概念模型。逻辑结构设计:将概念结构模型(基本E-R 图)转换为某个DBMS 产品所支持的数据模型相符合的逻辑结构,并对其进行优化。物理结构设计:指为一个给定的逻辑数据模型选取一个最适合应用环境的物理结构的过程。包括设计数据库的存储结构与存取方法。抽象:指对实际的人、物、事和概念进行人为处理,抽取所关心的共同特性,忽略非本质的细节,并把这些特性用各种概念精确地加以描述,这些概念组成了某种模型。数据库设计必须遵循结构设计和行为设计相结合的原则。数据字典主要包括数据项、数据结构、数据流、数据存储和处理过程五个部分。三种常用抽象方法是分类、聚集和概括。局部 E-R 图之间的冲突主要表现在属性冲突、命名冲突和结构冲突三个方面。数据库常用的存取方法包括索引方法、聚簇方法和 HASH 方法三种。确定数据存放位置和存储结构需要考虑的因素主要有: 存取时间、 存储空间利用率和维护代价等。

    2、三范式详解

    第一范式(1NF)无重复的列

    第一范式(1NF)中数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值即实体中的某个属性不能有多个值或者不能有重复的属性。 简而言之,第一范式就是无重复的列。 在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。

    第二范式(2NF)属性完全依赖于主键[消除部分子函数依赖]

    满足第二范式(2NF)必须先满足第一范式(1NF)。 第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。 为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。 第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是属性完全依赖于主键。

    第三范式(3NF)属性不依赖于其它非主属性[消除传递依赖]

    满足第三范式(3NF)必须先满足第二范式(2NF)。 简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。 例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。

    具体实例解析 下面列举一个学校的学生系统的实例,以示几个范式的应用。

    在设计数据库表结构之前,我们先确定一下要设计的内容包括那些。学号、学生姓名、年龄、性别、课程、课程学分、系别、学科成绩,系办地址、系办电话等信息。

    为了简单我们暂时只考虑这些字段信息。我们对于这些信息,所关心的问题有如下几个方面。

    1)学生有那些基本信息 2)学生选了那些课,成绩是什么 3)每个课的学分是多少 4)学生属于那个系,系的基本信息是什么。

    第一范式:

    数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。在当前的任何关系数据库管理系统(DBMS)中,不允许你把数据库表的一列再分成二列或多列,因此做出的都是符合第一范式的数据库。

    第二范式:

    把所有这些信息放到一个表中(学号,学生姓名、年龄、性别、课程、课程学分、系别、学科成绩,系办地址、系办电话)下面存在如下的依赖关系。 1)(学号)→ (姓名, 年龄,性别,系别,系办地址、系办电话) 2) (课程名称) → (学分) 3)(学号,课程)→ (学科成绩) 根据依赖关系我们可以把选课关系表SelectCourse 改为如下三个表: 学生:Student(学号,姓名, 年龄,性别,系别,系办地址、系办电话); 课程:Course(课程名称, 学分); 选课关系:SelectCourse(学号, 课程名称, 成绩)。

    若不满足第二范式,会产生如下问题:

    数据冗余: 同一门课程由n 个学生选修,"学分"就重复n-1 次;同一个学生选修了m 门课程,姓名和年龄就重复了m-1 次。 更新异常: 1)若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。 2)假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。 删除异常 : 假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。

    第三范式:

    学生表Student(学号,姓名, 年龄,性别,系别,系办地址、系办电话),关键字为单一关键字"学号",因为存在如下决定关系: (学号)→ (姓名, 年龄,性别,系别,系办地址、系办电话) 但是还存在下面的决定关系 (学号) → (所在学院)→(学院地点, 学院电话) 即存在非关键字段"学院地点"、"学院电话"对关键字段"学号"的传递函数依赖。 它也会存在数据冗余、更新异常、插入异常和删除异常的情况(这里就不具体分析了,参照第二范式中的分析)。 根据第三范式把学生关系表分为如下两个表就可以满足第三范式了: 学生:(学号, 姓名, 年龄, 性别,系别); 系别:(系别, 系办地址、系办电话)。

    六、SQL语句总结

    1、常用关键词及解释

    SELECT 将资料从数据库中的表格内选出,两个关键字:从 (FROM) 数据库中的表格内选出(SELECT)

    SELECT "栏位名" FROM "表格名"

    DISTINCT 在上述 SELECT 关键词后加上一个 DISTINCT 就可以去除选择出来的栏位中的重复,从而完成求得这个表格/栏位内有哪些不同的值的功能。

    SELECT DISTINCT "栏位名" FROM "表格名"

    WHERE 这个关键词可以帮助我们选择性地抓资料,而不是全取出来

    SELECT "栏位名" FROM "表格名" WHERE "条件"

    AND OR 上例中的 WHERE 指令可以被用来由表格中有条件地选取资料。这个条件可能是简单的 ,也可能是复杂的。复杂条件是由二或多个简单条件透过 AND 或是 OR 的连接而成。

    SELECT "栏位名" FROM "表格名" WHERE "简单条件" {[AND|OR] "简单条件"}+

    IN 在 SQL 中,在两个情况下会用到 IN 这个指令;其中之一:与WHERE 有关的那一个情况。在这个用法下,我们事先已知道至少一个我们需要的值,而我们将这些知道的值都放入 IN 这个子句

    SELECT "栏位名" FROM "表格名" WHERE "栏位名" IN ('值一', '值二', ...)

    BETWEEN IN 这个指令可以让我们依照一或数个不连续 (discrete)的值的限制之内抓出资料库中的值,而 BETWEEN 则是让我们可以运用一个范围 (range) 内抓出资料库中的值

    SELECT "栏位名" FROM "表格名" WHERE "栏位名" BETWEEN '值一' AND '值二'

    LIKE LIKE 是另一个在 WHERE 子句中会用到的指令。基本上, LIKE 能让我们依据一个模式(pattern) 来找出我们要的资料

    SELECT "栏位名" FROM "表格名" WHERE "栏位名" LIKE {模式}

    ORDER BY 我们经常需要能够将抓出的资料做一个有系统的显示。这可能是由小往大(ascending) 或是由大往小(descending)。在这种情况下,我们就可以运用 ORDER BY这个指令来达到我们的目的

    SELECT "栏位名" FROM "表格名 [WHERE "条件"] ORDER BY "栏位名" [ASC, DESC]

    函数 函数允许我们能够对这些数字的型态存在的行或者列做运算,包括 AVG (平均)、COUNT(计数)、MAX (最大值)、MIN (最小值)、SUM (总合)。

    SELECT "函数名"("栏位名") FROM "表格名"

    COUNT 统计选中的数量

    SELECT COUNT("栏位名") FROM "表格名"

    GROUP BY GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组

    SELECT "栏位1", SUM("栏位2") FROM "表格名" GROUP BY "栏位1"

    HAVING 对函数产生的值来设定条件

    SELECT "栏位1", SUM("栏位2") FROM "表格名" GROUP BY "栏位1" HAVING (函数条件)

    ALIAS 通过ALIAS 为列名称和表名称指定别名

    SELECT "表格别名"."栏位1" "栏位别名" FROM "表格名" "表格别名"

    2、样例

    有表如下: Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表

    Question

    查询“001”课程比“002”课程成绩高的所有学生的学号select a.S# from (select s#, score, from SC where C#='001') a, (select s#, score, from SC where C#='002') b where a.score > b.score and a.s# = b.s# 查询平均成绩大于60 分的同学的学号和平均成绩select S#, avg(score) from SC group by S# having avg(score)>60 查询所有同学的学号、姓名、选课数、总成绩select Student.S#, Student.Sname, count(SC.C#), sum(SC.score) from student left Outer join SC on Student.S#=SC.S# group by Student.S#, Sname 查询姓“李”的老师的个数select count(distinct(Tname)) from Teacher where Tname like '李%' 查询没学过“叶平”老师课的同学的学号、姓名select Student.S#, Student.Sname from Student where S# not in (select distinct(SC.S#) from SC,Course,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平') 查询学过“001”并且也学过编号“002”课程的同学的学号、姓名select Student.S#, Student.Sname from Student,SC where Student.S#=SC.S# and SC.C#='001'and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#='002') 查询学过“叶平”老师所教的所有课的同学的学号、姓名select Student.S#,Student.Sname from Student where S# in (select S# from SC,Course,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平' group by S# having count(SC.C#)=(select count(C#) from Course,Teacher where Teacher.T#=Course.T# and Tname='叶平')); 查询所有课程成绩小于60 分的同学的学号、姓名select Student.S#,Student.Sname from Student where S# not in (select Student.S# from Student, SC where S.S#=SC.s# and score>60) 查询没有学全所有课的同学的学号、姓名select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# group by Student.S#,Student.Sname having count(C#) < (select count(C#) from Course) 查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名select S#,Sname from Student,SC where Student.S#=SC.S# and C# in (select C# from SC where S#='1001') 删除学习“叶平”老师课的SC 表记录Delete SC from Course, Teacher where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='叶平' 查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分SELECT L.C#,L.score,R.score FROM SC L ,SC R WHERE L.C# = R.C# and L.score = (SELECT MAX(IL.score) FROM SC IL,Student IM WHERE IL.C# = L.C# and IM.S#=IL.S# GROUP BY IL.C#) and R.Score = (SELECT MIN(IR.score) FROM SC IR WHERE IR.C# = R.C# GROUP BY IR.C# ); 查询学生平均成绩及其名次SELECT 1+(SELECT COUNT( distinct 平均成绩) FROM (SELECT S#,AVG(score) 平均成绩 FROM SC GROUP BY S# ) T1 WHERE 平均成绩 > T2.平均成绩) 名次, S# 学生学号,平均成绩 FROM (SELECT S#,AVG(score) 平均成绩 FROM SC GROUP BY S# ) T2 ORDER BY 平均成绩 desc; 查询各科成绩前三名的记录:(不考虑成绩并列情况)SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数 FROM SC t1 WHERE score IN (SELECT TOP 3 score FROM SC WHERE t1.C#= C#

    七、附加知识

    1、存储过程

    定义:存储过程可以说是一个记录集,它是由一些T-SQL 语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),需要时调用即可。

    优点:

    由于数据库执行动作时,是先编译后执行的。然而存储过程是一个编译过的代码块,所以执行效率更高。一个存储过程在程序在网络中交互时可以替代大堆的T-SQL 语句,所以也能降低网络的通信量,提高通信速率。通过存储过程能够使没有权限的用户在控制之下间接地存取数据库,从而确保数据的安全。

    2、索引

    定义:索引是对数据库表中一或多个列的值进行排序的结构,是帮助MySQL 高效获取数据的数据结构。

    可以这样理解:索引就是加快检索表中数据的方法。数据库的索引类似于书籍的索引。在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。

    MySQL 数据库几个基本的索引类型:普通索引、唯一索引、主键索引、全文索引

    索引优点:

    索引加快数据库的检索速度索引降低了插入、删除、修改等维护任务的速度唯一索引可以确保每一行数据的唯一性通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能

    索引需要占物理和数据空间

    3、悲观锁

    在关系数据库管理系统里,悲观并发控制(又名“悲观锁”,Pessimistic ConcurrencyControl,缩写“PCC”)是一种并发控制的方法。它可以阻止一个事务以影响其他用户的方式来修改数据。如果一个事务执行的操作的某行数据应用了锁,那只有当这个事务把锁释放,其他事务才能够执行与该锁冲突的操作。悲观并发控制主要用于数据争用激烈的环境,以及发生并发冲突时使用锁保护数据的成本要低于回滚事务的成本的环境中。

    悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度(悲观),因此,在整个数据处理过程中,将数据处于锁定状态。 悲观锁的实现,往往依靠数据库提供的锁机制 (也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)

    在数据库中,悲观锁的流程如下:

    在对任意记录进行修改前,先尝试为该记录加上排他锁(exclusive locking)。如果加锁失败,说明该记录正在被修改,那么当前查询可能要等待或者抛出异常。 具体响应方式由开发者根据实际需要决定。如果成功加锁,那么就可以对记录做修改,事务完成后就会解锁了。其间如果有其他对该记录做修改或加排他锁的操作,都会等待我们解锁或直接抛出异常。

    优点与不足

    悲观并发控制实际上是“先取锁再访问”的保守策略,为数据处理的安全提供了保证;但是在效率方面,处理加锁的机制会让数据库产生额外的开销,还有增加产生死锁的机会;另外,在只读型事务处理中由于不会产生冲突,也没必要使用锁,这样做只能增加系统负载;还有会降低了并行性,一个事务如果锁定了某行数据,其他事务就必须等待该事务处理完才可以处理那行数。

    4、乐观锁

    在关系数据库管理系统里,乐观并发控制(又名“乐观锁”,Optimistic Concurrency Control,缩写“OCC”)是一种并发控制的方法。它假设多用户并发的事务在处理时不会彼此互相影响,各事务能够在不产生锁的情况下处理各自影响的那部分数据。在提交数据更新之前,每个事务会先检查在该事务读取数据后,有没有其他事务又修改了该数据。如果其他事务有更新的话,正在提交的事务会进行回滚。

    乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。相对于悲观锁,在对数据库进行处理的时候,乐观锁并不会使用数据库提供的锁机制。一般的实现乐观锁的方式就是记录数据版本。

    数据版本,为数据增加的一个版本标识。当读取数据时,将版本标识的值一同读出,数据每更新一次,同时对版本标识进行更新。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的版本标识进行比对,如果数据库表当前版本号与第一次取出来的版本标识值相等,则予以更新,否则认为是过期数据。实现数据版本有两种方式,第一种是使用版本号,第二种是使用时间戳。

    优点与不足

    乐观并发控制相信事务之间的数据竞争(data race)的概率是比较小的,因此尽可能直接做下去,直到提交的时候才去锁定,所以不会产生任何锁和死锁。但如果直接简单这么做,还是有可能会遇到不可预期的结果,例如两个事务都读取了数据库的某一行,经过修改以后写回数据库,这时就遇到了问题。

    5、数据库的完整性约束

    完整性约束:规定了什么样的数据能够存储到数据库系统当中。当写入的数据不满足当前的约束的时候,就不允许写入。防止错误数据的输入和输出造成错误结果和无效操作。

    实体完整性:又称行(元组)的完整性,每个表都有唯一标识符,每一个表中的主键字段不能为空或者重复的值。参照完整性:要求关系中不允许引用不存在的实体。设定相应的更新删除插入规则来更新参考表。用户定义完整性:针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。

    6、事务特性

    原子性:事务要么全部被执行,要么就全部不被执行一致性:事务的执行使得数据库从一种正确状态转换成另一种正确状态隔离性:在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务持久性:事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。
    Processed: 0.024, SQL: 9