利用工具进行数据库数据的复杂查询利用工具进行数据库数据的复杂查询利用工具进行数据库数据的复杂查询利用工具进行数据库数据的复杂查询天津钢管公司王保安 摘要:数据库应用系统中数据的复杂查询问题,长期困扰着使用者和开发者。本文通过具体问题,论述了实现复杂查询的方法,同时论证了各种方法的特点及适用范围。 关键词:查询动态数据窗口 当今数据库技术已成为计算机应用的核心技术,可以认为当今任何计算机信息系统和计算机应用系统都与数据库的应用分不开,数据库已成为其核心和基础。建立数据库应用系统是要充分利用数据库中的数据。对数据库中的数据进行的操作除增加(Insert)、更改(update)和删除(delete)外,最常用,也是重要的是查询操作。即便是最简单的数据库应用系统,也离不开查询功能,查询可以说是进行数据管理的重要手段,不过也是数据库应用系统开发过程中较困难、花时间、有一定难度的部分。 1。问题的描述 某单位根据上级部门的要求建立人员信息管理应用系统,它是人事管理信息系统(PersonnelManagementInformationSystem)的子系统。人员信息管理系统是对人员所有信息的全面管理,包括:基本信息、培训或进修信息、履历信息、工资变动信息、离退信息、家庭成员及社会关系信息等等。根据中共中央组织部颁布的全国组织、干部、人事管理信息系统信息结构体系的要求,对人员的信息描述共有43个信息集(对应43张表),426个数据项,本文根据数据库设计的要求进行加工,只列出3张表(table)。 1)表名:基本信息编码:personnel 主码字段编码数据类型长度字段名称 personnelidchar9人员代码 namevarchar20姓名 sexchar1性别 birthdaydatetime出生日期 nativeplacechar6籍贯 nationalitychar2民族 marriagechar1婚姻状况 workdaydatetime参加工作时间 partychar2政治面貌 graduatonchar2学历 departmentchar30所在单位 identificationchar15身份证号 culfieldchar6培训专业 (2)表名:工资变动信息编码:wages 主码外码字段编码数据类型长度字段名称 personnelidchar9人员代码 saidchar3人员内码 changedaydatetime工资变动日期 safilenumchar3工资变动文件 salarymoney工资 3)表名:离退信息编码:retirement 主码外码字段编码数据类型长度字段名称 personnelidchar9人员代码 retdaydatetime离退日期 relstylechar2离退类别 paymoney离退休费 commenttext离退说明 表名:性别编码:GB2261 字段编码数据类型长度字段名称 codechar2代码 commentchar4内容 表中数据: codecomment 男性 女性 这些代码表一旦建立,表中数据对应用来讲是相对不变的,所以称为静态表。在需要的时候,静态表的数据可以修改,一般放在维护中进行。 当这些静态表建成后,可得到完善的人员信息管理系统的数据模型,如图1所示。(略) 2。使用SQL语句 SQL(StructuredQueryLanguage)语言是1974年由Boyce和Chamberlin提出的,并在IBM公司SanJoseResearchLaboratory研制的SystemR上实现了这种语言。由于它功能丰富,语言简洁,使用方式灵活而倍受青睐,并扎根于计算机工业界及计算机用户。 SQL是集数据操纵(DataManipulation)、数据定义(DataDefinition)与数据 控制(DataControl)为一体的关系数据语言。查询是数据操纵语言中最主要的部分。从SQL的英文名称:结构化的查询语言,即能看出SQL在查询中的贡献,可以说数据库查询语句是SQL语言的核心。 SQL查询语句只使用命令动词,SELECT 一般格式:SELECT〈目标列〉 FROM〈基本表(或视图)〉 WHERE〈条件表达式〉 GROUPBY〈列名1〉HAVING〈内部函数表达式〉 ORDERBY〈列名2〉ASCDESC 格式说明:〈〉中的内容为根据需要的具体内容;中的内容为可选项。 SELECTDISTINCTretirement。personnelid,name,sex, birthday,workday,retirement。pay FROMpersonnel,retirement WHEREpersonnel。personnelidretirement。personnelid 执行后得到下列列表,显示所需信息: personnelidnamesexbirthdayworkdaypay 13安静21935050419541113457。30 但这种方法要求操作者对数据库的结构有充分的了解,例此数据库有多少个表,有多少个数据项,这些数据项分别属于哪一个表等。显然,这是数据库管理员的工作范畴。对用户,即使了解SQL语法,也只能完成简单的查询,对复杂的查询工作简直是望尘莫及了。也就是说单单是SQL语句,并不能很好地完成数据库的复杂查询,必须要与其他技术配合使用。另外,使用SQL语句进行查询,只能直接反映每一列的信息,而我们的43张基本表是尽可能地保存代码以保证数据的规范且节约存储空间。也就是说,我们能得到准确的查询结果,但得到地却是整篇的代码(例上表中的sex列),这对开发者和使用者都难以接受。如果能够将整篇的代码自动转换成所表达的文字,那当然是再好不过了。 3。借助PowerBuilder实现综合信息的查询 目前,随着工具软件的发展和广泛采用,使数据库应用系统的开发如虎添翼,其中PowerBuilder以其独特的数据窗口(DataWindow)倍受欢迎。 PowerBuider是美国著名的数据库应用开发工具生产厂家Powersoft公司于1991年6月推出的功能强大、性能优异的开发工具,它是一种面向对象的、具有可视图形界面的、快速的交互开发工具。智能化的数据窗口对象是其精华所在。利用此对象可以操作关系数据库的数据而无需写入SQL语句,即可以直接检索、更新和用多种形式表现数据源中的数据。但要注意,必须使数据窗口成为窗口(Window)下数据窗口控制的一个连接对象,数据窗口才能使用户在应用执行期间访问数据库中的数据。 用这种方法实现查询优点突出,例:通过设置数据窗口中对应列的编辑风格( EditStyles)为相应的下拉式数据窗口(DropDownDataWindow),使显示的元组文字化。注意,这要事先建好下拉式数据窗口。设置数据窗口中对应列的编辑风格同样可满足其它显示需要。利用数据窗口的风格特点:查询表的列宽、列序可自由改变,甚至可以覆盖掉一些列,以达到更满足查询显示的需要。 4。动态查询的实现 在某些实际的应用系统开发中,由于用户在开发前提不出查询的需求,而在系统运行中希望能够对所有的数据项任意组合进行查询,以满足来自多方的需求,实现动态地查询(即随机地从43张表中选择数据项进行组合作为查询条件并任意地选择数据项作为显示条目)。对于此类查询的实现要利用PowerBuilder通过编程的方式在运行时动态地创建数据窗口,并动态地控制数据窗口。 动态地创建一个数据窗口,应用程序需要执行下列任务: 动态地构造SQL语句。 用符合数据窗口语法的字符串,为现在的数据窗口控制创建一个数据窗口对象。具体实现如下: 1)动态地生成SQL语句,根据SQL的语法:SELECTstringa FROMstringb WHEREstringc 在实现的过程中:为贴近实际应用,习惯上,先输入查询条件,再输入显示条目。即在输入查询条件后,生成strinc2,stringb,stringc1;然后,再在输入显示条目后生成stringa,并修改stringc1,stringb。最后形成SQL语法: strselectstringafromstringbwherestringclstringc2 2)在现在的事物对象里利用相关的SyntaxFromSQL()函数生成符合数据窗口语法的字符串: expsyntaxfromsq1(sq1ca,str,strsty,error)生成数据窗口的源代码 其中:strsty为数据窗口的显示风格,例: 3)创建数据窗口对象 dwque。create(exp) 这样就实现了用户要求的随机查询。 在真实系统中,用户在输入查询条件时希望通过选项方式录入查询信息,由于库表中存放的大量信息为代码,这就需要在程序中先把录入的文字信息转化成相应的代码再连接到查询条件中。为简化输入,提高准确性,可采用代码输入,即动态地嵌套下拉式数据窗口。在显示查询结果的数据窗口中,事先不能嵌套下拉式数据窗口,可预先做一个函数,在程序运行中根据所选的列把代码转化成所对应的汉字显示,这样更完善了用户要求的随机查询。 根据数据窗口的动态特性,对于那些运行时才能确定的数据窗口采用动态方式创建,使应用程序能更灵活地满足用户的需求。 5。小结 使用SQL语句是查询操作的基础,但如何根据查询的要求自动的构造最贴切的SQL语句是问题的关键。利用PowerBuilder中的数据窗口使问题简化,如何通过嵌入动态生成的SQL语句动态地生成数据窗口是解决问题的根本。将查询条件的输入实现多级菜单选择将查询结果文字化,使复杂查询问题解决得更完善。动态查询的方法,不仅能应用于人事管理信息系统,同时也是解决其他需要复杂查询的数据库应用系统的途径。这种动态查询方法的在数据库应用系统的使用,避免了应用系统开发中开发者冥思苦想所有可能的查询条件,而系统运行中用户总遇到有些查询要求无法满足的矛盾。动态查询的实现,缩短了开发周期,减少了产品维护的工作。