第5章数据检索与查询文件
知识导入大海捞针——高效的数据检索小南选修了一门通识课——信息与情报检索。在课堂上,老师让小南用网络搜索引擎检索了几个关键词,分别统计了它们的检索时长。小南平时经常使用网络检索功能,却从来没想过,在浩如烟海的网络数据中,如何才能在零点几秒的时间内,从整个Internet世界中找到那几个关键的字眼呢?小南隐隐约约地觉得,一定是谷歌这种搜索引擎在数据库的检索上使用了特殊的方法。
用户建立数据库的目的就是为了存储和提取信息,信息提取的关键在于方便快速地查询数据。因此,查询便成了数据库操作的主要内容。除了直接的查询操作外,对数据的追加、更新、删除等操作也常常要首先找到需要处理的数据,所以,这些操作也通常以查询为基础。本章将介绍如何使用Access 2016提供的查询工具检索数据。
5.1数据检索方法〖1〗5.1.1检索时长是否与N无关数据检索——把数据库中存储的数据根据用户的需求提取出来,数据检索的结果会生成一个数据表,既可以放回数据库,也可以作为进一步处理的对象。
在人类的常识中,数据总量N越大,要从中检索到需要的信息,需要的时间越长。检索的时间复杂度O(N),永远是一个以N为自变量的函数。如果N→∞,那么O(N)→∞但如果是这样的话,要在Google中检索一个关键词,检索范围是整个Internet,那么检索的时长或许将是无穷无尽的。这显然让人无法忍受。因此我们要想办法,让检索的时间复杂度O(N)等于一个与N无关的常量。第5章数据检索与查询文件数据库系统设计(Access 2016版)1. 顺序检索
一个无序数据列N中,找到目标数据66。如果进行顺序检索,需要将N个数据一一查找,才能保证找到所有的66,如图51所示。
图51顺序检索
O(N)=N
如果N→∞,那么O(N)→∞
2. 折半检索
对于一个有序序列,可以采用折半查找的检索策略,每次从数据列的中间位置开始比对,比较中间值与目标值的大小,就可以一次排除掉一半数据,再用剩下的一半数据进行折半检索。这也是经典算法分治算法的典型思想,如图52所示。
图52折半检索
O(N)=log2N
如果N→∞,那么O(N)→∞
这种检索方法大大降低了时间复杂度,尤其是N值很大的时候,这种降低愈加明显。但遗憾的是,当N趋于无穷时,log2N仍然趋于无穷。
3. 索引检索
索引(Index)是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。我们在设计数据库的物理结构时,曾为某些数据字段设置过索引。主键索引是无重复索引,也有些其他字段是有重复索引。索引就能将检索的时间复杂度O(N)变成一个与N无关的常量。
在表中使用索引就如同在书中使用目录一样: 要想查找某些特定的数据,先在索引中查找数据的位置。为一个字段创建的索引会生成一个索引序列,这个序列存储在数据库的索引文件中。一个字段的索引序列在逻辑上可以表示为一个有两列的表,分别存储索引内容和地址指针,如图53所示。
图53设置索引和索引文件
当我们要检索“01”号系的学生时,不用直接去检索学生表,只要找到系号字段的索引序列就行了。可以按照索引中“01”系号后面的地址指针,直接找到这个系学生在数据硬盘中的位置。要知道,一个真正运行的商业数据库往往存储了海量的数据,经常整个内存都放不下一张表,动辄就对数据表检索是非常浪费时间和空间的,不亚于大海捞针,而索引文件往往都非常小,并且索引是一个有序序列,可以使用折半查找,检索起来很容易。O(N)=1
如果N→∞,O(N)→1扩展阅读: 数据库索引
思考
如果数据量实在太大呢?就连数据库的目录——索引文件都大到无法装入内存?那就为索引文件建立索引,称为二级索引,甚至三级索引,四级索引……索引文件有几级,那就查找几次,即便N趋于无穷,索引文件的级数也仅仅是一个常量罢了。
5.1.2索引不是万能的1. 索引的优势(1) 通过创建无重复索引,可以保证数据库表中每一行数据的唯一性。
(2) 大大加快数据的检索速度。
(3) 可以加速表和表之间的连接,特别是在实现数据的参照完整性方面特别有意义。
2. 索引的劣势
(1) 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
(2) 索引需要占物理空间,当数据量不大的时候,谈论索引是毫无意义的。
(3) 对表中的数据进行增加、删除和修改的时候,索引也要动态维护,降低操作速度。
数据量小的时候建立索引毫无必要,为所有字段建立索引也不明智,通常应该为主键、外键和经常需要搜索的列创建索引。
5.2Access 2016的数据检索
问题导入
使用Access 2016提供的筛选器、选择、高级筛选等工具可以对表格中的特定数据进行筛选。那是不是就不需要其他的检索方式了呢?
虽然使用这些工具可以找到所需要的记录,但最主要的问题是,筛选是一种实时的屏幕交互式操作,随着筛选结果的输出,筛选的操作也就结束了,整个过程不能以文件的形式存储在数据库磁盘上,如果下次要执行同样的或类似的筛选任务,只能将这一操作过程一一重现。如果需要反复查找大量数据,就要不断重复筛选操作,这显然非常烦琐而浪费,并且无法将其开发成应用程序发布给用户使用。
为了便于用户在数据库中检索自己需要的数据,Access 2016提供了一种能以文件形式存储的检索工具——查询文件。
5.2.1什么是查询文件
所谓查询就是找到用户所需数据库子集的过程。Access 2016根据用户定义的查询条件,在数据库中的一张或多张表中检索出满足条件的一组记录,这些记录只显示用户指定的所需字段。因此,用户建立查询时可以定义需要显示的字段及筛选条件,当运行查询时,只有那些指定的字段和符合筛选条件的记录才被检索出来。Access 2016在磁盘上建立一个查询文件来存储这些检索需求。不论何时运行这个查询文件,Access 2016都根据文件中保存的需求将相关数据组合起来建立一个动态数据集,也就是查询结果。这个动态数据集看起来像一张表,但它不是真正的表,不存储在数据库磁盘上,只在内存中临时存储和显示。当用户关闭这个动态数据集后,内存中的存储就可以清除了。因为这个动态数据集(查询结果)来源于数据库中的数据,当数据源发生改变后,再运行查询文件,查询结果就发生改变;反过来,当用户修改查询结果中的数据,查询结果从内存写回数据库磁盘时,同样也会改变数据源。
实际上,用户在前台运行了查询文件后,DBMS自动在后台按照查询文件中的查询要求生成一条查询命令,该命令用数据库标准语言SQL写成,再通过执行这条SQL命令来实现查询操作。
Access 2016中的查询一旦生成,可以作为窗体、报表,甚至是另一个查询的数据源。查询过程如图54所示。
图54数据库查询
5.2.2查询文件的分类
为了完成上述查询功能,Access 2016主要提供了两种查询方式,一种是屏幕操作方式,通过建立查询文件的可视化图55数据库查询方式
方法存储查询条件;另一种是程序方式,通过直接书写SQL命令的方式实现查询,如图55所示。
本章着重介绍第一种方式即查询文件。SQL的语法和使用将在第6章介绍。每一个查询文件都能转换成SQL命令来编译执行,但并不是所有直接书写的SQL命令都能用查询文件显示。
Access 2016的查询文件有多种形式,包括选择查询、参数查询、操作查询(动作查询)、交叉表查询、重复项查询、不匹配查询等。总结起来有4大类: 选择查询、参数查询、操作查询和特殊用途查询。具体的分类和功能说明如表51所示。表51Access 2016查询文件类型
查 询 类 型查 询 方 式功 能 说 明举例选择查询选择查询最基本的查询方式,指定记录和字段并对查询结果排序、分组、统计汇总查询学生表中男生的学号和姓名,并按姓名升序排列参数查询参数查询执行查询时提供参数的输入接口,实现用户交互式查询,本质上也是选择查询按用户输入的系号查找学生信息操作查询生成表查询查询结果生成一张新的基本表用学生表中的男生记录生成新数据表学生1追加查询将查询结果插入至另一张基本表将学生表中的所有女生记录插入学生1表更新查询对查询结果进行更新,存入原基本表给102号课成绩80分以下的学生每人加5分删除查询将查询结果从数据源中删除删除大学英语的选课记录特殊用途查询交叉表查询用交叉表的形式组织查询结果,本质上也是一种选择查询横纵字段名分别为学号和课程号,交叉位置显示成绩重复项查询查找指定字段的重复项统计每个系的人数不匹配项查询在一张表中查询和另一张表不相关的记录查找没有人选修的课程注意
Access 2016提供了两种方法建立查询,一种是使用“查询向导”,另一种是使用“查询设计”视图(查询设计器)建立查询。查询向导可以按照一定的模式引领用户创建查询,实现基本的查询操作,不需要使用者具备过多的数据库查询知识,最简单易行。但向导的功能比较单一,要想完成丰富多变的查询任务,必须使用“查询设计”视图。
5.2.3查询的视图