
数据库语言
-
2023年3月20日发(作者:关贸总协定)数据库查询语言
原定计划从本篇开始就要给大家介绍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的销售记录表,如下
所示:
姓名性别工资销售目标销售额地区
书生男25上海
吴冠军男3北京
雷鸣男2四川
雪儿女25广州
顾一男26大连
阿卓女2天津
熠天男40全国
在该表中有六列即六个字段:姓名、性别、工资、销售目标、销售额、地区,首先我
们用Select语句列出姓名、销售目标和销售额:
Select姓名,销售目标,销售额Fromsales
结果如下:
姓名销售目标销售额
书生80009000
吴冠军100009999
雷鸣800010000
雪儿50006000
顾一90009800
阿卓40004000
熠天2000020000
然后,我们再列出所有男性的姓名、销售目标和销售额:
Select姓名,销售目标,销售额FromsalesWhere性别="男"
结果如下:
姓名销售目标销售额
书生80009000
吴冠军100009999
雷鸣800010000
顾一90009800
熠天2000020000
接下来,我们做一个相对复杂的查询,列出销售额大于销售目标的所有男性的姓名、
销售目标和销售额,并且按销售目标排序。
Select姓名,销售目标,销售额
Formsales
Where销售额>销售目标
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。
请将以下语句剪贴到记事簿,保存为文件,并置于虚拟目录asptest下:
<%
subquery2table(inputquery)
setconntemp=object("tion")
"DSN=Student;uid=student;pwd=aspmagic"
setrstemp=e(inputquery)
howmanyfields=-1
'统计数据库中的列数
%>
<%
fori=0tohowmanyfields
%>
<%next%>
<%
%>
<%fori=0tohowmanyfields
thisvalue=rstemp(i)
Ifisnull(thisvalue)then
thisvalue="?
'如果字段为空,则将变量thisvalue的值定义为一个空格
endif%>
<%=thisvalue%>
<%next%>
<%xt
loop%>
<%
setrstemp=nothing
setconntemp=nothingendsub%>
完成了SUB的定义过程,在下面几个ASP程序中我们只要加入想要使用的SQL查询
语句,并调用该过程就可以非常方便的得到查询结果。将以下四段代码分别保存为
、、、四个.asp文件。
<%
callquery2table("select*frompublisherswherenamelike'A%%'")
'将表publishers中所有姓名中有字母A的记录查询出来
%>
<%
callquery2table("select*fromtitleswhereYear_Published>=1998")
'将表titles中所有发表年份大于或等于1998年的记录查询出来
%>
<%
callquery2table("select*frompublisherswhereamount>10000andsex='male'")
'将表publishers中所有数量大于10000且性别为男的记录查询出来
%>
<%
callquery2table("select*frompublisherswherestate'NY'")
'将表publishers中所有所在城市不为纽约的记录查询出来。
%>
利用文件中的所定义的过程query2table,你就可以非常迅速地对
数据库进行查询,你所要做的只是将
“"DSN=Student;uid=student;pwd=aspmagic"”中的数据库名称、用户身份
和密码稍加改动,并在调用query2table时输入想要使用的SQL查询语句即可。是不是很
简单?这就是ASP和SQL的魅力所在!!!
今天,我们虽然用了一整篇的篇幅只学习了一个SQL指令,但请你相信你所获得远不
同于一个DOS指令,SELECT指令使得你可以非常容易地对数据库进行查询,或许在这之前
你对数据库查询还一无所知,但是通过本篇的学习,你其实已经会使用ASP进行常用的数
据库查询了,是不是很激动?在下一篇中,作者将继续给大家介绍SQL的其它几个基本指
令。在结束本文之前,作者在这里要向很多来信的朋友致歉,由于最近作者工作繁忙,实在
无暇一一回答各位的问题,请见谅,我会尽量将一些常见的、发生频率较高的问题在文章中
写出来,至于一些不常见的问题,我建议大家到下面这个站点提问,你将会得到及时的答复。
/friend/flybird/bbs/?id=1,这是作者至今为止所见
的最棒的中文ASP学习站点,由上海的飞鸟主持,大家务必去看看。
在本篇的开头,我要感谢一些朋友来信给我指出了前几篇文章中的错误。不知大家是否记得
在第八篇中我举了一个简单的利用Application制作的页面访问计数器?有位朋友来信问
我,为何当他改变计数器起始变量NumVisits的值后对最后的记数结果没有任何作用?起
初我也大惑不解,让我们来回忆一下这段源程序,如下:
<%
DimNumVisits
NumVisits=0
Application("NumVisits")=Application("NumVisits")+1
%>
欢迎光临本网页,你是本页的第<%=Application("NumVisits")%>位访客!
在这段程序中,如果你试图通过改变变量NumVisits的值来改变记数器结果,是绝对
办不到的。因为用变量的值去改变Application的值是不可以的,这两者是不相关的。所
以这里对变量的定义和赋值都是多余的。那么我们究竟应该如何来给
Application("NumVisits")定义一个初始值呢?请看以下修正后程序:
<%
IfApplication("NumVisits")<999then
Application("NumVisits")=999
EndIf
Application("NumVisits")=Application("NumVisits")+1
%>
欢迎光临本网页,你是本页的第<%=Application("NumVisits")%>位访客!
这里的999就是你要设定的计数器初始值,如此一来问题就迎刃而解了。我非常感谢
这位姓康的朋友给我指出了这个错误,虽然这只是一个很小的漏洞,但我们在共同学程序写
程序的过程中非常需要这种严谨细致的作风,希望今后朋友们们一旦发现文中的错误即刻来
信告知,我也能及时纠正,谢谢。
SQL语言可以分为两大部分:数据定义语言和数据操纵语言,继上一篇我们学习了数
据操纵语言中的Select语句后,今天作者要继续给大家简要介绍其余的SQL语句。
SQL是一种完备的数据处理语言,不仅用于数据库查询,而且用于数据库中的数据修
改和更新,与支持SQL查询的Select语句的复杂性相比较,更改数据库内容的SQL语句
就格外简单。然而对于一个DBMS来说,数据更新所造成的风险大大超出了数据查询。数据
库管理系统必须在更改期内保护所存储的数据的一致性,确保有效的数据进入数据库,数据
库必须保持一致性,DBMS还必须协调多用户的并行更新,以确保用户和他们的更改不至于
影响其他用户的作业。
用于修改数据库内容的SQL语句主要有以下三个:
1、Insert,向一个表中加入新的数据行
2、Delete,从一个表中删除数据行
3、Update,更改数据库中已经存在的数据
首先我们来看看Insert的用法:
标准语法:
INSERTINTOtable_name
(col1,col2...)
VALUES(value1,value2...)
下例要将书生作为一个新的销售员加入表Salesreps中
InsertInto
Salesreps(name,num,sales,hire_date,income)
values('shusheng',9,10000,'23-Feb-99',2000)
在此语句中,列的名称列在括号中以逗号隔开,接下去是Value短语和括号中同样以
逗号隔开的每列数据,应该注意的是数据和列名称的顺序是相同的,而且若是字符串型则以
单引号隔开。从概念上来讲,Insert语句建立的一个与表列结构相一致的数据行,用取自
Values子句的数据来填充它,然后将该新行加入表中,表中的行是不排序的,因此不存在
将该行插入到表的头或尾或两行之间的这个概念。Insert语句结束后,新行就是表的一部
分了。
Insert语句还可以将多行数据添加到目标表中去,在这种形式的Insert语句中,新
行的数据值不是在语句正文中明确地指定的,而是语句中指定的一个数据库查询。添加的值
来自数据库自身的行,这乍看起来似乎有些奇怪,但是在某些特定的状态下,这是非常有用
的。比如,你想把1998年12月30日之前产生的订单编号、日期和数目从order表中
拷贝到另一个名为oldorder的表中去,多行Insert语句为拷贝数据提供了一种紧凑而高
效的方法,如下:
Insertintooldorder(Num,Date,Amount)
SelectNum,Date,Amount
Fromorder
WhereDate<'30-12-98'
这条语句看起来有些复杂,其实很简单,语句标识了接收新行的表oldorder和接收
数据的列,完全类似于单行Insert语句。语句的剩余部分是一个查询,它检索order表
中的数据。SQL先执行对order表的查询,然后将查询结果逐行插入到oldorder表中去。
下面我们来看看Update的用法,Update语句用于更新单表中选定行的一列或多列
的值。要更新的目标表在语句中定义,Set子句则指定要更新哪些列并计算他们的值。
Update语句总是包含Where语句,而且Update语句比较危险,所以您必须明确地认识到
Where语句的重要性,Where语句被用来指定需要更新的行。
标准语法:
UPDATEtable_name
SETcolumnname1=value1
[,columname2=value2]...
WHEREsearch_condition
以下是一个简单的Update语句的例子:
Updatecustomers
Setcredit=100000.00,id=99
Wherename='asp'
在此例中我们将表customers中客户名为asp的客户的信贷值更新为10万并将他
的ID变更为99。再看下例:
Updatecustomers
Setcredit=200000.00,state=021
WhereIDin(80,90,100,120)
我们可以发现,其实SQL处理Update语句的过程就是逐行遍历所指定的表,更新其
搜索条件结果为“真”的行,跳过其搜索条件结果为“假”或“空”的行。
最后,来看看Delete语句。
标准语法:
DELETEFROMtablename
WHEREcondition
由于它过于简单,所以所造成的后果也是严重的,虽然其中的Where子句是任选的,
但它几乎总是存在的,若将Where子句从Delete语句中省略掉,则目标表的所有行都将
被删除。看下例:
DeletefromorderWhereID=99
在文章的末尾,作者在给大家简要介绍一下数据定义语言。它是用来创建和修改数据
库结构的一种语句,包括Create和Drop语句。
1、Create语句
标准语法:
CREATETABLEtable_name
(field1datatype[NOTNULL],
field2datatype[NOTNULL],
field3datatype[NOTNULL]...)
如:
CREATETABLEBILLS
(NAMECHAR(30),
AMOUNTNUMBER,
ACCOUNT_IDNUMBER)
尽管CreateTable比前面介绍的语句难理解一些,但仍然很直观。它将bills赋予
一个新表,并指定表中三列的名称和数据类型。表被建立后我们就可以添入数据了。如:
Insertintobills(name,amout,account_id)values('gates',100,1)
如果,你觉得不再需要保存产品信息,则可用Droptable语句将该表及其所包含的
所有数据从数据库中删除掉。
标准语法:
DROPTABLEtable_name
至此,我们已经了解了所有常用的SQL语句,可别小看这些貌似英文的简单语句,它
们的功能十分强大,当我们编写asp程序时必须使用他们对数据库进行操作。从下一篇开
始,作者将给大家介绍ASP的内建ActiveX组件,敬请关注。