为了建立交互站点,你需要使用数据库来存储来自访问者的信息。例如,你要建立一个职业介绍服务的站点,你就需要存储诸如个人简历,所感兴趣的工作等等这样的信息。
创建动态网叶也需要使用数据库,如果你想显示符合来访者要求的最好的工作,你就需要从数据库中取出这份工作的信息。你将会发现,在许多情况下需要使用数据库。
在这一章里,你将学会怎样使用“结构化查询语言”(SQL〕来操作数据库。SQL语言是数据库的标准语言。在Active Sever Pages 中,无论何时你要访问一个数据库,你就要使用SQL语言。因此,掌握好SQL对ASP编程是非常重要的。
注意:你可以把“SQL”读作“sequel”,也可以按单个字母的读音读作S-Q-L。 两种发音都是正确的,每种发音各有大量的支持者。在本书里,认为“SQL”读作“sequel”。
通过这一章的学习,你将理解怎样用SQL实现数据库查询,你将学会怎样使用这种查询从数据表中取出信息,最后,你将学会怎样设计和建立自己的数据库。
注意:通过下面几章对SQL的介绍,你将对SQL有足够的了解,从而可以有效地使用Active Sever Pages。但是,SQL是一种复杂的语言,本书不可能包括它的全部细节。要全面掌握SQL语言,你需要学习在Microsoft SQL Sever 中使用SQL。你可以到附近的书店去买一Microsoft SQL Sever 6.5。
SQL介绍:
本书假设你是在SQL操作Microsoft SQL Sever 的数据库。你也可以用SQL操作许多其它类型的数据库。SQL是操作数据库的标准语言。(事实上,关于SQL语言有一个专门的ANSI标准〕
注意:
不要在你的站点上试图用Microsoft Access代替Microsoft SQL Sever。SQL Sever可以同时服务于许多用户,如果你希望你的站点有较高的访问率,MS Access是不能胜任的。
在学习SQL的细节之前,你需要理解它的两大特点。一个特点容易掌握,另一个掌握起来有点困难。
第一个特点是所有SQL数据库中的数据都存储在表中。一个表由行和列组成。例如,下面这个简单的表包括name 和e-mail address:
Name Email Address
................................................................
Bill Gates billg@microsoft.com
president Clinton president@whitehouse.com
Stephen Walther swalther@somewhere.com
这个表有两列(列也称为字段,域〕:Name和Email Address。有三行,每一行包含一组数据。
一行中的数据组合在一起称为一条记录。无论何时你向表中添加新数据,你就添加了一条新记录。一个数据表可以有几十个记录,也可以有几千甚至几十亿个记录。虽然你也许永远不需要存储十亿个Email地址,但知道你能这样做总是好的,也许有一天你会有这样的需要。
你的数据库很有可能包含几十个表,所有存储在你数据库中的信息都被存储在这些表中。当你考虑怎样把信息存储在数据库中时,你应该考虑怎样把它们存储在表中。SQL的第二个特点有些难于掌握。这种语言被设计为不允许你按照某种特定的顺序来取出记录,因为这样做会降低SQL Sever取记录的效率。使用SQL,你只能按查询条件来读取记录。
当考虑如何从表中取出记录时,自然会想到按记录的位置读取它们。例如,也许你会尝试通过一个循环,逐个记录地扫描,来选出特定的记录。在使用SQL时,你必须训练自己,不要有这种思路。
假如你想选出所有的名字是“Bill Gates”的记录,如果使用传统的编程语言,你也许会构造一个循环,逐个查看表中的记录,看名字域是否是“Bill Gates”。这种选择记录的方法是可行的,但是效率不高。使用SQL,你只要说,“选择所有名字域等于Bill Gates的记录”,SQL就会为你选出所有符合条件的记录。SQL会确定实现查询的最佳方法。建设你想取出表中的前十个记录。使用传统的编程语言,你可以做一个循环,取出前十个记录后结束循环。但使用标准的SQL查询,这是不可能实现的。从SQL的角度来说,在一个表中不存在前十个记录这种概念。
开始时,当你知道你不能用SQL实现某些你感觉应该能实现的功能,你会受到挫折。你也许会以头撞墙甚至想写恶毒的信件给SQL的设计者们。但后来你会认识到,SQL的这个特点不仅不是个限制,反而是其长处。因为SQL不根据位置来读取记录,它读取记录可以很快。综上所述,SQL有两个特点:所有数据存储在表中,从SQL的角度来说,表中的记录有顺序。在下一节,你将学会怎样用SQL从表中选择特殊的记录。
使用SQL从表中取记录。
SQL的主要功能之一是实现数据库查询。如果你熟悉Internet 引擎,那么你已经熟悉查
询了。你使用查询来取得满足特定条件的信息。例如,如果你想找到有ASP信息的全部站
点,你可以连接到 Yahoo!并执行一个对Active Sever Pages的搜索。在你输入这个查询
后,你会收到一个列表,表中包括所有其描述中包含搜索表达式的站点。
多数Internet 引擎允许逻辑查询。在逻辑查询中,你可以包括特殊的运算符如AND、OR
和NOT,你使用这些运算符来选择特定的记录。例如,你可以用AND来限制查询结果。如
果你执行一个对Active Sever Pages AND SQL的搜索。你将得到其描述中同时包含Acti
ve Sever Pages 和SQL的记录。当你需要限制查询结果时,你可以使用AND。
如果你需要扩展查询的结果,你可以使用逻辑操作符OR。例如,如果你执行一个搜索,
搜索所有的其描述中包含Active Sever Pages OR SQL的站点,你收到的列表中将包括所
有其描述中同时包含两个表达式或其中任何一个表达式的站点。
如果你想从搜索结果中排除特定的站点,你可以使用NOT。例如,查询“Active Sever
Pages ”AND NOT “SQL”将返回一个列表,列表中的站点包含Active Sever Pages,但
不包含SQL。当必须排除特定的记录时,你可以使用NOT。
用SQL执行的查询与用Internet搜索引擎执行的搜索非常相似。 当你执行一个SQL查询时
,通过使用包括逻辑运算符的查询条件,你可以得到一个记录列表。此时查询结果是来
自一个或多个表。
SQL查询的句法非常简单。假设有一个名为email_table 的表,包含名字和地址两个字段
,要得到Bill Gates 的e_mail地址,你可以使用下面的查询:
SELECT email from email_table WHERE name="Bill Gates"
当这个查询执行时,就从名为email_table的表中读取Bill Gates的e_mail 地址。这个
简单的语句包括三部分:
■ SELECT语句的第一部分指名要选取的列。在此例中,只有email列被选取。当执行 时
,只显示email列的值 billg@microsoft.com。
■ SELECTT语句的第二部份指明要从哪个(些)表中查询数据。在此例中,要查询的表
名为email_table 。
■ 最后,SELECT语句的WHERE子句指明要选择满足什么条件的记录。在此例中,查询条
件为只有name列的值为Bill Gates 的记录才被选取。
Bill Gates很有可能拥有不止一个email地址。如果表中包含Bill Gates的多个email地
址。用上述的SELECT语句可以读取他所有的email地址。SELECT语句从表中取出所有nam
e字段值为Bill Gates 的记录的email 字段的值。
前面说过,查询可以在查询条件中包含逻辑运算符。假如你想读取Bill Gates 或Clint
on总统的所有email地址,你可以使用下面的查询语句:
SELECT email FROM email_table WHERE name="Bill Gates" OR
name="president Clinton"
此例中的查询条件比前一个复杂了一点。这个语句从表email_table中选出所有name列为
Bill Gates或president Clinton的记录。如果表中含有Bill Gates或president Clint
on的多个地址,所有的地址都被读取。
SELECT语句的结构看起来很直观。如果你请一个朋友从一个表中为你选择一组记录,你
也许以非常相似的方式提出你的要求。在SQL SELECT语句中,你“SELECT特定的列FROM
一个表WHERE某些列满足一个特定的条件”。
下一节将介绍怎样执行SQL查询来选取记录。这将帮助你熟悉用SELECT语句从表中取数据
的各种不同方法。
使用ISQL执行SELECT查询
当你安装SQL Sever时,你同时安装了一个叫作ISQL/w的应用程序。ISQL/w允许你执行交
互的SQL查询。在把查询包括到你的ASP网页中之前,用ISQL/w对其进行测试是非常有用
的。
注意:
在这本书的第一部份,你学习了怎样安装和配置Microsoft SQL Sever 。如果没有安装
SQL Sever或者SQL Sever不能运行,请参阅第三章“安装和使用SQL Sever”。
选择任务上SQL Sever程序组中的ISQL_w以启动该程序。程序启动时,首先会出现一个对
话框,要求输入服务器信息和登录信息(见图10.1)。在Sever框中,输入你的SQL服务
器的名字。如果服务器正运行在本地计算机上,服务器名字就是你计算机的名字。在登
录信息框中,输入一个登录帐号和密码或选择使用“可信连接”,然后单击Connect按钮
注意:
如果你将SQL Sever配置为使用完整安全或混合安全,那么你可以使用可信连接。如果你
使用标准安全,你则需要提供用户帐号和密码。要了解更多信息,参见第三章。
如果一切正常,在你单击连接按钮后会出现一个查询窗口,如图10.2所示。(如果有异
常,请参考第三章)
在执行查询之前,你需要选择数据库。安装 SQL Sever时你已为自己创建了一个数据库
,
SQL Sever还有许多系统数据库,如master,model,msdb,和tempdb。方便的是,
SQL Sever带有一个特殊的名为pubs的例子数据库。库 pubs中包含供一个虚拟的出版商
使用的各个表。文档中所有的例子程序都是针对这个库来设计的。本书中的
许多例子也使用这个数据库。
在查询窗口顶部的DB下拉框中选择数据库pubs,这样你就选择了数据库。你所有的查询
都将针对这个库中的各个表来执行。现在你可以执行你的第一个查询了。这真让人兴奋
你的第一个查询将针对一个名为autrors的表,表中包含所有为某个虚拟出版商工作的作
者的相关数据。单击查询窗口并输入以下的语句:
SELECT phone FROM authors WHERE au_name="Ringer"
输入完成后,单击执行查询按钮(一个绿色三角形,看起来像VCR播放键)。单击此按钮
后,任何出现在查询窗口中的语句均会被执行。查询窗口会自动变成结果显示窗口,你
可以看到查询的结果(见图10.3)。
你看到的查询结果也许与图10.3所示的不同。在SQL Sever的不同版本中,库pubs中的数
据会有所不同。对SQL Sever 6.5来说,将会找到两条记录。结果显示窗口中应显示如下
内容:
phone
……………….
801 826_0752
801 826_0752
(2 row(s) affected)
你所执行的SELECT语句从表authors中取出所有名字为Ringer的作者的电话号码。你通过
在WHERE子句中使用特殊的选择条件来限制查询的结果。你也可以忽略选择条件,从表中
取出所有作者的电话号码。要做到这一点,单击Query标签,返回到查询窗口,输入以下
的SELECT语句:
SELECT Phone FROM authors
这个查询执行后,会取出表authors中的所有电话号码(没有特定的顺序)。如果表aut
hors中包含一百个电话号码,会有一百个记录被取出,如果表中有十亿个电话号码,这
十亿条记录都会被取出(这也许需要一些时间)。
表authrs的字段包括姓,名字,电话号码,地址,城市,州和邮政编码。通过在SELECT
语句的第一部份指定它们,你可以从表中取出任何一个字段。你可以在一个SELECT语句
中一次取出多个字段,比如:
SELECT au_fname ,au_lname, phone FROM authors
这个SELECT语句执行后,将取出这三个列的所有值。下面是这个查询的结果的一个示例
(为了节省纸张,只显示查询结果的一部分,其余记录用省略号代替):
au_fname au_lname phone
………………………………………………………………………….
Johnson White 408 496_7223
Marjorie Green 415 986_7020
Cheryl Carson 415 548_7723
Michael O’Leary 408 286_2428
…
(23 row(s) affected)
在SELECT语句中,你需要列出多少个字段,你就可以列出多少。不要忘了把字段名用逗
号隔开。你也可以用星号(*)从一个表中取出所有的字段。这里有一个使用星号的例子
:
SELECT * FROM authors
这个SELECT语句执行后,表中的所有字段的值都被取出。你会发现你将在SQL查询中频繁
使用星号。
技巧:
你可以使用星号来查看一个表的所有列的名字。要做到这一点,只需要在执行完SELECT
语句后看一下查询结果的列标题。
操作多个表
到现在为止,你只尝试了用一句SQL查询从一个表中取出数据。你也可以用一个SELECT语
句同时从多个表中取出数据,只需在SELECT语句的FROM从句中列出要从中取出数据的表
名称即可:
SELECT au_lname ,title FROM authors, titles
这个SELECT语句执行时,同时从表authors和表titles中取出数据。从表authors中取出
所有的作者名字,从表titles中取出所有的书名。在ISQL/w程序中执行这个查询,看一
下查询结果。你会发现一些奇怪的出乎意料的情况:作者的名字并没有和它们所著的书
相匹配,而是出现了作者名字和书名的所有可能的组合,这也许不是你所希望见到的。
出了什么差错?问题在于你没有指明这两个表之间的关系。你没有通过任何方式告诉SQ
L如何把表和表关联在一起。由于不知道如何关联两个表,服务器只能简单地返回取自两
个表中的记录的所有可能组合。
要从两个表中选出有意义的记录组合,你需要通过建立两表中字段的关系来关联两个表
。要做到这一点的途径之一是创建第三个表,专门用来描述另外两个表的字段之间的关
系。
表authors有一个名为au_id的字段,包含有每个作者的唯一标识。表titles有一个名为
title_id的字段,包含每个书名的唯一标识。如果你能在字段au_id和字段title_id 之
间建立一个关系,你就可以关联这两个表。数据库pubs中有一个名为titleauthor的表,
正是用来完成这个工作。表中的每个记录包括两个字段,用来把表titles和表authors关
联在一起。下面的SELECT语句使用了这三个表以得到正