ASP教程:数据库查询语言(1)原定计划从本篇开始就要给大家介绍ASP内建的ActiveX组件,但是考虑到我们在往后的学习中将会接触到大量的数据库查询,因此作者临时决定花一到两篇的篇幅向大家简要介绍一些数据库查询语言的基本知识,这其实也是学习ASP所必须掌握的一门知识。是否能够灵活地运用数据库查询语言,将直接关系到ASP程序的执行效率等一系列问题,所以请各位务必重视。相信很多朋友都听说过SQL这个名字,如果你是计算机方面的行家,SQL的大名一定是如雷贯耳。那么SQL究竟是什么呢?SQL一词实际上是StructuredQueryLanguage结构式查询语言的缩写,是用于对存放在计算机数据库中的数据进行组织、管理和检索的一种工具;是一种特定类型的数据库--关系数据库。而控制这种数据库的计算机程序就是我们常说的DBMS--数据库管理系统。譬如:SQLServer、Oracle、Sybase、DB2等等。当用户想要检索数据库中的数据时,就通过SQL语言发出请求,接着DBMS对该SQL请求进行处理并检索所要求的数据,最后将其返回给用户,此过程被称作为数据库查询,这也就是数据库查询语言这一名称的由来。SQL并不是象C、COBOL和Fortran语言那样的完整的计算机语言。SQL没有用于条件测试的IF语句,也没有用于程序分支的Goto语句以及循环语句For或Do。确切的讲,SQL是一种数据库子语言,SQL语句可以被嵌入到另一种语言中,从而使其具有数据库存取功能。SQL也非严格的结构式语言,它的句法更接近英语语句,因此易于理解,大多数SQL语句都是直述其意,读起来就象自然语言一样明了。SQL还是一种交互式查询语言,允许用户直接查询存储数据,利用这一交互特性,用户可以在很短的时间内回答相当复杂的问题,而同样问题若让程序员编写相应的报表程序则可能要用几个星期甚至更长时间。在大部分ASP应用程序中我们都会接触到数据库,而我们在编写ASP应用程序时用来进行数据库操作的标准语法正是SQL,因此SQL语法的重要性是不言而喻的。下面,我们就从最常用的SQL语句SELECT着手,一步一步地来学习SQL。查询是SQL语言的核心,而用于表达SQL查询的SELECT语句则是功能最强也是最为复杂的SQL语句,它从数据库中检索数据,并将查询结果提供给用户。在本文中我们将建立一个名为tianjiao的简单数据库,该库中存放了一个叫sales的销售记录表,如下所示:姓名性别工资销售目标销售额地区书生男250080009000上海吴冠军男3000100009999北京雷鸣男2000800010000四川雪儿女250050006000广州顾一男260090009800大连阿卓女200040004000天津熠天男40002000020000全国在该表中有六列即六个字段:姓名、性别、工资、销售目标、销售额、地区,首先我们用Select语句列出姓名、销售目标和销售额:Select姓名,销售目标,销售额Fromsales结果如下:姓名销售目标销售额书生80009000吴冠军100009999雷鸣800010000雪儿50006000顾一90009800阿卓40004000熠天2000020000然后,我们再列出所有男性的姓名、销售目标和销售额:Select姓名,销售目标,销售额FromsalesWhere性别=男结果如下:姓名销售目标销售额书生80009000吴冠军100009999雷鸣800010000顾一90009800熠天2000020000接下来,我们做一个相对复杂的查询,列出销售额大于销售目标的所有男性的姓名、销售目标和销售额,并且按销售目标排序。Select姓名,销售目标,销售额FormsalesWhere销售额销售目标And性别=男OrderBy销售目标结果如下:姓名销售目标销售额书生80009000雷鸣800010000顾一90009800熠天2000020000大家可以看到,对于简单查询,SQLSelect语句和英文语法很相象,我们来分析一下SELECT语句的完整格式,它包括六个子句,其中SELECT和FROM子句是必须的,其它子句可以任选,每个子句的功能如下:1、Select子句列出所有要求SELECT语句检索的数据项。它放在SELECT语句开始处,指定此查询要检索的数据项。这些数据项通常用选择表表示,即一组用“,”隔开的选择项。按照从左到右的顺序,每个选择项产生的一个列的查询结果,一个选择项可能是以下项目:(1)、列名:标识FROM子句指定表中的列。如果列名作为选择项,则SQL直接从数据库表中每行取出该列的值,再将其放在查询结果的相应行中。(2)、常数:指定在查询结果的每行中都放上该值。(3)、SQL表达式:说明必须将要放入查询结果中的值按表达式的规定进行计算。2、From子句列出包含所要查询数据的表,它由关键字FROM后跟一组用逗号分开的表名组成。每个表明都代表一个包括该查询要检索数据的表。这些表称为此SQL语句的表源,因为查询结果都源于它们。3、Where子句告诉SQL只查询某些行中的数据,这些行用搜索条件描述。4、GroupBy子句指定汇总查询,即不是对每行产生一个查询结果,而是将相似的行进行分组,再对每组产生一个汇总结果。5、Having子句告诉SQL只产生有GroupBy得到的某些组的结果,和Where子句一样,所需要的组也用一个搜索条件指定。6、OrderBy子句将查询结果按一列或多列中的数据排序。如果省略此子句,则查询结果将是无序的。下面作者将提供一个简单但实用的运用SQL语句查询的ASP程序供大家参考。为了使大家更清楚更直接地了解SQL语法在ASP中的应用,我们先将查询的所有核心过程写成一个名为query2table的SUB,然后利用ASP的服务器端包容功能调用该SUB。请将以下语句剪贴到记事簿,保存为subdbtable.inc文件,并置于虚拟目录asptest下:%subquery2table(inputquery)setconntemp=server.createobject(adodb.connection)conntemp.openDSN=Student;uid=student;pwd=aspmagicsetrstemp=conntemp.execute(inputquery)howmanyfields=rstemp.fields.count-1'统计数据库中的列数%tableborder=1tr%fori=0tohowmanyfields%tdb%=rstemp(i).name%/B/TD%next%/tr%dowhilenotrstemp.eof%tr%fori=0tohowmanyfieldsthisvalue=rstemp(i)Ifisnull(thisvalue)thenthisvalue=?'如果字段为空,则将变量thisvalue的值定义为一个空格endif%tdvalign=top%=thisvalue%/td%next%/tr%rstemp.movenextloop%/table%rstemp.closesetrstemp=nothingconntemp.closesetconntemp=nothingendsub%完成了SUB的定义过程,在下面几个ASP程序中我们只要加入想要使用的SQL查询语句,并调用该过程就可以非常方便的得到查询结果。将以下四段代码分别保存为asp11a.asp、asp11b.asp、asp11c.asp、asp11d.asp四个.asp文件。HEADTITLEasp11a.asp/TITLE/HEADHTMLbodybgcolor=#FFFFFF%callquery2table(select*frompublisherswherenamelike'A%%')'将表publishers中所有姓名中有字母A的记录查询出来%!--#includevirtual=/asptest/subdbtable.inc--/BODY/HTMLHEADTITLEasp11b.asp/TITLE/HEADHTMLbodybgcolor=#FFFFFF%callquery2table(select*fromtitleswhereYear_Published=1998)'将表titles中所有发表年份大于或等于1998年的记录查询出来%!--#includevirtual=/asptest/subdbtable.inc--/BODY/HTMLHEADTITLEasp11c.asp/TITLE/HEADHTMLbodybgcolor=#FFFFFF%callquery2table(select*frompublisherswhereamount10000andsex='male')'将表publishers中所有数量大于10000且性别为男的记录查询出来%!--#includevirtual=/asptest/subdbtable.inc--/BODY/HTMLHEADTITLEasp11d.asp/TITLE/HEADHTMLbodybgcolor=#FFFFFF%callquery2table(select*frompublisherswherestate'NY')'将表publishers中所有所在城市不为纽约的记录查询出来。%!--#includevirtual=/asptest/subdbtable.inc--/BODY/HTML利用subdbtable.inc文件中的所定义的过程query2table,你就可以非常迅速地对数据库进行查询,你所要做的只是将“conntemp.openDSN=Student;uid=student;pwd=aspmagic”中的数据库名称、用户身份和密码稍加改动,并在调用query2table时输入想要使用的SQL查询语句即可。是不是很简单?这就是ASP和SQL的魅力所在!!!今天,我们虽然用了一整篇的篇幅只学习了一个SQL指令,但请你相信你所获得远不同于一个DOS指令,SELECT指令使得你可以非常容易地对数据库进行查询,或许在这之前你对数据库查询还一无所知,但是通过本篇的学习,你其实已经会使用ASP进行常用的数据库查询了,是不是很激动?在下一篇中,作者将继续给大家介绍SQL的其它几个基本指令。在结束本文之前,作者在这里要向很多来信的朋友致歉,由于最近作者工作繁忙,实在无暇一一回答各位的问题,请见谅,我会尽量将一些常见的、发生频率较高的问题在文章中写出来,至于一些不常见的问题,我建议大家到下面这个站点提问,你将会得到及时的答复。=1,这是作者至今为止所见的最棒的中文ASP学习站点,由上海的飞鸟主持,大家务必去看看。在本篇的开头,我要感谢一些朋友来信给我指出了前几篇文章中的错误。不知大家是否记得在第八篇中我举了一个简单的利用Application制作的页面访问计数器?有位朋友来信问我,为何当他改变计数器起始变量NumVisits的值后对最后的记数结果没有任何作用?起初我也大惑不解,让我们来回忆一下这段源程序,如下:%DimNumVisitsNumVisits=0Application.LockApplication(NumVisits)=Application(NumVisits)+1Application.Unlock%欢迎光临本网页,你是本页的第%=Application(NumVisits)%位访客!在这段程序中,如果你试图通过改变变量NumVisits的值来改变记数器结果,是绝对办不到的