快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

214金沙娱城手机app下载_机器人论坛网



本章内容

SQL先容

应用SELECT 语句从表中取数据

创建新表

字段属性

向表中添加数据

删除和改动表

为了建立交互站点,你必要应用数据库来存储来自造访者的信息。例如,你要建立一个职业先容办事的站点,你就必要存储诸如小我简历,所感兴趣的事情等等这样的信息。创建动态网叶也必要应用数据库,假如你想显示相符来访者要求的最好的事情,你就必要从数据库中掏出这份事情的信息。你将会发明,在许多环境下必要应用数据库。

在这一章里,你将学会如何应用“布局化查询说话”(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地214金沙娱城手机app下载址,但知道你能这样做老是好的,大概有一天你会有这样的必要。

你的数据库很有可能包孕几十个表,所有存储在你数据库中的信息都被存储在这些表中。当你斟酌如何把信息存储在数据库中时,你应该斟酌如何把它们存储在表中。

SQL的第二个特征有些难于掌握。这种说话被设计为不容许你按照某种特定的顺序来掏出记录,由于这样做会低落SQL Sever取记录的效率。应用SQL,你只能按查询前提来读取记录。

当斟酌若何从表中掏出记录时,自然会想到按记录的位置读取它们。例如,大概你会考试测验经由过程一个轮回,逐个记录地扫描,来选出特定的记录。在应用SQL时,你必须练习自己,不要有这种思路。

要是你想选出所有的名字是“Bill Gates”的记录,假如应用传统的编程说话,你大概会构造一个轮回,逐个查看表中的记录,看名字域是否是“Bill Gates”。

这种选择记录的措施是可行的,然则效率不高。应用SQL,你只要说,“选择所着名字域即是Bill Gates的记录”,SQL就会为你选出所有相符前提的记录。SQL会确定实现查询的最佳措施。

扶植你想掏出表中的前十个记录。应用传统的编程说话,你可以做一个轮回,掏出前十个记录后停止轮回。但应用标准的SQL查询,这是弗成能实现的214金沙娱城手机app下载。从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的搜索。你将获得其描述中同时包孕Active 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语句从表中掏出所有name字段值为Bill Gates 的记录的email 字段的值。

前面说过,查询可以在查询前提中包孕逻辑运算符。要是你想读取Bill Gates 或Clinton总统的所有email地址,你可以应用下面的查询语句:

SELECT email FROM email_table WHERE name="Bill Gates" OR

name="president Clinton"

此例中的查询前提比前一个繁杂了一点。这个语句从表email_table中选出所有name列为Bill Gates或president Clinton的记录。假如表中含有Bill Gates或president Clinton的多个地址,所有的地址都被读取。

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按钮。

图10。1

留意:

假如你将SQL Sever设置设置设备摆设摆设为应用完备安然或混杂安然,那么你可以应用可托连接。假如你应用标准安然,你则必要供给用户帐号和密码。要懂得更多信息,拜见第三章。

假如统统正常,在你单击连接按钮后会呈现一个查询窗口,如图10.2所示。(假如有非常,请参考第三章)

图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)

图10.3

你所履行的SELECT语句从表authors中掏出所着名字为Ringer的作者的电话号码。你经由过程在WHERE子句中应用特殊的选择前提来限定查询的结果。你也可以轻忽选择前提,从表中掏出所有作者的电话号码。要做到这一点,单击Query标签,返回到查询窗口,输入以下的SELE214金沙娱城手机app下载CT语句:

SELECT Phone FROM authors

这个查询履行后,会掏出表authors中的所有电话号码(没有特定的顺序)。假如表authors中包孕一百个电话号码,会有一百个记录被掏出,假如表中有十亿个电话号码,这十亿笔记录都邑被掏出(这大概必要一些光阴)。

表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语句中214金沙娱城手机app下载,你必要列出若干个字段,你就可以列出若干。不要忘了把字段名用逗号隔开。你也可以用星号(*)从一个表中掏出所有的字段。这里有一个应用星号的例子:

SELECT * FROM authors

这个SELECT语句履行后,表中的所有字段的值都被掏出。你会发明你将在SQL查询中频繁应用星号。

技术:

你可以应用星号来查看一个表的所有列的名字。要做到这一点,只必要在履行完SELECT语句后看一下查询结果的列标题。

操作多个表

到现在为止,你只考试测验了用一句SQL查询从一个表中掏出数据。你也可以用一个SELECT语句同时从多个表中掏出数据,只需在SELECT语句的FROM从句中列出要从中掏出数据的表名称即可:

SELECT au_lname ,title FROM authors, titles

这个SELECT语句履行时,同时从表authors和表titles中掏出数据。从表authors中掏出所有的作者名字,从表titles中掏出所有的书名。在ISQL/w法度榜样中履行这个查询,看一下查询结果。你会发明一些稀罕的出乎料想的环境:作者的名字并没有和它们所著的书相匹配,而是呈现了作者名字和书名的所有可能的组合,这大概不是你所盼瞥见到的。

出了什么缺点?问题在于你没有指明这两个表之间的关系。你没有经由过程任何要领奉告SQL若何把表和表关联在一路。因为不知道若何关联两个表,办事器只能简单地返回取自两个表中的记录的所有可能组合。

要从两个表中选出故意义的记录组合,你必要经由过程建立两表中字段的关系来关联两个表。要做到这一点的道路之一是创建第三个表,专门用来描述别的两个表的字段之间的关系。

表authors有一个名为au_id的字段,包孕有每个作者的独一标识。表titles有一个名为title_id的字段,包孕每个书名的独一标识。假如你能在字段au_id和字段title_id 之间建立一个关系,你就可以关联这两个表。数据库pubs中有一个名为titleauthor的表,恰是用来完成这个事情。表中的每个记录包括两个字段,用来把表titles和表authors关联在一路。下面的SELECT语句应用了这三个表以获得精确的结果:

SELECT au_name,title FROM authors,titles,titleauthor

WHERE authors.au_id=titleauthor.au_id

AND titles.title_id=titleauthor.title_id

当这个SELECT语句履行时,每个作者都将与精确的书名相匹配。表titleauthor指清楚明了表authors和表titles的关系,它经由过程包孕分手来自两个表的各一个字段实现这一点。第三个表的独一目的是在别的两个表的字段之间建立关系。它本身不包孕任何附加数据。

留意在这个例子中字段名是若何书写的。为了差别表authors和表titles中相同的字段名au_id,每个字段名前面都加上了表名前缀和一个句号。名为author.au_id 的字段属于表authors,名为titleauthor.au_id的字段属于表titleauthor,两者不会肴杂。

经由过程应用第三个表,你可以在两个表的字段之间建立各类类型的关系。例如,一个作者大概写了许多不合的书,或者一本书大概由许多不合的作者合营完成。当两个表的字段之间有这种“多对多”的关系时,你必要应用第三个表来指明这种关系。

然则,在许多环境下,两个表之间的关系并不繁杂。比如你必要指明表titles和表publishers之间的关系。由于一个书名弗成能与多个出版商相匹配,你不必要经由过程第三个表来指明这两个表之间的关系。要指明表titles和表publishers之间的关系,你只要让这两个表有一个公共的字段就可以了。在数据库pubs中,表titles和表publishers都有一个名为pub_id的字段。假如你想获得书名及其出版商的一个列表,你可以应用如下的语句:

SELECT title,pub_name FROM titles,publishers

WHERE titles.pub_id=publishers.pub_id

当然,假如一本书是由两个出版商联合出版的,那么你必要第三个表来代表这种关系。

平日,当你予先知道两个表的字段间存在“多对多”关系时,就应用第三个表来关联这两个表。反之,假如两个表的字段间只有“一对一”或“一对多”关系,你可以应用公共字段来关联它门。

操作字段

平日,当你从一个表中掏出字段值时,该值与创建该表时所定义的字段名联系在一路。假如你从表authors中选择所有的作者名字,所有的值将会与字段名au_lname相联系。然则在某些环境下,你必要对字段名进行操作。在SELECT语句中,你可以在缺省字段名后面仅跟一个新名字来取代它。例如,可以用一个更直不雅易读的名字Author Last Name来代替字段名au_lname:

SELECT au_lname "Author Last Name" FROM authors

当这个SELECT语句履行时,来自字段au_lname的值会与“Author Last Name”相联系。查询结果可能是这样:

Author Last Name

……………………………………………………………………..

White

Green

Carson

O’Leary

Straight

(23 row(s) affected)

留意字段标题不再是au_lname,而是被Author Last Name所取代。

你也可以经由过程执交运算,来操作从一个表返回的字段值。例如,假如你想把表titles中的所有书的价格越发,你可以应用下面的SELECT语句:

SELECT price*2 FROM titles

当这个查询履行时,每本书的价格从表中掏出时都邑越发。然则,经由过程这种道路操作字段不会改变存储在表中的书价。对字段的运算只会影响SELECT语句的输出,而不会影响表中的数据。为了同时显示书的原始价格和涨价后的新价格,你可以应用下面的查询:

SELECT price "Original price", price*2 "New price" FROM titles

当数据从表titles中掏出时,原始价格显示在标题Original price下面,越发后的价格显示在标题New price下面。结果可能是这样:

original price new price

……………………………………………………………….

19.99 39.98

11.95 23.90

2.99 5.98

19.99 39.98

(18 row(s) affected)

你可以应用大年夜多半标准的数学运算符来操作字段值,如加(+),减(-),乘(*)和除(/)。你也可以一次对多个字段进交运算,例如:

SELECT price*ytd_sales "total revenue" FROM titles

在这个例子中,经由过程把价格与贩卖量相乘,谋略出了每种书的总贩卖额。这个SELECT语句的结果将是这样的:

total revenue

……………………………………………..

81,859,05

46,318,20

55,978,78

81,859,05

40,619,68

(18 row(s) affected)

着末,你还可以应用连接运算符(它看起来像个加号)来连接两个字符型字段:

SELECT au_fname+" "+au_lname "author name" FROM authors

在这个例子中,你把字段au_fname和字段au_lname粘贴在一路,中心用一个逗号 隔开,并把查询结果的标题指定为author name。这个语句的履行结果将是这样的:

author names

…………………………………………………………

Johnson White

Marjorie Green

Cheryl Carson

Michael O’Leary

Dean Straight

(23 row(s) affected)

可以看到,SQL为你供给了对查询结果的许多节制。你应该在ASP编程历程中充分使用这些优点。应用SQL来操作查询结果险些老是比应用有同样感化的脚本效率更高。

排序查询结果

本章的先容中曾强调过,SQL表没有内在的顺序。例如,从一个表中取第二个记录是没故意义的。从SQL的角度看来,没有一个记录在任何其他记录之前。

然而,你可以操纵一个SQL查询结果的顺序。在缺省环境下,当记录从表中掏出时,记录不以特定的顺序呈现。例如,当从表authors中掏出字段au_lname时,查询结果显示成这样:

au_lname

…………………………………….

White

Green

Carson

O’Leary

Straight

(23 row(s) affected)

看一列没有特定顺序的名字是很未方便的。假如把这些名字按字母顺序排列,读起来就会轻易得多。经由过程应用ORDER BY子句,你可以强制一个查询结果按升序排列,就像这样:

SELECT au_lname FROM authors ORDER BY au_lname

当这个SELECT语句履行时,作者名字的显示将按字母顺序排列。ORDER BY子句将作者名字按升序排列。

你也可以同时对多个列应用ORDER BY子句。例如,假如你想同时按升序显示字段au_lname和字段au_fname,你必要对两个字段都进行排序:

SELECT au_lname,au_fname FROM authors ORDER BY au_lname ,au_fname

这个查询首先把结果按au_lname字段进行排序,然后按字段au_fname排序。记录将按如下的顺序掏出:

au_lname au_fname

…………………………………………………………………….

Bennet Abraham

Ringer Albert

Ringer Anne

Smith Meander

(23 row(s) affected)

留意有两个作者有相同的名字Ringer。名为Albert Ringer的作者呈现名为Anne Ringer的作者之前,这是由于姓Albert按字母顺序应排在姓Anne之前。

假如你想把查询结果按相反的顺序排列,你可以应用关键字DESC。关键字DESC把查询结果按降序排列,如下例所示:

SELECT au_lname,au_fname FROM authors

WHERE au_lname=”Ringer” ORDER BY au_lname ,au_fname DESC

这个查询从表authors中掏出所着名字为Ringer的作者记录。ORDER BY子句根据作者的名字和姓,将查询结果按降序排列。结果是这样的:

au_lname au_fname

……………………………………………………………………………………….

Ringer Anne

Ringer Albert

(2 row(s) affectec)

留意在这个表中,姓Anne呈现在姓Albert之前。作者名字按降序显示。

你也可以按数值型字段对一个查询结果进行排序。例如,假如你想按降序掏出所有书的价格,你可以应用如下的SQL查询:

SELECT price FROM titles ORDER BY price DESC

这个SELECT语句从表中掏出所有书的价格,显示结果时,价格低的书先显示,价格高的书后显示。

警告:

不是分外必要时,不要对查询结果进行排序,由于办事器完成这项事情要费些力气。这意味着带有ORDER BY 子句的SELECT语句履行起来比一样平常的SELECT语句花的光阴长。

掏出互不相同的记录

一个表有可能在同一列中有重复的值。例如,数据库pubs的表authors中有两个作者的名字是Ringer。假如你从这个表中掏出所有的名字,名字Ringer将会显示两次。

在特定环境下,你可能只有兴趣从一个表中掏出互不相同的值。假如一个字段有重复的值,你大概盼望每个值只当拔取一次,你可以应用关键字DISTINCT来做到这一点:

SELCET DISTINCT au_lname FROM authors WHERE au_lname="Ringer"

当这个SELECT语句履行时,只返回一个记录。经由过程在SELECT语句中包孕关键字DISTINCT,你可以删除所有重复的值。例如,假设有一个关于新闻组信息宣布的表,你想掏出所有曾在这个新闻组中宣布信息的人的名字,那么你可以应用关键字DISTINCT。每个用户的名字只取一次——只管有的用户宣布了不止一篇信息。

警告:

犹如ORDER BY子句一样,强制办事器返回互不相同的值也会增添运行开销。福分不得不花费一些光阴来完成这项事情。是以,不是必须的时刻不要应用关键字DISTINCT。

创建新表

前面说过,数据库中的所稀有据存储在表中。数据表包括行和列。列抉择了表中数据的类型。行包孕了实际的数据。

例如,数据库pubs中的表authors有九个字段。此中的一个字段名为为au_lname,这个字段被用来存储作者的名字信息。每次向这个表中添加新作者时,作者名字就被添加到这个字段,孕育发生一条新记录。

经由过程定义字段,你可以创建一个新表。每个字段有一个名字和一个特定的数据类型(数据类型在后面的“字段类型”一节中讲述),例如字段au_lname存储的是字符型数据。一个字段也可以存储其它类型的数据。

应用SQL Sever,创建一个新表的措施是很多的。你可以可履行一个SQL语句或应用SQL事务治理器(SQL Enterprise Manager)来创建一个新表。鄙人一节里,你将学会若何用SQL语句来创建一个新表。

用SQL创建新表

留意:

假如你还没有建立自己的数据库,现在就跳回到第三章创建这个库。你毫不能向master,tempdb或任何其他任何系统数据库中添加数据。

从SQL Sever法度榜样组(在义务栏中)中启动ISQL/w法度榜样。呈现查询窗口后,从窗口顶部的下拉列表中选择你在第三章所创建的数据库。下一步,在查询窗口中键入下面的SQL语句,单击履行查询按钮,履行这个语句:

CREATE TABLE guestbook (visitor VARCHAR(40),comments TEXT,entrydate

DATETIME)

假如统统正常,你会在结果窗口中看到如下的翰墨(假如呈现非常,请参阅第三章):

This command dit not return data ,and it did not return any rows

祝贺你,你已经建立了你的第一个表!

你所创建的表名为guestbook,你可以应用这个表来存储来字你站点造访者的信息。你是用REEATE TABLE语句创建的这个表,这个语句有两部分:第一部份指定表的名子;第二部份是括在括号中的各字段的名称和属性,互相之间用逗号隔开。

表guestbook有三个字段:visitor,comments 和entrydate。visitor字段存储造访者的名字,comments字段存储造访者对你站点的意见,entrydate字段存储造访者造访你站点的日期和光阴。

留意每个字段名后面都跟有一个专门的表达式。例如,字段名comments后面跟有表达式TEXT。这个表达式指定了字段的数据类型。数据类型抉择了一个字段可以存储什么样的数据。由于字段comments包孕文本信息,其数据类型定义为文本型。

字段有许多不合的数据类型。下一小节讲述SQL所支持的一些紧张的数据类型。

字段类型

不合的字段类型用来寄放不合类型的数据。创建和应用表时,更你应该理解五种常用的字段类型:字符型,文本型,数值型,逻辑性和日期型。

字符型数据

字符型数据异常有用。当你必要存储短的字符串信息时,你老是要用到字符型数据。例如,你可以把从HTML form的文本框中汇集到的信息放在字符型字段中。

要建立一个字段用来寄放可变长度的字符串信息,你可以应用表达式 VARCHAR。斟酌你前面创建的表guestbook:

CREATE TABLE guestbook (visitor VARCHAR(40),comments TEXT,entrydate

DATETIME)

在这个例子中,字段visitor的数据类型为VARCHAR。留214金沙娱城手机app下载意跟在数据类型后面的括号中的数字。这个数字指定了这个字段所容许寄放的字符串的最大年夜长度。在这个例子中,字段visitor能寄放的字符串最长为四十个字符。假如名字太长,字符串会被截断,只保留四十个字符。

VARCHAR类型可以存储的字符串最长为255个字符。要存储更长的字符串数据,可以应用文本型数据(下一节中讲述)。

另一种字符型数据用来存储固定长度的字符数据。下面是一个应用这种数据类型的例子:

CREATE TABLE guestbook (visitor CHAR(40),comments TEXT,entrydate

DATETIME)

在这个例子中,字段visitor被用来存储四十个字符的固定长度字符串。表达式CHAR指定了这个字段应该是固定长度的字符串。

VARCHAR型和CHAR型数据的这个区别是细微的,然则异常紧张。要是你向一个长度为四十个字符的VARCHAR型字段中输入数据Bill Gates。当你今后从这个字段中掏出此数据时,你掏出的数据其长度为十个字符——字符串Bill Gates的长度。

现在要是你把字符串输入一个长度为四十个字符的CHAR型字段中,那么当你掏出数据时,所掏出的数据长度将是四十个字符。字符串的后面会被附加多余的空格。

当你建立自己的站点时,你会发明应用VARCHAR型字段要比CHAR型字段方便的多。应用VARCHAR型字段时,你不必要为剪掉落你数据中多余的空格而费神。

VARCHAR型字段的另一个凸起的好处是它可以比CHAR型字段占用更少的内存和硬盘空间。当你的数据库很大年夜时,这种内存和磁盘空间的节省会变得异常紧张。

文本型数据

字符型数据限定了字符串的长度不能跨越255个字符。而应用文本型数据,你可以寄放跨越二十亿个字符的字符串。当你必要存储大年夜串的字符时,应该应用文本型数据。

这里有一个应用文本型数据的例子:

CREATE TABLE guestbook (visitor VARCHAR(40),comments TEXT,entrydate

DATETIME)

在这个例子中,字段comments被用来寄放造访者对你站点的意见。留意文本型数据没有长度,而上一节中所讲的字符型数据是有长度的。一个文本型字段中的数据平日要么为空,要么很大年夜。

当你从HTML form的多行文本编辑框(TEXTAREA)中网络数据时,你应该把网络的信息存储于文本型字段中。然则,无论何时,只要你能避免应用文本型字段,你就应该不适用它。文本型字段既大年夜且慢,滥用文本型字段会使办事器速率变慢。文本型字段还会吃掉落大年夜量的磁盘空间。

警告:

一旦你向文本型字段中输入了任何数据(以致是空值),就会有2K的空间被自动分配给该数据。除非删除该记录,否则你无法收回这部分存储空间。

数值型数据

SQL Sever支持许多种不合的数值型数据。你可以存储整数、小数、和钱数。

平日,当你必要在表中的寄放数字时,你要应用整型(INT)数据。INT型数据的表数范围是从-2,147,483,647到2,147,483,647的整数。下面是一个若何应用INT型数据的例子:

CREATE TABLE visitlog (visitor VARCHAR(40),numvisits INT)

这个表可以用来记录你站点被造访的次数。只要没有人造访你的站点跨越2,147,483,647次,nubvisits字段就可以存储造访次数。

为了节省内存空间,你可以应用SMALLINT型数据。SMALLINT 型数据可以存储从-32768到32768的整数。这种数据类型的应用措施与INT型完全相同。

着末,假如你其实必要节省空间,你可以应用TINYINT型数据。同样,这种类型的应用措施也与INT型相同,不合的是这种类型的字段只能存储从0到255的整数。TINYINT型字段不能用来存储负数。

平日,为了节省空间,应该尽可能的应用最小的整型数据。一个TINYINT型数据只占用一个字节;一个INT型数据占用四个字节。这看起来彷佛区别不大年夜,然则在对照大年夜的表中,字节数的增长是很快的。另一方面,一旦你已经创建了一个字段,要改动它是很艰苦的。是以,为安然起见,你应该猜测以下,一个字段所必要存储的数值最大年夜有可能是多大年夜,然后选择适当的数据类型。

为了能对字段所寄放的数据有更多的节制,你可以应用NUMERIC型数据来同时表示一个数的整数部分和小数部分。NUMERIC型数据使你能表示异常大年夜的数——比INT型数据要大年夜得多。一个NUMERIC型字段可以存储从-1038到1038范围内的数。NUMERIC型数据还使你能表示有小数部分的数。例如,你可以在NUMERIC型字段中存储小数3.14。

当定义一个NUMERIC型字段时,你必要同时指定整数部分的大年夜小和小数部分的大年夜小。这里有一个应用这种数据类型的例子:

CREATE TABLE numeric_data (bignumber NUMERIC(28,0),

fraction NUMERIC (5,4) )

当这个语句履行时,将创建一个名为numeric_data的包孕两个字段的表。字段bignumber可以存储直到28位的整数。字段fraction可以存储有五位整数部分和四位小数部分的小数。

一个NUMERIC型数据的整数部分最大年夜只能有28位,小数部分的位数必须小于或即是整数部分的位数,小数部分可所以零。

你可以应用INT型或NUMERIC型数据来存储钱数。然则,专门有别的两种数据类型用于此目的。假如你盼望你的网点能挣很多钱,你可以应用MONEY型数据。假如你的野心不大年夜,你可以应用SMALLMONEY型数据。MONEY型数据可以存储从-922,337,203,685,477.5808到922,337,203,685,477.5807的钱数。假如你必要存储比这还大年夜的金额,你可以应用NUMERIC型数据。

SMALLMONEY型数据只能存储从-214,748.3648到214,748.3647 的钱数。同样,假如可以的话,你应该用SMALLMONEY型来代替MONEY型数据,以节省空间。下面的例子显示了若何应用这两种表示钱的数据类型:

CREATE TABLE products (product VARCHAR(40),price MONEY,

Discount_price SMALLMONEY)

这个表可以用来存储商品的折扣和通俗售价。字段price 的数据类型是MONEY,字段discount_price的数据类型是SMALLMONEY。

存储逻辑值

假如你应用复选框(CHECKBOX)从网页中汇集信息,你可以把此信息存储在BIT型字段中。BIT型字段只能取两个值:0或1。这里有一个若何应用这种字段的例子:

CREATE TABLE opinion (visitor VARCHAR(40),good BIT)

这个表可以用来寄放对你的网点进行夷易近意查询造访所得的信息。造访者可以投票表示他们是否爱好你的网点。假如他们投YES,就在BIT型字段中存入1。反之,假如他们投NO,就在字段中存入0(鄙人一章里,你将学会若何谋略投票)。

警惕,在你创建好一个表之后,你不能向表中添加BIT型字段。假如你盘算在一个表中包孕BIT型字段,你必须在创建表时完成。

存储日期和光阴

当你建立一个网点时,你大概必要记录在一段光阴内的造访者数量。为了能够存储日期和光阴,你必要应用DATETIME型数据,如下例所示:

CREATE TABL visitorlog( visitor VARCHAR (40), arrivaltime DATETIME ,

departuretime DATETIME)

这个表可以用来记录造访者进入和脱离你网点的光阴和日期。一个DATETIME型的字段可以存储的日期范围是从1753年1月1日第一毫秒到9999年12月31日着末一毫秒。

假如你不必要覆盖这么大年夜范围的日期和光阴,你可以应用SMALLDATETIME型数据。它与DATETIME型数据同样应用,只不过它能表示的日期和光阴范围比DATETIME型数据小,而且不如DATETIME型数据正确。一个SMALLDATETIME型的字段能够存储从1900年1月1日到2079年6月6日的日期,它只能正确到秒。

DATETIME型字段在你输入日期和光阴之前并不包孕实际的数据,熟识这一点是紧张的。鄙人一章,你将进修如何应用大年夜量的SQL函数来读取和操作日期和光阴(拜见下面的“缺省值”一节)。你也可以在VBScript和JScript 中应用日期和光阴函数来向一个DATETIME型字段中输入日期和光阴。

字段属性

上一节先容了若何建立包孕不合类型字段的表。在这一节中,你将学会若何应用字段的三个属性。这些属性容许你节制空值,缺省值和标识值。

容许和禁止空值

大年夜多半字段可以吸收空值(NULL)。当一个字段吸收了空值后,假如你不改变它,它将不停维持空值。空值(NULL)和零是不合的,严格的说,空值表示没有任何值。

为了容许一个字段吸收空值,你要在字段定义的后面应用表达式NULL。例如,下面的表中两个字段都容许吸收空值:

CREATE TABLE empty (empty1 CHAR (40) NULL,empty2 INT NULL(

留意:

BIT型数据不能是空值。一个这种类型的字段必须取0或者1。

无意偶尔你必要禁止一个字段应用空值。例如,假设有一个表存储着信用卡号码和信用卡有效日期,你不会盼望有人输入一个信用卡号码但不输入有效日期。为了强制两个字段都输入数据,你可以用下面的措施建立这个表:

CREATE TABLE creditcards (creditcard_number CHAR(20) NOT NULL,

Creditcard_expire DATETIME NOT NULL)

留意字段定义的后面跟有表达式NOT NULL。经由过程包孕表达式NOT NULL,你可以禁止任何人只在一个字段中插入数据,而不输入另一个字段的数据。

你将会发明,在你扶植自己的网点历程中,这种禁止空值的能力是异常有用的。假如你指定一个字段不能吸收空值,那么当你试图输入一个空值时,会有差错警告。这些差错警告可以为法度榜样调试供给有代价的线索。

缺省值

假设有一个存储地址信息的表,这个表的字段包括街道、城市、州、邮政编码和国家。假如你估计地址的大年夜部分是在美国,你可以把这个值作为country字段的缺省值。

为了在创建一个表时指定缺省值,你可以应用表达式DEFAULT。请看下面这个在创建表时应用缺省值的例子:

CREATE TABLE addresses (street VARCHAR(60) NULL,

city VARCHAR(40) NULL,

state VARCHAR(20) NULL

zip VARCHAR(20) NULL,

country VARCHAR(30) DEFAULT ‘USA’)

在这个例子中,字段country的缺省值被指定为美国。留意单引号的应用,引号指明这是字符型数据。为了给非字符型的字段指定缺省值,不要把该值扩在引号中:

CREATE TABLE orders(price MONEY DEFAULT $38.00,

您可能还会对下面的文章感兴趣: