数据库系统实验课知识点讲解——江叶春1.数据库基本概念2.几种键的概念3.数据完整性约束4.DDL和DML5.JOIN6.GroupBy和聚集函数7.数据库设计8.多重性约束9.ER模型向关系模型的映射10.规范化一、数据库基本概念数据库:长期存储在计算机内、有组织、可共享的大量数据的集合。数据库管理系统:位于用户与操作系统之间的一层数据管理软件。数据库系统:计算机引入数据库后的系统,一般由数据库、数据库管理系统、应用系统、数据库管理员构成。二、几种键的概念事实上,关系模型不允许表格包含有重复记录。所以,一个表格里字段或者列的值必须是唯一的。唯一性可以通过检查key(关键字)来确定,关键字可以由一个单列或者列的组合构成,这样的列叫做compositekey(复合关键字)。关键字有很多不同的类型:studentNo(PK)ID(AK)namePhoneaddresscourseNo(FK)a)超关键字(SuperKey):又称超键或超码,是能够唯一标识关系中每个元组的一个或一组属性的集合。超关键字能够唯一标识关系中的每个元组,但超关键字中可能包含多余属性,而人们一般对能够唯一标识元组的最小属性集合感兴趣,由此产生了候选关键字的概念。b)候选关键字(CandidateKey):又称候选键或候选码,它本身是超关键字但其任何子集都不是超关键字。或者说候选关键字是能够唯一标识关系中每个元组的一个或一组最小属性的集合。一个关系中也可能会有多个候选关键字。c)主关键字(PrimaryKey):又称主键或主码,是被选为唯一标识关系中各元组的候选关键字。d)辅关键字(AlternateKey):又称辅键或辅码或备选键,是没有被选为主关键字的候选关键字。e)外关键字(ForeignKey):又称外键或外码,设F为关系R中的某个属性或属性组,F可能不是关系R的候选键,但如果F与关系S(关系S与R可以是同一个关系)的主键PKs相对应(F取值与PKs取值相一致),则称F是关系R的外键。这里列出来的关键字的类型并不是相互排斥的;一个关键字可以同时被归入多个类。从定义上说,每个表格必须至少有一个主关键字。三、数据完整性约束(1)实体完整性实体完整性约束要求基本关系的所有主关键字属性都不能为空,而不是主关键字整体不能为空。例如,对于学生选课关系(学号,课程号,成绩),显然,学号与课程号的组合“学号,课程号”为主键,按照实体完整性的要求,学号和课程号两个属性中的任何一个都不能出现空的现象。根据定义,主关键字是能唯一标识元组的最小属性集合,这就意味着主关键字的任何子集都不能唯一标识元组。如果允许主关键字的某个属性为空,这就暗示了唯一标识元组并不需要所有主关键字属性,这与主关键字的定义相矛盾。这也说明了关系模型实体完整性的约束是合理的。(2)参照完整性如果一个关系中存在某个外关键字,则该外关键字属性的取值应该与它所引用的主关系中的对应属性取值一致,或者为空。其实我们前面在介绍外关键字概念的时候,已经说明了这个问题。换言之,关系模型的参照完整性约束是通过外关键字来体现的。(3)用户定义完整性任何关系数据库系统都应该支持实体完整性和参照完整性,除此之外,不同的数据库系统根据其应用环境和领域的不同,可能还需要一些特殊的约束条件,用户定义完整性也称企业约束,就是为了满足这些特殊约束条件而定义的,它是让用户根据具体应用环境和领域来指定数据所需要满足的附件约束。用户定义完整性由数据库的用户根据数据库使用环境和领域所指定的附加规则。例如,学生关系模式Student(学号,姓名,身份证号,年龄,性别,学院编号,入学年份)中,根据应用环境要求,还可能要求学号属性必须为8位数字,或者要求年龄不能超过30岁等等。这些约束条件都是用户根据具体应用环境而附加的规则。关系模型应该向用户提供定义这类完整性约束的机制和方法,并能够按照用户定义的完整性约束条件对数据进行检验。不过,各种具体DBMS对用户定义完整性的支持程度可能因系统而异,有时需要应用程序和DBMS共同来保证用户定义完整性。四、DDL和DML1.DDL(数据定义语言):对结构进行的操作。比如create,drop,alter等。2.DML(数据操纵语言):对具体的数据进行的操作。比如update,delete,insert等。五、JOIN基本操作Join操作基本分为4大类:1.θ连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括、=、=、、!、!和。2.等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。不需要同名属性,可以使用using或on子句来指定连接条件。3.自然连接:同名属性的等值连接,故无须自己添加连接条件,并删除连接表中的重复列。4.外连接:返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接或左连接))、右表(右外连接或右连接)或两个边接表(全外连接)中的所有数据行。leftjoin(左联接)返回包括左表中的所有记录和右表中联结字段相等的记录;rightjoin(右联接)返回包括右表中的所有记录和左表中联结字段相等的记录。1)左连接2)右连接3)全连接)Join操作的共性:第一步均为将所有参与操作的表进行了一个笛卡儿积,然后才依据各连接条件进行记录的筛选SQLselect*fromemployees;NAMEDEPARTMENT_IDSALARYGetz103000Davis201500King202200Davis305000Kochhar5000SQLselect*fromdepartments;DEPARTMENT_NAMEDEPARTMENT_ID10Sales20Marketing30Accounts40Administration----------------------Innerjoin----------------等值连接:不需要同名属性,可以使用using或on子句来指定连接条件,包括其中的重复列。SQLselect*fromemployeeseinnerjoindepartmentsdone.department_id=d.department_id;SQLselect*fromemployeese,departmentsdWheree.department_id=d.department_id;说明:内连接与自然连接基本相同,不同之处在于自然连接只能是同名属性的等值连接,而内连接可以使用using或on子句来指定连接条件--------------------------Naturaljoin-----------------------------SQLselect*fromemployeesnaturaljoindepartments;说明:自然连接是通过对参与表关系中所有同名的属性对取等(即相等比较)来完成的,故无须自己添加连接条件与外连接的区别在于对于无法匹配的记录外连接会虚拟一条与之匹配的记录来保全连接表中的所有记录,但自然连接不会------------------Leftouterjoin----------------SQLselect*fromemployeeseleftouterjoindepartmentsdone.department_id=d.department_id;---------------------------Rightouterjoin------------------------SQLselect*fromemployeesrightouterjoindepartmentsusing(department_id);--------------------------------Fulljoin----------------------------SQLselect*fromemployeesfulljoindepartmentsusing(department_id);说明:[1]外连接必须使用on或using子句提供相应的连接条件[2]不能为using子句中所列举的列指定表别名,即使在groupby和select子句中也是如此[3]外连接规则:左连右补,右连左补,全连左右合并如:对表departments表进行右连接时,在两表完成笛卡儿积后再依据连接条件using(department_id)来筛选两表中department_id值相同的记录,但对DEPARTMENT_ID=40,employees表中没有与之匹配的记录,按常理此DEPARTMENT_ID=40所对应的记录将被抛弃,但就是为了保全连接表(departments表)中的所有记录就必须在employees表中虚拟出一条与之匹配的记录来保全连接表的所有记录,当然这条虚拟的记录显示时值全为null。六、聚集函数和GroupByAVG函数返回数值列的平均值。NULL值不包括在计算中。COUNT(column_name)函数返回指定列的值的数目(NULL不计入);COUNT(*)函数返回表中的记录数;COUNT(DISTINCTcolumn_name)函数返回指定列的不同值的数目;FIRST()函数返回指定的字段中第一个记录的值。(提示:可使用ORDERBY语句对记录进行排序。)MAX函数返回一列中的最大值。NULL值不包括在计算中。(MIN和MAX也可用于文本列,以获得按字母顺序排列的最高或最低值。)SUM函数返回数值列的总数(总额)。GROUPBY语句用于结合合计函数,根据一个或多个列对结果集进行分组。在SQL中增加HAVING子句原因是,WHERE关键字无法与合计函数一起使用。groupby有一个原则,就是select后面的所有列中,没有使用聚集函数的列,必须出现在groupby后面。七、数据库设计一般情况下,数据库设计包含三个主要阶段,它们分别是:概念设计、逻辑设计和物理设计。这三个设计阶段中的每个阶段将产生不同的结果模型,具有不同的用途和目的。1)概念设计概念设计是根据企业的目标,针对所设计系统中的数据需求建立模型的过程,它是数据库设计的第一个阶段,也是整个数据库设计的关键。在此阶段,通过对用户需求进行综合、归纳与抽象,形成一个独立于所有物理因素的模型,并且完全独立于实现细节,例如,数据库系统在实现中将采用的DBMS软件、应用程序结构、编程语言、硬件平台或其它任何实现上的考虑。概念设计的目的是充分挖掘系统对数据的需求,并进行归纳和抽象,在此基础上所建立的模型应该容易为设计人员和用户所理解,从而为设计人员和用户之间提供一个交流的桥梁,同时,该模型应该能够较准确表达用户需求,减少二义性。目前常用的模型是实体-联系(Entity-Relationship,ER)模型,后面将详细介绍这种模型。概念设计的结果将得到概念数据模型,通常为ER模型,它将是数据库设计下一阶段,即逻辑设计的信息来源。因此,在概念数据模型建立过程中,模型应该被测试并验证是否满足用户的需求。2)逻辑设计逻辑设计是将概念设计阶段所得到的概念数据模型转化为目标DBMS所支持的数据模型的过程。逻辑设计仍然与所有的物理因素无关,但它是针对特定数据模型进行设计的,建立在目标DBMS所支持的数据模型的基础之上。也就是说,逻辑设计是在知道目标DBMS所支持的基本数据模型的条件下进行设计的。因此,在建立逻辑模型之前,应该先确定最终的目标DBMS所支持的数据模型,例如,关系模型、层次模型、网状模型或者面向对象模型等,针对目标DBMS所支持的模型不同,概念模型转化所得到的逻辑模型结果也不相同。当前广泛应用的DBMS大部分都支持关系模型,因此,本书后面只重点讨论如何把概念模型转化为关系模型。逻辑设计的目的是根据目标DBMS所支持的数据模型的特点,把概念数据模型所表达的信息转化为用目标DBMS所支持的数据模型进行表达和描述。在逻辑设计阶段得到的数据模型应该容易为设计人员