理论上,要针对所有的表各写一条SQL,SQL中要列出所有的字符类字段,例如:
SELECT FROM taba WHERE fielda LIKE '%abc%' OR fieldB LIKE '%abc%' ……;
SELECT FROM tabb WHERE fielda LIKE '%abc%' OR fieldB LIKE '%abc%' ……;
写这样的SQL非常痛苦,看你是用的什么数据库,许多数据库系统有系统字典,就是在数据库里面的某些表中存放着所有的数据库、表、字段的名称和类型,那样可以通过那些信息编写出自动生成前面的SQL语句的SQL语句。
另外,一般的数据库都是存放在文件中或者磁盘上,可能利用全盘搜索软件搜索磁盘上特定的字符串,比上述SQL语句要快得多,只是搜索到了,要判断数据库行有一些麻烦。
(一),首先利用access97建立一个名为listmdb的数据库,在里面建立一个名为list的表,然后在list表里面输入一些你想要被查询的文件名字,关键的搜索词还有相对应的链接,下面建立了四个项目ID(编号),title(主题),word(关键词),url(链接地址),如下表所示:
ID title word url
1 cgi教程 本地调试cgi cgi/testcgihtm
2 下载中心 聊天室,留言本 download/indexhtm
(二),建立了数据库以后就可以建立你的asp搜索页面了,下面是一个文件名为searchhtm的asp搜索页面的源程序,这个搜索引擎可以同时搜索title和word里面的内容,当然如果你有需要的话可以建立更多的搜索:
<!--#INCLUDE file="ADOVBSinc"-->
<% "建立数据库的连接
con="DBQ="+servermappath("listmdb")+";DefaultDir=;DIRVER={microsoft Access Driver(mdb)};"
"建立CONNECTION对象并打开数据库
set mycon=servercreateobject("ADODBCONNECTION")
myconopencon %>
"创建Recordset对象的例程,打开Recordset对象传递SQL串以及所有的连接信息
<% set rs=servercreateobject("ADODBRecordset")
rsopen "SELECTFORM list where title and word like '%'&requestform("word")&"%'",MyCon,adOpenStatie
%>
"建立查询后的显示信息和查询页面,你想取什么名字都可以
<html><head><title>查询结果</title></head>
<body bgcolor="#ffffff">
<p align="center"><br>
"统计查询共有<% ResponseWrite(RSRecordCount) %>条纪录</p><br>
<div align="center"><center>
<table border="1" align="center" bordercolor="000000" berdorcoorlight="#000000" bordercolordark="#ffffff">
<tr align="center">
<td width="20%" align="center" bgcolor="#ffffff">ID</td>
<td width="60%" align="center" bgcolor="#ffffff">主题</td>
<td width="20%" align="center" bgcolor="#ffffff">查看</td></table>
<table border="1" align="center" bordercolor="000000" berdorcoorlight="#000000" bordercolordark="#ffffff">
<tr align="center">
<!--从数据库提取信息-->
<% while not rseof %>
<tr align="center">
<td width="20%" align="center" bgcolor="#ffffff"><% =rs("id") %></td>
<td width="60%" align="center" bgcolor="#ffffff"><% =rs("title") %></td>
<td width="20%" align="center" bgcolor="#ffffff"><a href="<% =rs("url") %>">GO</a></td>
<% rsmovenext %></tr> <% wend %></table></center></div><% rsclose %>
<% myconclose %>
"关闭链接
</body></html>
下面我们来建立搜索页面
<html><head><title>搜索页面</title></head>
<!--创建搜索表格-->
<from method="POST" action="searchasp">
<div align="center"><center><p><input type="text" name="word" size="30">
<input type="submit" value="提交" name="B1"><input type="reset" value="清除" name="B2"></p>
</center></div></form>
<hr width="600" align="center">
<html>
首先想的就是要把同一类的数据放在一个表中,然后给这个表取个一目了然的名字,这样管理起来会方便得多但是另一方面,我们在实际工作中使用数据库中的数据时,并不是简单地使用这个表或那个表中的数据,而常常是将有“关系”的很多表中的数据一起调出使用,有时还要把这些数据进行一定的计算以后才能使用查询对象如果再建立一个新表,把要用到的数据拷贝到新表中,并把需要计算的数据都计算好,再填入新表中,就显得太麻烦了用“查询”对象可以很轻松地解决这个问题,它同样也会生成一个数据表视图,看起来就像新建的“表”对象的数据表视图一样查询的优点“查询”的字段来自很多互相之间有“关系”的表,这些字段组合成一个新的数据表视图,但它并不存储任何的数据当我们改变“表”中的数据时,“查询”中的数据也会发生改变计算的工作也可以交给它来自动地完成,完全将用户从繁重的体力劳动中解脱出来,充分体现了计算机数据库的优越性常见的查询种类选择查询交叉查询 *** 作查询参数查询选择查询选择查询就是从一个或多个有关系的表中将满足要求的数据提取出来,并把这些数据显示在新的查询数据表中其他的方法,像“交叉查询”、“ *** 作查询”和“参数查询”等,都是“选择查询”的扩展例子:订单查询现在我们建立一个“订单”查询,建立这个查询就是为了将每份订单中的各项信息都显示出来,包括“订单号”、“订货公司”、“货品名称”、“货物单价”、“订货数量”、“订货金额”、“经办人”和“订货时间”这些字段 1查询准备首先要在Access中打开“客户订单数据库”,然后单击“对象”列表中的“查询”项,并在创建方法列表中单击“在设计视图中创建查询”项 因为下面的 *** 作都是在对“查询”这个对象进行 *** 作,所以要将当前的对象切换到“查询”对象上 2选择需要查询的表
单击“在设计视图中创建查询”后,屏幕上出现“查询”窗口,它的上面还有一个“显示表”对话框。在上一课“建立表之间的关系”中曾经提到过“显示表”对话框。单击“显示表”对话框上的“两者都有”选项,在列表框中选择需要的表或查询。“表”选项卡中只列出了所有的表,“查询”选项卡中只列出了所有的查询,而选择“两者都有”就可以把数据库中所有“表”和“查询”对象都显示出来,这样有助于我们从选择的表或查询中选取新建查询的字段。
单击所需要的表或查询,然后单击对话框上的“添加”按钮,这个表的字段列表就会出现在查询窗口中。将“客户订单数据库”中的“订单信息表”和“产品信息表”都添加到查询窗口中。添加完提供原始数据的表后,就可以把“显示表”窗口关闭,回到“查询窗口”中准备建立“查询”了。 “表/查询显示窗口”显示查询所用到的数据来源,包括表、查询。窗口中的每个表或查询都列出了它们的所有字段,这样一目了然,方便了我们选择查询字段 示例查询窗口则是用来显示查询中所用到的查询字段和查询准则
3为查询添加和删除目标字段
现在我们就要往查询设计表格中添加字段了。所添加的字段叫做“目标字段”,向查询表格中添加目标字段有两种方法:
第一种方法可以在表格中选择一个空白的列,单击第一行对应的一格,格子的右边出现一个带下箭头的按钮,单击这个按钮出现下拉框,在下拉框中就可以选择相应的目标字段了,选中表“订单信息表”中的“订单号”字段
如果在几个表中都有同样的字段,要怎么区分呢?当我们在查询表格的第一格的下拉框中寻找对应目标字段时,在字段前面都有字段所在的表格/查询名,像“订单信息表产品名称”字段就表示它是“订单信息表”中的“产品名称”字段。而不是别的表或查询中的“产品名称”字段。这样就不会混淆了
第二种方法更简单,如果要添加“订单信息表”中的“订货单位”字段,就先选中“订单信息表”这个表,然后在它的列表框中找到需要的字段“订货单位”,将鼠标移动到列表框中标有这个字段的选项上,按住鼠标左键,这时鼠标光标变成一个长方块,拖动鼠标将长方块拖到下方查询表格中的一个空白列,放开鼠标左键,这样就完成了将“订单信息表”中的“订货单位”字段添加到查询表格中了
在“表/查询”窗口中如果有很多对象时,这种方法就比第一种方法显得方便多了
如果要删除一个目标字段,将鼠标移动到要删除的目标字段所在列的选择条上,光标会变成一个向下的箭头,单击鼠标左键将这一列都选中,敲击键盘上的“DELETE”键,选中的目标字段就被删除了
4查询的数据表视图
将表切换到数据表视图,就可以看到“查询”结果了
在Access中,在几个视图之间切换是非常简单的。只要将鼠标移动到工具栏左上角的第一个工具按钮处,就会d出一个“视图”提示标签,单击它就可以从查询设计视图切换到数据表视图
查询的数据表视图看起来很像表,但它们之间还是有很多差别的
在查询的数据表中虽然不能插入列,但是可以移动列,而且在查询的数据表中也可以改变列宽和行高,还可以隐藏和冻结列
在查询数据表中无法加入或删除列,而且不能修改查询字段的字段名。这是因为由查询所生成的数据值并不是真正存在的值,而是动态地从表对象中调来的,是表中数据的一个镜像
查询只是告诉Access需要什么样的数据,而Access就会从表中查出这些数据的值,并将它们反映到查询数据表中来罢了,也就是说这些值只是查询的结果
我们刚才选择目标字段就是告诉Access需要哪些表、哪些字段,而Access会把字段中的数据列成一个表反馈给我们
在查询中还可以运用各种表达式来对表中的数据进行运算生成新的查询字段
5汇总数据
现在的数据表还没算出每份订单所涉及的“销售总金额”,我们可以在查询中使用表达式来计算。先在查询的设计窗口中添加一个目标字段,就是查询数据表中最后的“销售总金额”字段,因为这个字段不在任何一个表中,所以必须手动将它输入到查询表格的一个空列中
在列的字段行首先输入“销售金额”,然后输入“:”(注意必须输入英文模式下的“:”),接着输入“[产品信息表]![产品单价][订单信息表]![订货数量]”,现在再切换到查询的数据表视图看看结果,查询新增了“销售总金额”列,并且自动算出了每份订单中涉及的金额
写计算表达式的时候必须注意它的格式,首先是字段名称,接着是“:”然后是表达式的右边部分,在用到本查询中的目标字段时,必须将字段名用方括号括起来,在字段名前面加上“[所用表的表名]!”符号来表示它是哪个表中的字段
刚才说的都是一些简单的计算,如果要对数据进行一些复杂的计算,要计算十几个值,都这么写会很麻烦,而且如果要取某个值开方后的值,就写不出了
为了完成更多更复杂的计算,Access提供了一个专用的“表达式生成器”,它的具体使用方法将在下一课里讲
6保存新建的查询
该做的差不多都做完了,我们把新建的查询保存起来吧
在主菜单上单击“文件”菜单中的“保存”命令,如果是第一次存储这个查询,在屏幕上就会d出一个对话框,询问如何命名这个查询:7利用简单表查询向导建立查询
首先用鼠标单击数据库窗口的新建按钮,屏幕上d出“新建查询”窗口,在列表框中选择“简单查询向导”,然后单击“确定”按钮。在出现的简单查询向导窗口上,选择新建查询中需要用到的字段名称。由于这些字段可能在不同的表或查询中,先要在表/查询下拉框的下拉菜单中选择需要的表或查询,这时在可用字段列表框中的字段就是所选择的表或查询中的全部可用字段了。用鼠标单击选中需要的“字段”,再单击“向左移”或“向右移”按钮就可以将这个选项作为新建查询中的一个选定的字段了。将所有需要的字段都选定以后,单击窗口上的下一步按钮,在下一个窗口中为新建的查询取名,并单击“完成”按钮,就可以创建一个新的查询了
8利用交叉表查询向导建立查询
ACCESS支持一种特殊类型的总计查询,叫做交叉表查询,利用该查询,你可以在类似电子表格式中查看计算值,要创建一个交叉表查询,首先在数据库窗口中单击新建按钮,并在d出的窗口中单击选中“交叉表查询向导”,然后单击确定按钮,在出现的交叉表查询向导窗口中第一步要求选择含有交叉表的表或查询的名称,第二步要选择在交叉表中哪些字段的值用来做行标题,最多只能选择三个字段,第三步要选择在交叉表中那些字段的值用来做列标题,第四步要选择在表中的交叉点计算出什么数值。第五步中需要为新建的查询取名,并单击完成按钮,这样一个交叉表查询就完成了。
由于这个查询比较特殊,而且对于初学者来说经常看不懂,我特把罗斯文数据库中的相关例子单独提出来以供参考。交叉表查询rar (8303 KB) 9使用查找重复项查询向导建立查询
在Access中,可能需要对数据表中某些具有相同的值的记录进行检索、分类。利用系统提供的“查找重复查询向导”可以快速地完成一个“查找重复项”查询。首先在数据库窗口中单击“查询”选项卡,然后单击“新建”按钮,在“新建查询”对话框中,单击“查找重复查询向导”,单击“确定”按钮。“查找重复项查询向导”的第一步与前面的两种查询向导一样,根据需要选取查询的对象,第二步选取设为重复值的字段,系统会按照选取的字段自动对数据表中的记录进行检索,按照设定的字段分类检索。第三步选择另外查询的字段。其实,在此处选择的查询内容是用户想了解的信息,即有哪些记录具有相同的内容。在最后一个向导对话框中输入新建查询的标题,或者接受系统提供的默认值,并且选择生成查询之后的 *** 作,即可以选择在“数据表”视图中打开查询查看信息或在“设计”视图中修改查询设计。单击“完成”按钮结束查询的建立 。
你上面将创建表和创建数据库等相关的东西混淆了。建议你多看下书理清下思路。一步一步来,学东西别急。
创建数据库:
create datebase db;
---这句代码创建数据库,数据库路径和大小由系统默认。
on
( 分配内存大小、数据库路径等。
)
———创建表—————
create table tb_(
username varchar(20) not null primary key
)-----创建字段
——————————————
应该你有书,比着书多敲敲代码,有不懂的再交流。
基于ASP的站内多值搜索
运行环境:IIS
脚本语言:VBScript
数据库:Access/SQL Server
数据库语言:SQL
1.概要:
不论是在论坛,还是新闻系统,或是下载系统等动态网站中,大家经常会看到搜索功能:搜索帖子,搜索用户,搜索软件(总之搜索关键字)等,本文则是介绍如何建立一个高效实用的,基于ASP的站内多值搜索。
本文面对的是“多条件模糊匹配搜索”,理解了多条件的,单一条件搜索也不过小菜一碟了。一般来讲,有两种方法进行多条件搜索:枚举法和递进法。搜索条件不太多时(n<=3),可使用枚举法,其语句频度为2的n次方,成指数增长,n为条件数。很明显,当条件增多以后,无论从程序的效率还是可实现性考虑都应采用递进法,其语句频度为n,成线性增长。需要指出的是,枚举法思路非常简单,一一判断条件是否为空,再按非空条件搜索,同时可以利用真值表技术来对付条件极多的情况(相信没人去干这种事,4条件时就已经要写16组语句了);递进法的思想方法较为巧妙,重在理解,其巧就巧在一是使用了标志位(flag),二是妙用SQL中字符串连接符&。下面以实例来讲解引擎的建立。
2.实例:
我们建立一通讯录查询引擎,数据库名为addressbookmdb,表名为address,字段如下:
ID Name Tel School
1 张 三 33333333 电子科技大学计算机系
2 李 四 44444444 四川大学生物系
3 王 二 22222222 西南交通大学建筑系
… … … …
Web搜索界面如下:
姓名: 电话: 学校: 搜索按钮
采用枚举法的源程序如下:
<%@ CODEPAGE = "936" %>
'连接数据库
<%
dim conn
dim DBOath
dim rs
dim sql
Set conn=ServerCreateObject("ADODBConnection")
DBPath = ServerMapPath("addressbookmdb")
connOpen "driver={Microsoft Access Driver (mdb)};dbq=" & DBPath
Set rs=ServerCreateObject("ADODBRecordset")
'从Web页获取姓名、电话、学校的值
dim Name
dim Tel
dim School
Name=request("Name")
Tel=request("Tel")
School=request("School")
'枚举法的搜索核心,因为有3个条件所以要写8组If判断语句
if trim(Name)="" and trim(Tel)="" and trim(School)="" then
sql="select from address order by ID asc"
end if
if trim(Name)="" and trim(Tel)="" and trim(School)<>"" then
sql="select from address where School like '%"&trim(School)&"%' order by ID asc"
end if
if trim(Name)="" and trim(Tel)<>"" and trim(School)="" then
sql="select from address where Tel like '%"&trim(Tel)&"%' order by ID asc"
end if
if trim(Name)="" and trim(Tel)<>"" and trim(School)<>"" then
sql="select from address where Tel like '%"&trim(Tel)&"%' and School like '%"&trim(School)&"%' order by ID asc"
end if
if trim(Name)<>"" and trim(Tel)="" and trim(School)="" then
sql="select from address where Name like '%"&trim(Name)&"%' order by ID asc"
end if
if trim(Name)<>"" and trim(Tel)="" and trim(School)<>"" then
sql="select from address where Name like '%"&trim(Name)&"%' and School like '%"&trim(School)&"%' order by ID asc"
end if
if trim(Name)<>"" and trim(Tel)<>"" and trim(School)="" then
sql="select from address where Name like '%"&trim(Name)&"%' and Tel like '%"&trim(Tel)&"%' order by ID asc"
end if
if trim(Name)<>"" and trim(Tel)<>"" and trim(School)<>"" then
sql="select from address where Name like '%"&trim(Name)&"%' and Tel like '%"&trim(Tel)&"%' and School like '%"&trim(School)&"%' order by ID asc"
end if
rsopen sql,conn,1,1
'显示搜索结果
if rseof and rsbof then
responsewrite "目前通讯录中没有记录"
else
do while not rseof
responsewrite "姓名:"&rs("Name")&"电话:"&rs("Tel")&"学校:"&rs("School")&"<br>"
rsmovenext
loop
end if
'断开数据库
set rs=nothing
connclose
set conn=nothing
%>
理解上述程序时,着重琢磨核心部分,8组语句一一对应了3个搜索框中的8种状态
Name Tel School
空 空 空
空 空 非空
空 非空 空
空 非空 非空
非空 空 空
非空 空 非空
非空 非空 空
非空 非空 非空
另外trim()是VB的函数,将输入的字符串前后的空格去掉;%是SQL语言中的多字符通配符(_是单字符通配符),由此可见%"&trim()&"%对搜索框中输入的关键字是分别向左向右匹配的;SQL语言中用and连接说明非空条件之间是“与”关系。
再来看看递进法,与枚举法相比它们只有核心部分不同:
'递进法的搜索核心,依次判断条件为空否,非空则将其加入搜索条件
sql="select from address where"
if Name<>"" then
sql=sql&" Name like '%"&Name&"%' "
flag=1
end if
if Tel<>"" and flag=1 then
sql=sql&" and Tel like '%"&Tel&"%'"
flag=1
elseif Tel<>"" then
sql=sql&" Tel like '%"&Tel&"%'"
flag=1
end if
if Company<>"" and flag=1 then
sql=sql&" and Company like '%"&Company&"%'"
flag=1
elseif Company <>"" then
sql=sql&" Company like '%"&Company&"%'"
flag=1
end if
if flag=0 then
sql="select from address order by ID asc"
end if
rsopen sql,conn,1,1
递进法是一个明智的算法,单从语句的长短就可以看出来了。这个算法的难点和精髓就在flag和&上。首先你应该清楚&在SQL中就是一个字符串连接符,把该符号左右的字符拼接在一起。再回到程序,当Name不为空时sql="select from address where Name like '%"&Name&"%' "同时flag=1;接下来当Name不为空时且Tel不为空时,即Tel<>"" and flag=1时,sql="select from address where Name like '%"&Name&"%' and Tel like '%"&Tel&"%' "同时flag=1,否则当Name为空Tel不为空,sql="select from address where Tel like '%"&Tel&"%' "同时flag=1;以此类推就可以推广到n个条件的搜索。当然条件皆为空时,即flag=0将选择所有表中所有项。
3.验证:
至此,一个搜索引擎就建立起来了。以下是一些使用示例:
姓名:张 电话: 学校: 搜索按钮
搜索结果为:
姓名: 张三 电话:33333333 单位:电子科技大学计算机系
姓名: 电话: 学校:大学 搜索按钮
搜索结果为:
姓名:张三 电话:33333333 单位:电子科技大学计算机系
姓名 李 四 电话:44444444 单位:四川大学生物系
姓名:王二 电话:22222222 单位:西南交通大学建筑系
姓名: 电话:4444 学校:四川 搜索按钮
搜索结果为:
姓名 李 四 电话:44444444 单位:四川大学生物系
姓名: 电话: 学校:交%大 搜索按钮
搜索结果为:
姓名:王二 电话:22222222 单位:西南交通大学建筑系
4.改进:
其实这个引擎还有些缺陷,问题主要在于通配符%。一方面是因为人们平时习惯把作为通配符,另一方面%若出现在超链接中,通过request获取时%将被“吃”掉,如下:
--testhtm--
…
<a href=testaspcontent=test%the%sign>click here</a>
…
--testasp--
<%
content=request(“content”)
responsewrite content
%>
在IE中浏览testhtm时点击超链接,显示为:
testthesign
可见%直接被超链接忽略掉了。怎么才能解决这个问题呢?很简单,我们做点小小的手脚--偷梁换柱。
将以下代码加在搜索核心之前:
Name=replace(Name,"","%")
Tel=replace(Tel,"","%")
Company=replace(Company,"","%")
将以下代码加在搜索核心之后:
Name=replace(Name,"%","")
Tel=replace(Tel,"%","")
Company=replace(Company,"%","")
在我们来分析一下这些语句。replace()是VB中字符串替换函数,replace(Name,"","%") 就是将Name中所有的换成%。也就是说,我们把3个条件中凡是出现的都替换为%,这样一来前3句就将通配符改成了。而后3句就可以防止%被“吃”掉。所有问题就迎刃而解了吧。
姓名: 电话: 学校:交%大 搜索按钮
搜索结果为:
姓名:王 二 电话:22222222 单位:西南交通大学建筑系
将上面的语句再改一改,把用空格代替,不就成了我们在Google、BaiDu中常用的用空格来分开搜索条件的搜索引擎了吗?
以上就是关于对整个数据库进行搜索的方法全部的内容,包括:对整个数据库进行搜索的方法、如何建立搜索引擎、access做的系统,如何创建数据库查询功能在线等等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)