零基础学SQL
上QQ阅读APP看书,第一时间看更新

4.1 数据库中的表

在关系数据库中,数据表是存储数据的基本单元,由行和列两部分组成。它是根据数据库设计阶段的E-R图转换而来。在数据表中除了行、列、数据记录、属性、字段等基本概念外,还会涉及主键、外键、索引、约束等概念。这些概念在数据表的设计和创建的过程中会经常用到,本节就对这些概念做一个简单的介绍。

4.1.1 数据记录、属性、字段、列和行

在关系数据库中,数据表是存储数据的基本单元,由行和列两部分组成。其中,行用来描述实体中的具体数据,在数据表中每一行中的数据被称为一条数据记录,也可以简称为记录;字段是表中的一列,用来保存数据表中某一条记录中的特定信息。字段在关系数据库中也可以称为列。

表4.1 学生信息表

例如,在表4.1中,字段stuID用来表示学生编号,字段stuName用来表示学生的姓名,字段age用来表示学生的年龄。每一列包含了一个特定字段的全部信息,例如数据表中基于字段stuName的列就包含了学生姓名的信息,这一列中的学生姓名信息包括赵亮、王海、张明、郑茹;学生信息表中的每一行都描述了一个学生的基本信息,例如数据表中第一行对应的数据s102203、赵亮、23就是一条数据记录,在这条记录中包含有学生编号、学生姓名以及学生年龄等几个字段,它们都是用来表示学生编号为s102203学生的基本信息的。

4.1.2 主键

为了保证在一张数据表中不会出现两个完全相同的数据记录,需要为每一张数据表都定义一个主键。主键作为数据表中的唯一标示,保证了一条记录的唯一性。通过主键可以区分数据表中的每一条记录。在创建数据表时,需要保证被定义为主键的列的列值唯一,并且不能为空值(即NULL值)。

主键在关系模型中用来约束实体完整性。所谓实体完整性约束,是指对数据表中行的完整性约束。在实体完整性中,需要有一个主键来唯一标示数据表中每一行的数据记录,数据表中的主键唯一且不能为空值。

例如,在表4.1中,学生编号字段stuID就是这张表的主键,每一个主键对应其中一名学生,在学生信息表中主键对应的值不能为空,更不会重复出现,也就是说不能出现两个stuID是s102203的学生信息。

表4.2 学生成绩表

当然,主键列并不一定就只有一列,也可以将多个列组合在一起作为表的主键。例如在表4.2中,有3个列,列stuID用来表示学生编号,列curID用来表示课程编号,列result用来表示学生成绩。从这几条记录中可以看到,其中的任何一列单独拿出来,都不可能作为主键唯一标示一条学生的成绩信息。如果想要唯一地标示一条学生的记录信息,需要将列stuID和列curID共同作为学生成绩表的主键,这样才能唯一地标示一条学生的成绩信息。

注意 主键可以定义在多个列上,并不一定只定义在一个列上。也就是说,在定义数据表的时候,可以将数据表中的多个列合在一起作为该表的主键。

4.1.3 外键

外键是用来定义表与表之间的关系的。在数据表中,外键是这样定义的:如果属性列F是关系B中一个属性(并不是关系B的主键),并且属性列F是关系A中的主键,则F就是关系B的外键。关系A中的表被称为主表,关系B中的表被称为主表的从表。

外键在关系模型中用来约束参照完整性。所谓参照完整性约束,是指表与表之间的约束。在参照完整性中,从表中的每一条数据记录中的外键值都必须存在于主表中。对于建立了关联关系的两个数据表来说,对其中一个数据表的增加、修改或者删除数据的操作都会对另一个数据表中的记录产生影响。

例如,在表4.1和表4.2中,列stuID和列curID两个列联合作为该表的主键。则列stuID就是学生成绩表的外键。其中,表4.1是主表,表4.2是主表的从表。例如,如果想向学生成绩表中插入一条学生成绩记录,数据库管理系统首先会对学生信息表进行检查,看这个学生是否在学生信息表中存在,如果存在,才会允许执行插入操作;如果该名学生在学生信息表中不存在,则执行插入操作时,数据库管理系统会报错,拒绝执行插入操作。

同样,定义了外键约束的两个表在数据修改和数据删除操作时也会存在一些限制。有关定义了外键约束的两个表之间进行增加、修改和删除数据的操作,可以参看12.1.2、13.1.2和14.1.2节中介绍的内容。

4.1.4 索引

在实际应用中,为了加快访问速度,节省访问时间,一般都需要使用索引进行查询。例如,在使用电话簿查询电话时,为了减少查询的时间,一般都会使用电话簿中提供的企业名称作为索引来查询;在使用一本书学习某一部分知识的时候,一般都需要翻看书后提供的索引,一般书后的索引都会以字母顺序将相关的主题信息列出,通过这个索引的指引,读者可以很快查找到想要的信息,而不需要为了查询某一个知识点而将书中所有的内容都翻看一遍,节省了查阅的时间,也保证了学习效率。

数据库中的索引与书后提供的索引的功能相同,在数据库的应用中,往往一张数据表中会包含上千条甚至上万条记录,因此为了加快对数据表的访问,通常需要在数据表中建立适当的索引。通过建立索引,在查询数据表中的数据时,数据库可以很快地将其找到,而不用扫描整个数据表。

索引是一个指向数据表中数据的指针,指向索引字段在数据表中的物理位置。如果在执行查询操作时,WHERE子句中指定的字段是被设置为索引的字段,则数据库会首先在索引中对指定的值进行查询,并返回查询的数据在数据表中的位置。如果在执行查询操作时,WHERE子句中指定的字段没有设置为索引的字段,那么数据库会对查询数据表中的每一行数据记录进行扫描。因此适当地创建索引,可以加快数据的检索速度,提高对数据的访问效率,提供数据查询的性能。

当然,索引本身也有一些弊端,例如,索引会占用大量的硬盘空间;随着数据列的增加,创建和维护索引的时间也会随之增加;在对数据进行增加、删除和修改等更新操作的时候,需要对索引进行维护,降低更新数据的速度。因此,对那些不是在查询过程中经常用到的列以及在数据表中经常需要进行增加、删除和修改等更新操作的列就不适合建立索引。

虽然创建索引可以提高查询的速度,但是由于索引本身会占用物理空间以及维护索引可能带来的时间的损耗,所以在为数据表中的列创建索引时,并不是为数据表中的每一个列都要创建索引,那样做反而不会起到提高查询效率的作用。因此需要在数据表的适当的列上创建索引。一般可以在下面这些列中创建索引。

❑在主键列中创建索引。

❑多表连接时,在经常使用的连接列上创建索引。

❑在经常使用WHERE子句查询的列上创建索引。

❑在经常进行分组(GROUP BY)和排序(OREDR BY)的列上创建索引。

4.1.5 约束

为了保证数据的完整性,需要使用数据库约束。完整性约束包括对表的约束和对列的约束。表约束主要包括唯一约束、主键约束、外键约束和检查约束,列约束除了包括唯一约束、参照约束和检查约束之外,还有非空约束。

❑唯一约束(UNIQUE):保证使用唯一约束的某一列或者一组列中没有相同的值,即保证列的值的唯一性。但是唯一约束中可以允许在列中插入空值(即NULL值)。

❑主键约束(PRIMARY KEY):保证使用主键约束的列中只能有唯一的值,并且不能包含空值。数据表中每一列只能定义一个PRIMARY KEY。

❑外键约束(FOREIGN KEY):保证表的参照完整性。确保对一个表的数据操作不会对与之关联的表造成不利的影响。

❑检查约束(CHECK):限制列的取值范围或者取值条件。可以为一个列定义多个CHECK约束。

❑非空约束(NOT NULL):只用来约束列。在向该列插入数据时不允许插入空值。