多条件查询

2024-10-02

多条件查询(精选7篇)

多条件查询 篇1

多条件查 询 , 又称多条 件检索 (Multi condition query)、高级检索 (Advanced search)、复合检 索 (Composite index)、组合检索 (The combination of search)、组配检索 (Coordinateretrieval) 等。是用户根据已知或模糊的两条及两条以上线索 ,来查找数据库中与之匹配的记录。在检索实践中倍受广大用户的青睐。研究此模块对于有自建专题数据库建设的用户意义重大。

1多条件查询模块的特点

(1) 通用性。适 用范围广 、通用性 强。既可 独立运行 ,也可嵌入或移置到其他系统之中, 也能被其他模块 所调用。(2) 科学性。能支持布尔逻辑运算和多种匹配方式 。 (3) 灵活性。对检索式的构建, 可根据用户需求随意组配、扩缩灵活。(4) 准确性。检索结果精准。 (5) 高效性。功能齐全、操作简单高效。(6) 直观性。界面简洁明了。

2功能、步骤及运行环境

2.1模块功能

模块应由信息输入、条件选择、 结果处理3部分组成 。设计步骤:(1) [查询窗口 (界面)] 的布局设计。 (2) 条件选择菜单或输入框设计。包括:[检索项]、 [检索词] 输入框、 [匹配方式]、 [布尔逻辑运算符]、 [年代起止]、 [结果排序] 等。 (3) 按钮设计。如, [查找]、 [退出]。 (4) 检索式的生成与查询结果的保存或输出设计。(5) 后台处理部分。为模块的核心设计部分。

2.2运行环境

本模块适 用于Windows XP、Windows Vista、Windows7、Windows 8等桌面操作系统 ; 开发语言Visual Fox Pro 6.0。建立了qk_k文件夹用于存放相应的程序文件、库文件。

3设计思路及难点

3.1界面设计

共设8栏 (排 ), 请如图1所示。每 栏由“检 索项”、“ 检索词”、“匹配方式 ”、“逻辑运算符” 等项组成。每栏(除第八栏外 ) 均可组成一个完整独立的检索式。栏与栏之间(两个检索式之间 ) 可用逻辑运算符相连。当前6栏未输入任何检索词时, 模块默认第七栏的年代范围 (2010~当前年) 为查询条件。当第一栏与第二栏依次输入检索词时, 所对应的逻辑运算符 (第二栏起头), 才起作用。第八栏为 [查找] 和[退出] 按钮。

3.2设计难点

本模块较好地处理了用户输入“一个”或“多个” 检索词时, 程序均能准确快速地生成计算机能判读的布尔逻辑检索式。

3.3各选择框构成及功能

如图2所示。

逻辑运算符 (见图21): 主要用于连接两个检索式的方式。如表1所示。

检索项 (见图22、表2): 由数据库的字段组成。如: 篇名、著作、be_hx (中文核心)、na_hx (CSSCI)、re_fy (人大转载) 等……

检索词: 由用户输入需查找的词语。见图2_5。

匹配方式 (参见图23) 是指所输入的“检索词”与数据库中的记录相匹配方式。(1) “完全匹配 (精确匹配)”指从字段中取值与检索词完全相同。本模块支持精确匹配的字段有: 关键词、著者、刊名。(2) “前方一致”是指整个字段取值的前半部分与检索词完全相同。如与“精确匹配” 结合使用, 能用于“第一著者”的查找。(3) “任意匹配 (模糊匹配)”是指无论检索词的位置怎样, 只要字段中出现此词即可。

年代和排序。(1) 年代范围: 用于限定所查找记录的起止范围。本模块默认2010~当前年。 (2) 排序方式: 用于对查询结果, 也可按用户的选定“方式”排列, 见图24。

按钮: 按用户要求提交“查找信息”或“退出系统” 的指令。

4库结构与记录存放

4.1数据库结构

如表2所示。

4.2每条记录存放要求

每条记录 在存入QK_K.DBF数据库时 , 需在“著者 ”、“刊名”、“ 关键词”3个字段的前端 , 添加一空格 ( 半角 ) 。如表3所示。

表表33记记录录存存放放格格式式

篇篇名名著著者者刊刊名名关关键键词词……图图……李李华华图图书书馆馆论论坛坛读读者者忠忠诚诚忠忠诚诚表表现现……印印……黄黄敏敏南南亚亚研研究究季季刊刊难难民民印印度度法法律律………………………………

5程序设计及源代码

5.1查询模块界面 (窗口)

5.2查询模块变量赋值与提取

5.3查询模块程序

程序设计共分5个部分: 11~26行为检索窗口 (界面)程序设计; 227~42行是变量的“赋值与提取”程序设计; 343~88行是 ( 第1、2栏 ) 检索表达式的“生成 ”程序设计。其中第60、82、84行为kk最终检索表达式; 内嵌有3层分支语句程序设计do case…endcase, 如43~63行、45~59行、51~58行。489~93行为数据浏览模式的程序设计部分。当6栏均未输入任何检索词时, 模块默认“2010~当前年”为查询条件, 进入数据浏览模式; 594~109行为查询结果处理分支程序设计 部分。其 中 , 100行采用了SQL (Structure QueryLanguage结构化查询语言 ) 强大功能的查询语句。结果处理分3种情况: 检索失败, kk表达式不成立 (漏选字段), 见(95~97行 ); 找到符合条件的记录 (98~102行 ); 未找到符合条件的记录 (103~106行)。

6结语

在文献信息管理系统中, 用户可随意输入“检索词”和选用“任意匹配”(模糊查询)、“完全匹配”(精确查询)、“前方一致”等方式进行检索匹配 , 也可将前面的匹配方式 ,通过逻辑符 (或与非) 随意连接、搭配或组合, 使其检索表达完美、多样、复杂、精准。 不仅极大地方便了用户 使用 ,也为该模块“嵌入”或“移植” 到其他模块提供借鉴与参考。在实际使用中, 检索效果好, 深受用户好评。

多条件查询 篇2

1 动态多条件查询方法的分析研究

在数据库应用程序研发的软件过程中,经常涉及到对数据库中一个或多个数据表的多个字段进行任意形式组合查询,这就是动态多条件查询。在这样的查询界面或网页中,用户可以根据自己已知的多个条件信息在数据库中进行搜索,通过已知的条件筛选数据,缩小搜索范围,从而得到所有符合要求的结果。当前的动态多条件查询方法可以分为查询条件枚举法、SQL语句比较拼接和改进的SQL语句拼接3种。为了论述方便,设在某物流信息管理

系统数据库中存在一张材料表(Tb_Material),包含6个字段,该表各字段的基本信息如表1所示(数据类型基于SQL Server)。

1.1 查询条件枚举法

查询条件枚举法的思想比较简单,其出发点为针对不同的查询条件组合形式列出与之对应的SQL语句,最终执行的SQL语句只是其中的一条。以材料代码(Snum)和材料名称(Sname)2个查询条件为例,源程序如下(采用C#语言,下同。其中txtSnum、txtSname为系统查询界面或页面的文本框,用以输入材料代码和名称,@Snum、@Sname分别为接收输入的材料代码与名称的参数,sqlStr为最终执行的SQL语句):

容易发现,对于2个条件的动态查询,源程序中出现4次条件判断和4条查询语句。对于3个条件的动态查询,将出现8次条件判断和8条查询语句。以此类推,若将材料表(Tb_Material)的6个字段全部纳入查询条件中,将出现64次条件判断和64条查询语句。因此,在查询条件枚举法中,条件判断次数或查询语句的条数Y与查询条件的个数X的函数关系式满足:Y=2X。当查询条件的个数增多时,程序代码的复杂性大大升高,其执行效率也将急剧下降。

1.2 SQL语句比较拼接

为了克服枚举法的缺点,在程序中定义两个字符串:string sqlStr="select*from Tb_Material where";string oldSqlStr="selec*from Tb_Material where";oldSqlStr作为参照字符串,sqlStr作为最终执行的SQL语句。源程序如下:

SQL语句比较拼接以参照字符串oldSqlStr为基准,先逐一对各查询条件作出判断,若查询条件非空,则将查询条件拼接到sqlStr后面,将sqlStr与oldsqlStr进行比较是为了确定此次拼接是否为第一次拼接。若为第一次拼接,则说明即将在sqlStr后面加入第一个条件语句。若非第一次拼接,则说明将在sqlStr已有的条件语句后面通过“and”增加新的条件语句。可以发现,较查询条件枚举法而言,对于查询条件个数≥3的动态查询,只需增加少量相似的代码,源程序的条件判断次数与查询语句的条数将大大缩减,在很大程度上提高了程序代码的执行效率。

1.3 改进的SQL语句拼接

SQL语句比较拼接采用两个字符串,对于每个非空的查询条件,都要将sqlStr与oldsqlStr进行比较以确定当前的拼接是否为第一次拼接。并且,在对所有的查询条件都作出判断之后,仍需将sqlStr与oldsqlStr进行最后的比较,用以避免因所有的查询条件均为空而导致SQL语句出错。为了消除这种重复的比较,可以在where子句中预先设定一个恒定成立的条件。改进的SQL语句拼接源程序如下:

与SQL语句比较拼接对比,改进的SQL语句拼接无论是在代码量还是在编程技巧上都上了一个台阶。通过在sqlStr的where子句中预先设定一个恒定成立的条件''='',只要对每个查询条件逐一进行非空判断,就可以进行无限制的SQL语句自然拼接,从而较好地实现动态查询。

2 通用动态多条件查询方法的实现

通过对查询条件枚举法、SQL语句比较拼接和改进的SQL语句拼接3种动态多条件查询方法的分析研究可知,对比枚举法和SQL语句比较拼接两种方法,改进的SQL语句拼接在执行效率上明显占优势,能够带来整个数据库应用系统性能的提高。然而,美中不足的是,纵观这3种方法,始终没有得到改进的是源程序中繁琐的条件判断,即If语句。而对于程序优化,起到条件判断作用的If语句是编译器优化代码的最大障碍。程序代码中的If语句越多,其执行速度和效率越低。因此,可以考虑在改进的SQL语句拼接基础之上,通过对源程序中繁琐的If语句作进一步的改进,从而找到一种更加高效灵活的动态多条件查询方法。

改进的SQL语句拼接通过在where子句中预先设定一个恒定成立的条件''='',从而较好地实现了SQL语句的自然拼接。考虑到在其最终执行的SQL语句sqlStr中,参数@Snum、@Sname等的值直接来自获取的用户在相应文本框、下拉列表框等组件中输入或选择的值,在应用程序运行之前,这些参数的值的非空与否不能确定。但可以确定的是,这些参数的值只有两种状态:空或非空。这两种状态具有对立性。而在SQL语句的where子句中,可以采用“or”逻辑运算符连接两个条件,将同一个参数的这两种状态都表征出来。对照前文阐述的内容,以参数@Snum为例,可以表示为:Snum like'%'+@Snum+'%'or@Snum=''。如果参数@Snum的值非空,则@Snum=''条件不满足,整个条件表现为Snum like'%'+@Snum+'%';如果参数@Snum的值为空,@Snum=''条件满足,即''='',这是一个恒定成立的条件,则Snum like'%'+@Snum+'%'条件“失效”,整个条件表现为''='',恒定成立。

因此,上文中的源程序可以作如下的进一步优化:

容易发现,在优化的SQL语句中,where子句中“and”逻辑运算符所连接的每个圆括号内的条件均包含采用“or”逻辑运算符连接两个条件,将各参数的两种状态都表征出来了。当所有参数的值均为空时,最终执行的SQL语句sqlStr等效为:

亦等效为:

这样,无论查询条件个数的多少,该SQL语句均可以自动地根据各参数的值进行条件匹配。经过优化,在改进的SQL语句拼接基础之上,巧妙地消去了源程序中繁琐的If语句,无需对每个查询条件逐一进行非空判断,便可进行无限制的SQL语句自然拼接,从而实现了简洁方便、高效灵活的动态多条件查询。

从优化技巧上看,该方法巧妙地利用了where子句中“or”与“and”两种逻辑运算符,结合各参数的空与非空两种相互对立的状态,对where子句的结构进行了重组,从而达到了预期效果。同时,为了使系统更加高效地进行动态多条件查询,可以运用该方法创设相应的存储过程。上文中的源程序对应的存储过程如下(设系统查询界面或页面中包含“材料代码”、“材料名称”、“单位名称”、“价格上限”、“价格下限”、“库存地”及“入库时间”7个查询条件):

存储过程“Pr_GetMaterial”包含7个参数,其中,参数@HighPrice与@LowPrice分别表示材料的价格上限与价格下限,它们的默认值均设定为-1,以保证当用户在系统查询界面或页面中没有指定材料的价格上限或价格下限时,@LowPrice=-1或@HighPrice=-1恒定成立,使得存储过程能够正常执行。存储过程经过编译后存储在数据库中,通过数据库应用程序的调用执行,可以减少预处理所花费的时间,从而提高系统的执行效率。

3 结束语

文章着眼于数据库应用程序性能的提高,以SQL语句查询优化为出发点,对当前的动态多条件查询方法进行了探究与对比分析,提出了一种高效通用的动态多条件查询方法。采用该方法形成的SQL语句及程序代码简洁灵活,降低了算法的复杂度,能够在很大程度上促进系统性能的提高。

参考文献

[1]朱更明,李方敏,李和军.基于数据库系统表的通用查询方法[J].计算机工程与应用,2001(24)

[2]邵增珍,刘弘,刘磊.支持重用的可视化通用查询界面的生成[J].计算机工程,2003(9).

[3]刘桂芝.浅谈SQL语句的优化对应用程序性能的影响[J].一重技术,2007(1).

[4]吴险峰.SQL Server环境下的SQL优化方法探讨[J].电脑知识与技术,2008(15).

[5]姚剑芳.基于SQL Server的多条件模糊匹配查询[J].福建电脑,2010(4).

多条件查询 篇3

关键词:数据库,SQL Server,模糊查询,通配符,递进法,枚举法

0、引言

数据库信息查询是任何通用数据库管理系统的必备的主要功能之一, 也是开发成功与否的重要组成部分。在开发数据库应用时, 应该容许用户按照多种方式对数据库的任意字段进行组合来查询信息。如何设计灵活、方便、高效实用的查询系统一直是众多开发者所关注的问题。本文在SQL Server的实践应用中总结出一种行之有效的方法, 即多条件模糊匹配查询, 可将该方法应用于B/S、C/S模式的系统中的搜索引擎的构建。

1、单条件模糊匹配查询

在进行数据库查询时, 有完整查询和模糊查询之分。一般模糊查询语句如下:

SELECT字段FROM表WHERE某字段Like条件

其中关于条件, SQL提供了四种匹配模式:

%:表示任意0个或多个字符。可匹配任意类型和长度的字符。

_:表示任意单个字符。匹配单个任意字符, 它常用来限制表达式的字符长度语句:

[]:表示括号内所列字符中的一个 (类似正则表达式) 。指定一个字符、字符串或范围, 要求所匹配对象为它们中的任一个。

[^]:表示不在括号所列之内的单个字符。其取值和[]相同, 但它要求所匹配对象为指定字符以外的任一个字符。

在此处要实现搜索如"姓名"、"地址"之类的字段的模糊查询, 应该正确巧妙地使用"%"。比如要根据输入的部分姓名来查找学生的基本信息, 如查找"张小明", 可以输入"张"、"小"、"明"、"张明"、"小明"等等。这里输入的部分姓名可以多种多样, 一一分析不同的情况, 如输入"张"、"小"、"明"这样的单字的搜索条件的, 我们很容易就可以写出其SQL语句:如SELECT*FROM users WHERE username LIKE'%明%';但是如果用户输入"张明"、"小明", 以上的语句就不再符合条件了, 正确应该是SELECT*FROM users WHERE username LIKE'%张%明%'和SELECT*FROM users WHERE username LIKE'%小%明%'。

综合以上的分析, 我们需要将用户输入的查询关键词逐个字符进行遍历, 同时为了满足模糊查询, 在每个字符之后加入通配符"%", 其流程如下图所示:

SQL源程序如下:

--@Partial Name存放输入的部分姓名

DECLARE@Search Condition varchar (200) , @Partial Name varchar (200)

如输入"张明" (即@Partial Name值为张明) , 即可搜索出同时包含"张"和"明"两个字的记录, 如表1所示:

2、多条件搜索

一般来讲, 有两种方法进行多条件搜索:枚举法和递进法。

2.1 枚举法

枚举法思路较简单一一判断条件是否为空, 再按非空条件搜索, 同时可以利用真值表技术来对付条件极多的情况。

采用枚举法的SQL源程序如下:

理解上述程序时, 着重琢磨核心部分, 4组语句一一对应了2个搜索框中的4种状态, 如表2所示:

如果增加两个搜索条件 (增加性别, 电子邮件) , 搜索的状态组合为24种, 需要16组语句。

从分析中我们可以看出, 搜索条件不太多时 (n<=3) , 适合使用枚举法, 因为枚举法的思路非常简单。而当条件增多时, 如有4个条件时就要写16组语句。很明显, 当条件增多以后, 枚举法的实现语句呈指数增长, 实现难度加大, 效率较低。

2.2 递进法

与枚举法相比它们只有核心部分不同, 递进法的搜索核心, 依次判断条件为空否, 非空则将其加入搜索条件。

如前文所述, 当有4个条件时, 采用递进法的SQL源程序如下:

--递进法的搜索核心, 依次判断条件为空否, 非空则将其加入搜索条件

递进法是一个明智的算法, 单从语句的长短就可以看出来了。这个算法的难点和精髓就在字符串连接符"+"以及设计"1=1"的条件。首先得先设计"1=1"的条件, 防止所有的搜索条件均为空的情况。其次你应该清楚"+"在SQL中就是一个字符串连接符, 把该符号左右的字符拼接在一起。当num不为空, se@Search Condition=@Search Condition+&apos;and num like&apos;&apos;&apos;+@snum+&apos;&apos;&apos;&apos;;接下来name不为空时, set@Search Condition=@Search Condition+&apos;and name like&apos;&apos;&apos;+@sname+&apos;&apos;&apos;&apos;;以此类推就可以推广到n个条件的搜索。当然当搜索条件皆为空时, 因为设计了"1=1"这个衡成立的条件, 将选择表中的所有记录。

由上分析可看出, 当查询条件增加时, 递进法的实现语句增线性递增;无论从程序的效率还是可实现性方面, 递进法明显优于枚举法。故本文使用递进法的多条件搜索结合单条件查询实现多条件模糊匹配查询。

3、多条件模糊查询的实现

综合单条件模糊查询、多条件搜索的方法, 即可实现多条件模糊查询。但是这里应该注意根据现实生活的情况, 性别字段就不需要使用like关键字。

4、在Web应用中的改进

上述方法可用于C/S系统和B/S系统中实现搜索引擎, 但是在B/S系统应用中还存在缺陷, 问题主要在于通配符%。一方面是因为人们平时习惯把*作为通配符, 另一方面%若出现在超链接中, 通过request获取时%将被"吃"掉, 如下:

在IE中浏览test.htm时点击超链接, 显示为:Testthenum。可见%直接被超链接忽略掉了。怎么才能解决这个问题呢?很简单, 我们做点小小的手脚--偷梁换柱。

将以下代码加在搜索核心之前:

将以下代码加在搜索核心之后:

在我们来分析一下这些语句。replace () 是字符串替换函数, replace (name, "*", "%") 就是将name中所有的*换成%。也就是说, 我们把3个条件中凡是出现的*都替换为%, 这样一来前3句就将通配符改成*了。而后3句就可以防止%被"吃"掉。所有问题就迎刃而解了吧。

5、结论

本文讨论的是基于SQL Server的多条件模糊匹配查询, 在查询方法的设计当中, 当要搜索如"姓名"、"地址"之类的字段时, 利用like并巧妙使用"%"来产生模糊查询。经过算法比较, 采用递进法来构建查询使用的SQL语句。此外, 还在WEB应用中改进由于通配符造成的缺陷。通过这些方法为数据库管理信息系统提供灵活、方便、有效的数据查询方法, 从而构建高效使用的搜索引擎。

参考文献

[1]周泓, 徐小良, 汪乐宇.基于模糊算法的数据库查询工具的设计[J].计算机应用研究, 2001, (5) :15~17

[2]朱蓉.基于模糊理论的查询技术研究[J].计算机应用研究, 2003, (5) :8~10, 29

[3]王佳宜, 杨路明, 谢东, 等.关系数据库上关键词的数字属性模糊查询研究[C].全国第18届计算机技术与应用 (CACIS) 学术会议论文集 (上册) , 2007:650~655

[4]张森, 韦明.数据库的模糊查询技术[J].电子与自动化, 2000, (5) :23~24

[5]张新华, 朱跃龙, 梁正和, 基于数据字典的通用动态查询系统设计与实现[J].计算机与现代化, 2006 (4)

[6]何珍文, 吴冲龙, 等.数据库应用程序中通用动态查询实现方法研究[J].计算机工程, 2002, 28 (11)

多条件查询 篇4

利用Wizards类库中的SearchForm.vcx和SearchClass.vcx可以创建一个二重条件复合查询表单。只能满足一些条件不多的查询,通过对SearchClass.vcx进行修改,并利用SearchForm作为表单模板生成一个查询表单,并在表单上添加几个控件和一些代码,即可实现多重条件复合查询,如图1所示。该查询表单具有原SearchForm的优点和特性,并扩展了多重复合查询。表单界面操作简单明了,可清晰地表达查询条件表达式之间的逻辑运算关系,并可以对生成的查询条件表达式进行编辑修改,从而实现了复杂查询。下面介绍该查询表单的实现方法。

1 修改类文件

为了使VFP原类文件不受影响,应将VFP中的Wizards类文件夹下的Wizstyle.vcx类库复制出来,放到存放程序的文件夹内。启动VFP,建立一个项目,并在该项目中的类库上添加文件夹内的Wizstyle.vcx类库。打开选择该类库,进入Searchclass,修改、删除一些控件如图2所示。

2 建立表单

将Wizstyle.vcx类库中的SearchForm作为表单模板,在项目中建立表单Form1并进入Form1的修改状态,添加控件如图1,其他属性可用默认值。并给表单添加一个Flag属性,值为F,用于标记是否能向编辑框赋值。为了使列表框能显示表达式的组合关系,应制作两个图标And.jpg、Or.jpg,放在Picture子文件夹里。

3 控件的属性

(1)按钮1:Name=Command1 Caption=“确定”

(2)按钮2:Name=Editcmd Caption=“编辑查询表达式”

(3)列表框:Name=List1用于显示表达式

(4)编辑框:Name=Edit1用于修改显示表达式

(5)形状控件:specialeffect=3维

4 添加、修改代码

4.1 修改类中一些事件的代码

4.1.1 Searchexpr事件

修改后的代码为:

4.1.2 Init事件

4.2 Searchclass类中Txtexpr1一些事件的代码

4.2.1 Getfocus事件

4.2.2 Lostfocus事件

4.2.3 When事件

4.3 修改类中Command group1的Click事件代码

在Case This.Value=1下面添加代码,并将所有的m.cGetExpr替换为m.cGetExprabc。

4.4 表单Form1里Searchform1的init事件代码

4.5 Command1的Click事件代码

4.6 Editcmd的Click事件代码

4.7 Edit1的Lostfocus事件代码

经过以上修改保存,即可用于嵌入自己开发和VFP应用程序中,以满足复杂查询的要求,也可保存为类,来创建多重条件复合查询表单。可以在SearchForm类中Command group1的Click事件的Case This.Value=1里面添加显示代码,即可作为一个功能强大的查询表单单独使用。

摘要:对Visual FoxPro自带的SearchClass类进行改进,修改Searchclass类中一些事件的代码,并改造查询窗口,增加一些对象,将原来的二重复合查询条件改为多重条件复合查询,大大增强了查询功能,简化了查询操作。

关键词:Visual FoxPro,SearchClass,多重复合查询

参考文献

[1]Microsoft Corporation Visual Foxpro6.0.

[2]Microsoft Corporation Visual FoxPro6.0语言参考手册.

多条件查询 篇5

在数据库应用开发过程中, 有时需要将数据库中多张表同时在各自的窗体中显示编辑, 多线程技术为实现这样的应用需要提供了捷径。进程通常被定义为程序的运行实例, 在Win32系统中, 进程占据4GB地址空间, 在4GB地址空间中存储了应用程序的代码和数据, 此外, 进程还占有其他一些资源, 如文件、动态内存分配、线程等。当一个进程被终止时, 它生命期中所创建的各种资源将被全部清除, 因此进程是一个静态的概念。线程描述进程的执行并负责执行存储在进程地址空间中的代码, 实际应用中, 单个进程可以包含多个线程, 这些线程可以同时执行进程地址空间中相同或不同的代码, 每个线程都有自己的一组CPU寄存器和堆栈。在每一个进程中至少有一个以上的线程在执行其地址空间中的代码。如果一个进程中没有线程在执行其地址空间中的代码, 系统将自动清除它和它所占有的地址空间。进程建立好后, 操作系统为它的每个独立线程安排一些CPU时间碎片, 以轮转方式向线程提供时间片。

在创建一个Win32进程时, 它的第一个线程称为主线程, 是由系统自动生成的, 这时可在主线程的基础上生成额外的线程 (还可利用这些线程生成更多的辅助线程) 。

通过一个示例详细介绍在Delphi7.0中使用多线程技术, 将MS-SQL Server 2005数据库中多张表同时在各自的窗体中显示编辑的实现过程及其主要编码。

2 多线程在数据库多表并行查询

(1) 首先在MS-SQL Server 2005中创建数据库PUS, 在PUS中创建任意数据库表 (可根据实际需要确定表结构) , 如创建SALES、JOBS、STORES表。

(2) 打开Delphi7.0开发工具, 创建一个应用项目取名为WMAIN1.DPR, 在该应用项目中创建两个窗体Form1及QueryForm, Form1为主窗体, Form1窗体保存为WMain.pas单元文件, QueryForm窗体保存为ResltFrm.pas单元文件。

1) Form1的Caption属性设置为:多线程技术在多窗口查询中应用, 在窗体Form1上放置组件及其属性设置如表1所示。

所建窗体Form1如图1所示。

2) QueryForm的Caption属性设置为:后台查询。在窗体QueryForm上放置组件及其属性设置, 如表2所示。

所建窗体QueryForm如图2所示。

(3) 实现过程及编码

1) 实现主要安排在ResltFrm.pas单元中 (即QueryForm窗体中) , 按图2及表2创建QueryForm窗体, 在QueryForm窗体单元文件ResltFrm.pas的Implementation (实现) 部分定义查询线程类型TQueryThread, 该线程类型由TThread派生, 有四个私有成员:QueryForm:TQueryForm;MessageText:String;Procedure ConnectQuery;Procedure DisplayMessage组成。其构造函数以TQueryForm型窗体为输入参数, 在线程对象生成时用该参数给线程私有成员QueryForm转值, 同时启动该线程对象。线程启动执行将私有成员QueryForm的ADOQuery1组件打开, 并安排在主线程中同步以显示编辑表格。

需要说明的是, 在ResltFrm.pas单元文件中, 还定义了一个过程BackgroundQuery (QueryText:String) , 以Select查询语句串为输入参数, 该过程先创建一个查询窗体QueryForm, 并对该查询窗体上相关组件属性赋值, 并以该查询窗体QueryForm为输入参数创建启动查询线程对象。

因在Form1中要调用QueryForm窗体单元文件ResltFrm.pas中的BackgroundQuery (QueryText:String) 过程, 在单元文件Wmain.pas的Implementation下要加入uses Resltfrm语句;

该示例的实际运行如图3所示。

2) 实现代码。由于QueryForm窗体的单元文件ResltFrm pas包含了查询线程的定义实现, 在此给出ResltFrm.pas完整编码如下:

主窗体form1的功能相对简单, 在此仅给出form1窗体上Button1按钮的Click事件编码:

3 结语

多线程技术能较好地实现程序不同部分的并行运行, 特别是在后台运行计算业务量较大的情况下效果更为突出。上述示例在MS SQL Server 2005, Windows XP, Delphi7.0成功运行, 如果查询窗体大的业务计算, 效果更明显。希望能对利用多线程技术进行软件开发的技术人员在项目开发时参考。

参考文献

多条件查询 篇6

关键词:多连接查询优化,免疫遗传算法,抗体浓度,免疫接种

1 引言

随着Internet技术与信息管理系统的发展与普及, 基于数据库、数据仓库的联机事务处理和联机分析处理已成为银行、企业、政府等部门最为重要的计算机应用之一。在这些应用中, 多连接查询操作在各种数据库操作中所占比重非常大, 而且, 执行多连接查询操作时, 运算先后次序不同, 查询请求响应的时间就不同。多连接查询优化就是对于由N个 (N>10) 关系的连接操作构成的一个查询请求, 在合理的时间内找到一个最佳的查询执行计划。一个好的查询计划往往可以使程序性能提高数十倍。然而, 在大规模数据库、数据仓库、联机分析处理的环境下, 参与多连接查询运算的表的数目较大, 导致多连接查询优化的计算复杂性非常大。因此, 多连接查询优化对获得好的查询性能至关重要[1]。

多连接查询优化问题是一个NP问题, 高效的优化算法是提高查询性能的关键问题。目前, 已有一些算法解决这个问题, 这些方法在某些方面提高或改进了查询性能。文献[2]利用增量启发式信息来初始化种群, 提高了遗传算法的收敛速度。文献[3]在遗传算法的过程中加入了模拟退火操作, 有利于保持物种的多样性。文献[4]在查询优化中, 结合哈希过滤方法, 减少查询执行计划的计算代价, 从而提高多连接查询效率。文献[5]结合遗传算法和模拟退火算法提出了一种混合算法, 并将其应用到多连接优化问题, 改进了获得最佳查询计划的性能。本文的主要内容是将免疫思想和遗传算法相结合, 设计一个多连接查询优化算法, 在保持遗传算法优良特性的前提下, 加入抽取疫苗、接种疫苗、疫苗选择等免疫算子, 抑制优化过程中出现的退化现象, 提高算法的寻优能力。

2 多连接查询优化问题

多连接查询优化问题可以描述为合理时间内在搜索空间中找到一个最好或者近似最好的关系连接次序问题。搜索空间常采用左线性树空间, 并根据关系代数的等价变换规则, 利用“选择操作下移、投影操作尽量先做、避免笛卡尔积”等启发式信息。多连接查询优化问题可简化为一个带约束的组合优化问题, 求解该问题的数学模型如下。

上述模型中, C表示多连接查询的代价, ti表示左线性树中的内部结点, r和s是ti的左右子结点 (即ti是r与s连接后的中间结果) , n (ti) 表示关系ti的元组个数, n (r) 和n (s) 分别表示关系r和s的元组个数, R是关系r和s的公共属性, V (A, r) 为关系r中属性A的不同取值的个数。

对于某个具体的多连接查询, 假设X为全部可能查询执行计划的集合, X中每个成员x都有其代价C (x) , 则需要找出X中的某个查询执行计划q (q∈X) , 使得q满足:

多连接查询优化的目标是优化时间与找到的查询执行计划x的执行时间之和最小。

3 免疫遗传算法的基本思想

免疫遗传算法是借鉴生物免疫机制提出的一种改进的遗传算法。它模拟生物抗体浓度自适应调节过程, 在算法中加入免疫记忆功能, 提高了算法的收敛速度。由生物免疫原理可知, 生物免疫系统对入侵生命体的抗原通过细胞的分裂和分化作用自动产生相应的抗体来抵御, 其中部分抗体作为记忆细胞保存下来。当相似抗原再次侵入时, 记忆细胞将被激活并迅速产生大量抗体, 体现了免疫系统的记忆功能。抗体与抗原结合后会通过一系列的反应而破坏抗原。同时, 算法根据抗体与抗原的亲和力和抗体的浓度进行选择操作, 亲和力高且浓度小的抗体选择概率大, 这样就抑制了群体中浓度高的抗体, 保持了群体的多样性, 体现了免疫系统的自我调节功能[6]。免疫遗传算法的流程如图1。

4 多连接查询优化的免疫遗传算法设计

本文吸取免疫遗传算法的思想, 结合多连接查询优化的特点, 将它用于求解多连接查询优化问题。首先, 将免疫遗传算法中涉及的基本概念与多连接查询优化的基本概念进行对照, 它们之间的对应关系如表1所示。

4.1 初始抗体的产生、编码、适应度、亲和度和抗体浓度

初始抗体的产生可以先从记忆细胞库中搜索该问题的记忆抗体, 从而生成初始抗体, 不足的抗体则在解空间中随机产生。这个初始抗体产生的方法提高了初始种群中抗体的适应度, 更快的找到全局最优解。

抗体的评价主要用抗体与抗原的适应度以及抗体和抗体的亲和度来表示。适应度函数由 (1) 、 (2) 、 (3) 式计算出cost值, 再求其倒数。抗体v的适应度函数:

适应值越大, 被选择的概率就越大。

抗体v和抗体w的亲和度函数:

其中E (2) 为v和w的平均信息熵。通过这些平均信息熵可以实现抗体的多样化。

抗体v的浓度计算函数如下:

其中, qv表示和抗体v有较大亲和度的抗体个数, N表示全局抗体个数。通过 (8) 式能有效地抑制抗体的过分相似。

4.3 选择算子、交叉算子、变异算子的设计

选择算子采用最优保存策略和基于抗体浓度选择策略相结合。最优保存策略使得适应值最好的抗体尽可能保留到下一代群体中, 以免交叉和变异运算破坏种群中的优秀解, 保证了算法的收敛。群体的浓度定义为群体中相似抗体所占的比率。基于抗体浓度选择策略原理是, 群体更新时, 亲和度高的抗体不断提高, 到达一定的值时则抑制这种抗体的产生。也就是说, 抗体集合中与抗体x基因相似的抗体越多, 则抗体x被选中的概率就越小;反之, 与抗体x基因相似的抗体越少, 抗体x被选中的概率就越大。基于抗体浓度选择策略不仅能有效地抑制浓度过高的抗体繁殖, 保证抗体的多样性, 避免算法陷入局部最优值, 而且使含有有效进化基因的低适应值个体也可获得繁殖的机会。

交叉操作时通过交换两个父个体的一部分来产生新的子个体, 该操作要根据一定的概率进行。

变异操作时以一定的概率随机地改变个体中某个基因, 以提供初始群体中不存在的基因或找回选择过程中丢失的基因, 为群体提供新的内容。变异算子将个体的基因链的各个基因按某个概率进行变异。变异本身是一种局部随进搜索, 与选择算子结合在一起, 保证了免疫遗传算法的有效性, 使得免疫遗传算法具有局部的随机搜索能力, 同时, 也使得免疫遗传算法保持种群的多样性, 以防止出现不成熟收敛。变异算子采用单点基因换位法。

4.4 疫苗接种、免疫选择

首先, 根据多连接查询问题的特征信息和先验知识得到该问题的疫苗。个体接种疫苗的概率取0.6, 接种疫苗包括对于个体x接种疫苗, 对群体接种疫苗两个步骤。第一步, 按照先验知识来修改个体x的某些基因位上的基因或其分量, 使所得个体以较大的概率具有更高的适应度。第二步, 对群体进行接种疫苗, 从种群中随机抽取Nα个个体进行接种。为了使个体接种疫苗后满足约束条件, 作如下处理:设接种疫苗前, 个体的某基因位上取值为vi, 接种疫苗后取值为vi′, 则将原个体基因位上取值为vi的基因与取值为vi′的基因对换。免疫选择对加强接种算子有积极作用, 消除其负面影响, 防止群体的退化, 具有较强的鲁棒性。

免疫选择操作分两步完成。第一步是免疫检测, 即对接种了疫苗的个体进行检测, 若其适应度不如父代, 说明在交叉、变异的过程中出现了严重的退化现象。这时保留父代个体。如果子代适应度优于父代, 则选择子代。

5 总结

免疫遗传算法已经在一些领域的优化计算中取得了很好的效果。本文结合多连接查询优化问题的实际特点, 提出应用免疫遗传算法解决多连接查询优化问题。免疫遗传算法在遗传算法的基础上引入了基于浓度的抗体抑制和促进的免疫算子, 能有效地抑制浓度过程的抗体繁殖, 保证抗体的多样性, 避免算法陷入局部最优值;根据先验知识保存最优抗体, 有效提高初始种群的质量;疫苗接种使得问题的特征信息能注入抗体, 保证算法的快速有效收敛。

参考文献

[1]玄萍, 李金宝.基于机群系统的并行多连接查询优化算法[J].黑龙江大学自然科学学报, 2006, 23 (6) :821-826.

[2]董红斌, 梁意文, 康立山, 等.利用启发式信息优化多连接查询的遗传算法[J].武汉大学学报 (自然科学版) , 1999, 45 (5) :743-746.

[3]杨艺, 李延东.退火遗传算法的多连接查询应用[J].计算机工程与应用, 2004, 34:190-192.

[4]王果, 徐仁佐.结合哈希过滤的一种改进多连接查询优化算法[J].计算机工程, 2004, 30 (7) :57-59.

[5]闫晓慧, 董丽丽, 张慧娜.基于混合遗传算法的关系数据库多连接查询优化策略[J].微电子学与计算机, 2008, 25 (11) :181-183.

多条件查询 篇7

关键词:条件格式,函数,学生成绩,统计与查询

学生成绩的统计是学生管理工作中数据量大、易错而又不容出错的工作,是学生奖学金及各类评先评优的重要依据。如果善加利用excel的条件格式和函数功能,则可以很容易完成这项工作,把我们从繁琐的计算和校对工作中解放出来,大大提高我们的工作效率和工作速度。下面是学生成绩统计与查询的一例,其方法具有一定实用性和普遍性。

1 成绩表的建立与转化

1.1 导入学生成绩原始数据并转化其类型

图1是2010级工商管理一班(30人)第一学期成绩原始数据的一部分,首先利用Excel的函数value(),将原文本型的数字转化为纯数字。如在P4单元格中输入=value(D4),其他类推,再把整个数字区域复制到D4:K33,因学号位数较多,同一个班的学生,学号除了最后两位数不同外,其余数字均相同,所以,可用excel的单元格自定义功能进行设置。选中A4:A33,右击鼠标,点击设置单元格格式,选择单元格格式自定义对话框,在其中输入“20101008”00,再在A4单元格中输入1,在A5单元格中输入2,利用填充柄完成A6:A33单元格,即刻显示完整的学号,如图1所示:

1.2 应用条件格式对分数进行相关设置

选取D4:K33区域,设置条件格式:≥ 90的字体为蓝色,<60的字体为红色,介于60~90的字体为绿色。 如图2所示:

2 成绩统计与分析

2.1 使用sum( )和rank( )函数进行总分的统计与排名

在L4单元格输入公式“=sum(D4:K4)”,并填充至L33,完成“总分”的计算。选中M4单元格,单击编辑栏上“fx”,选取rank函数,在函数参数对话框中输入number为“L4”,ref为“$L$4:$L$33”(使用绝对地址)。将M4自动填充至M33,完成“排名”列的计算。Rank函数参数图形界面如图3所示:

使用条件格式和sum( )、rank( )函数后的样式如图4所示:

2.2 应用Countif、Sumif、Max( )、Min( )、Average( )函数对成绩表进行统计分析

应用countif函数计算男生人数,利用sumif函数和己经求得的男生人数,可计算男生总分的平均分。同样的方法,可以计算女生人数和女生的平均分。使用countif函数还可完成各分数段人数的统计。利用max函数统计各科(或总分)最高分,利用min函数统计各科(或总分)最低分,应用Average函数统计平均分,联合运用sumif和countif函数可完成各科男生平均分和女生平均分的统计。具体步骤如下:

在C39单元格,输入=Max(D4:D33),填充到J39,完成全班各科最高分的统计。

在C40单元格,输入=Min(D4:D33),填充到J40,完成全班各科最低分的统计。

在C41单元格,输入=Average(D4:D33),再填充到J41,完成各科全班平均分的统计。

在C42单元格,输入=SUMIF(C4:C33,“男”,D4:D33)/COUNTIF(C4:C33,“男”),填充到J42,完成各科男生平均分的统计。

在C43单元格,输入=SUMIF(C4:C33,“女”,D4:D33)/COUNTIF(C4:C33,“女”),填充到J43,完成各科女生平均分的统计。

在C44单元格,输入=COUNTIF(D4:D33,“>=90”),填充到J44,完成90分以上的分数段人数统计。

在C45单元格,输入=COUNTIF(D4:D33,“>=80”)-COUNTIF(D4:D33,“>=90”),填充到J45,完成各科在80~90分(不含90)的人数统计。

在C46单元格,输入=COUNTIF(D4:D33,“>=70”)-COUNTIF(D4:D33,“>=80”),填充到J46,完成各科在70~80分(不含90)的人数统计。

在C47单元格,输入=COUNTIF(D4:D33,“>=60”)-COUNTIF(D4:D33,“>=70”),填充到J47,完成各科在60~70分(不含90)的人数统计。

在C48单元格,输入=COUNTIF(D4:D33,“<60”),填充到J48,完成各科60分以下人数统计。成绩分布如图5所示:

3 成绩查询界面的设计

运用VLOOKUP()函数制作成绩查询界面。

VLOOKUP()函数的功能是在表格或数值数组的首列查找指定的数值,并由此返回表格或数组中该数值所在行中指定列处的数值[1]。

这里所说的“数组”,可以理解为表格中的一个区域。数组的列序号:数组的“首列”,就是这个区域的第一纵列,此列右边依次为第2列、第3列……假定某数组区域为A4:M33,那么A4:A33为第1列、B4:B33为第2列……

语法:

VLOOKUP(查找值,区域,列序号,逻辑值)

“查找值”:为需要在数组第一列中查找的数值,它可以是数值、引用或文字符串。 “区域”:数组所在的区域,如“A4:M33”,也可以使用对区域或区域名称的引用,例如数据库或数据清单。

“列序号”:即希望区域(数组)中待返回的匹配值的列序号,为1时,返回第一列中的数值。为2时,返回第二列中的数值,以此类推;若列序号小于1,函数VLOOKUP 返回错误值 #VALUE!;如果大于区域的列数,函数VLOOKUP返回错误值 #REF!。

“逻辑值”:为TRUE或FALSE。它指明函数 VLOOKUP 返回时是精确匹配还是近似匹配。如果为TRUE或省略,则返回近似匹配值,也就是说,如果找不到精确匹配值,则返回小于“查找值”的最大数值;如果“逻辑值”为FALSE,函数VLOOKUP将返回精确匹配值。如果找不到,则返回错误值 #N/A。如果“查找值”为文本时,“逻辑值”一般应为 FALSE 。另外如果“查找值”小于“区域”第一列中的最小数值,函数 VLOOKUP 返回错误值 #N/A。如果函数 VLOOKUP 找不到“查找值”且“逻辑值”为 FALSE,函数 VLOOKUP 返回错误值 #N/A。

成绩查询功能在于输入任意学生的座号,即可查找出该学生的姓名、各科成绩、总分以及班级排名等详细信息。

对单元格P4做同样的设置(在P4单元格中,右键点击—设置单元格格式—自定义—“2010008”00,学生座号定义后,要查询某位学生成绩与排名,只需在P4单元格输入该生学号的最后两位数字即可),在单元格P6中输入=VLOOKUP($P$4,$A$4:$M$33,2),在单元格P7中输入=VLOOKUP($P$4,$A$4:$M$33,4),在P8单元格中输入=VLOOKUP($P$4,$A$4:$M$33,5),在单元格P9中输入=VLOOKUP($P$4,$A$4:$M$33,6),在单元格P10中输入=VLOOKUP($P$4,$A$4:$M$33,7),在单元格P11中输入=VLOOKUP($P$4,$A$4:$M$33,8),在单元格P11中输入=VLOOKUP($P$4,$A$4:$M$33,8),在单元格P12中输入=VLOOKUP($P$4,$A$4:$M$33,9),在单元格P13中输入=VLOOKUP($P$4,$A$4:$M$33,10),在单元格P14中输入=VLOOKUP($P$4,$A$4:$M$33,11),在单元格P15中输入=VLOOKUP($P$4,$A$4:$M$33,12),在单元格P16中输入=VLOOKUP($P$4,$A$4:$M$33,13),如果此时在P4单元格中输入30即学号为201000830的学生,则可立即查到该学生的姓名、各科成绩及排名情况,如图6所示:

4 结论

Excel函数具有强大的数据处理能力,如果能善加利用Excel的条件格式和函数参数,则会给我们的工作带来极大便利,达到事半功倍之效,利用Excel的条件格式和函数参数进行成绩统计、查询与奖学金的评定,操作简便、准确可靠、易于修改,高效可行。

参考文献

上一篇:设计的创新思维研究下一篇:技术型农民