关闭

关闭

关闭

封号提示

内容

首页 SQL语法大全中文版.pdf

SQL语法大全中文版.pdf

SQL语法大全中文版.pdf

上传者: coffeebear 2010-12-18 评分 0 0 0 0 0 0 暂无简介 简介 举报

简介:本文档为《SQL语法大全中文版pdf》,可适用于IT/计算机领域,主题内容包含第三部分操作数据:SQL本部分内容nSQL基础n中级SQLn高级SQL第章SQL基础本章内容SQL介绍使用SELECT语句从表中取数据创建新表字段属符等。

第三部分操作数据:SQL本部分内容nSQL基础n中级SQLn高级SQL第章SQL基础本章内容SQL介绍使用SELECT语句从表中取数据创建新表字段属性向表中添加数据删除和修改表为了建立交互站点你需要使用数据库来存储来自访问者的信息。例如你要建立一个职业介绍服务的站点你就需要存储诸如个人简历所感兴趣的工作等等这样的信息。创建动态网叶也需要使用数据库如果你想显示符合来访者要求的最好的工作你就需要从数据库中取出这份工作的信息。你将会发现在许多情况下需要使用数据库。在这一章里你将学会怎样使用“结构化查询语言”(SQL〕来操作数据库。SQL语言是数据库的标准语言。在ActiveSeverPages中无论何时你要访问一个数据库你就要使用SQL语言。因此掌握好SQL对ASP编程是非常重要的。注意:你可以把“SQL”读作“sequel”也可以按单个字母的读音读作S-Q-L。两种发音都是正确的每种发音各有大量的支持者。在本书里认为“SQL”读作“sequel”。通过这一章的学习你将理解怎样用SQL实现数据库查询你将学会怎样使用这种查询从数据表中取出信息最后你将学会怎样设计和建立自己的数据库。注意:通过下面几章对SQL的介绍你将对SQL有足够的了解从而可以有效地使用ActiveSeverPages。但是SQL是一种复杂的语言本书不可能包括它的全部细节。要全面掌握SQL语言你需要学习在MicrosoftSQLSever中使用SQL。你可以到附近的书店去买一本MicrosoftSQLSever。SQL介绍:本书假设你是在SQL操作MicrosoftSQLSever的数据库。你也可以用SQL操作许多其它类型的数据库。SQL是操作数据库的标准语言。(事实上关于SQL语言有一个专门的ANSI标准〕注意:不要在你的站点上试图用MicrosoftAccess代替MicrosoftSQLSever。SQLSever可以同时服务于许多用户如果你希望你的站点有较高的访问率MSAccess是不能胜任的。在学习SQL的细节之前你需要理解它的两大特点。一个特点容易掌握另一个掌握起来有点困难。第一个特点是所有SQL数据库中的数据都存储在表中。一个表由行和列组成。例如下面这个简单的表包括name和emailaddress:NameEmailAddressBillGatesbillgmicrosoftcompresidentClintonpresidentwhitehousecomStephenWaltherswalthersomewherecom这个表有两列(列也称为字段域〕:Name和EmailAddress。有三行每一行包含一组数据。一行中的数据组合在一起称为一条记录。无论何时你向表中添加新数据你就添加了一条新记录。一个数据表可以有几十个记录也可以有几千甚至几十亿个记录。虽然你也许永远不需要存储十亿个Email地址但知道你能这样做总是好的也许有一天你会有这样的需要。你的数据库很有可能包含几十个表所有存储在你数据库中的信息都被存储在这些表中。当你考虑怎样把信息存储在数据库中时你应该考虑怎样把它们存储在表中。SQL的第二个特点有些难于掌握。这种语言被设计为不允许你按照某种特定的顺序来取出记录因为这样做会降低SQLSever取记录的效率。使用SQL你只能按查询条件来读取记录。当考虑如何从表中取出记录时自然会想到按记录的位置读取它们。例如也许你会尝试通过一个循环逐个记录地扫描来选出特定的记录。在使用SQL时你必须训练自己不要有这种思路。假如你想选出所有的名字是“BillGates”的记录如果使用传统的编程语言你也许会构造一个循环逐个查看表中的记录看名字域是否是“BillGates”。这种选择记录的方法是可行的但是效率不高。使用SQL你只要说“选择所有名字域等于BillGates的记录”SQL就会为你选出所有符合条件的记录。SQL会确定实现查询的最佳方法。建设你想取出表中的前十个记录。使用传统的编程语言你可以做一个循环取出前十个记录后结束循环。但使用标准的SQL查询这是不可能实现的。从SQL的角度来说在一个表中不存在前十个记录这种概念。开始时当你知道你不能用SQL实现某些你感觉应该能实现的功能你会受到挫折。你也许会以头撞墙甚至想写恶毒的信件给SQL的设计者们。但后来你会认识到SQL的这个特点不仅不是个限制反而是其长处。因为SQL不根据位置来读取记录它读取记录可以很快。综上所述SQL有两个特点:所有数据存储在表中从SQL的角度来说表中的记录没有顺序。在下一节你将学会怎样用SQL从表中选择特殊的记录。使用SQL从表中取记录。SQL的主要功能之一是实现数据库查询。如果你熟悉Internet引擎那么你已经熟悉查询了。你使用查询来取得满足特定条件的信息。例如如果你想找到有ASP信息的全部站点你可以连接到Yahoo!并执行一个对ActiveSeverPages的搜索。在你输入这个查询后你会收到一个列表表中包括所有其描述中包含搜索表达式的站点。多数Internet引擎允许逻辑查询。在逻辑查询中你可以包括特殊的运算符如AND、OR和NOT你使用这些运算符来选择特定的记录。例如你可以用AND来限制查询结果。如果你执行一个对ActiveSeverPagesANDSQL的搜索。你将得到其描述中同时包含ActiveSeverPages和SQL的记录。当你需要限制查询结果时你可以使用AND。如果你需要扩展查询的结果你可以使用逻辑操作符OR。例如如果你执行一个搜索搜索所有的其描述中包含ActiveSeverPagesORSQL的站点你收到的列表中将包括所有其描述中同时包含两个表达式或其中任何一个表达式的站点。如果你想从搜索结果中排除特定的站点你可以使用NOT。例如查询“ActiveSeverPages”ANDNOT“SQL”将返回一个列表列表中的站点包含ActiveSeverPages但不包含SQL。当必须排除特定的记录时你可以使用NOT。用SQL执行的查询与用Internet搜索引擎执行的搜索非常相似。当你执行一个SQL查询时通过使用包括逻辑运算符的查询条件你可以得到一个记录列表。此时查询结果是来自一个或多个表。SQL查询的句法非常简单。假设有一个名为emailtable的表包含名字和地址两个字段要得到BillGates的email地址,你可以使用下面的查询:SELECTemailfromemailtableWHEREname="BillGates"当这个查询执行时就从名为emailtable的表中读取BillGates的email地址。这个简单的语句包括三部分:SELECT语句的第一部分指名要选取的列。在此例中只有email列被选取。当执行时只显示email列的值billgmicrosoftcom。SELECTT语句的第二部份指明要从哪个(些)表中查询数据。在此例中要查询的表名为emailtable。最后SELECT语句的WHERE子句指明要选择满足什么条件的记录。在此例中查询条件为只有name列的值为BillGates的记录才被选取。BillGates很有可能拥有不止一个email地址。如果表中包含BillGates的多个email地址。用上述的SELECT语句可以读取他所有的email地址。SELECT语句从表中取出所有name字段值为BillGates的记录的email字段的值。前面说过查询可以在查询条件中包含逻辑运算符。假如你想读取BillGates或Clinton总统的所有email地址你可以使用下面的查询语句:SELECTemailFROMemailtableWHEREname="BillGates"ORname="presidentClinton"此例中的查询条件比前一个复杂了一点。这个语句从表emailtable中选出所有name列为BillGates或presidentClinton的记录。如果表中含有BillGates或presidentClinton的多个地址所有的地址都被读取。SELECT语句的结构看起来很直观。如果你请一个朋友从一个表中为你选择一组记录你也许以非常相似的方式提出你的要求。在SQLSELECT语句中你“SELECT特定的列FROM一个表WHERE某些列满足一个特定的条件”。下一节将介绍怎样执行SQL查询来选取记录。这将帮助你熟悉用SELECT语句从表中取数据的各种不同方法。使用ISQL执行SELECT查询当你安装SQLSever时你同时安装了一个叫作ISQLw的应用程序。ISQLw允许你执行交互的SQL查询。在把查询包括到你的ASP网页中之前用ISQLw对其进行测试是非常有用的。注意:在这本书的第一部份你学习了怎样安装和配置MicrosoftSQLSever。如果没有安装SQLSever或者SQLSever不能运行请参阅第三章“安装和使用SQLSever”。选择任务上SQLSever程序组中的ISQLw以启动该程序。程序启动时首先会出现一个对话框要求输入服务器信息和登录信息(见图)。在Sever框中输入你的SQL服务器的名字。如果服务器正运行在本地计算机上服务器名字就是你计算机的名字。在登录信息框中输入一个登录帐号和密码或选择使用“可信连接”然后单击Connect按钮。图。注意:如果你将SQLSever配置为使用完整安全或混合安全那么你可以使用可信连接。如果你使用标准安全你则需要提供用户帐号和密码。要了解更多信息参见第三章。如果一切正常在你单击连接按钮后会出现一个查询窗口如图所示。(如果有异常请参考第三章)图在执行查询之前你需要选择数据库。安装SQLSever时你已为自己创建了一个数据库SQLSever还有许多系统数据库如mastermodelmsdb和tempdb。方便的是SQLSever带有一个特殊的名为pubs的例子数据库。库pubs中包含供一个虚拟的出版商使用的各个表。文档中所有的例子程序都是针对这个库来设计的。本书中的许多例子也使用这个数据库。在查询窗口顶部的DB下拉框中选择数据库pubs这样你就选择了数据库。你所有的查询都将针对这个库中的各个表来执行。现在你可以执行你的第一个查询了。这真让人兴奋!你的第一个查询将针对一个名为autrors的表表中包含所有为某个虚拟出版商工作的作者的相关数据。单击查询窗口并输入以下的语句:SELECTphoneFROMauthorsWHEREauname="Ringer"输入完成后单击执行查询按钮(一个绿色三角形看起来像VCR播放键)。单击此按钮后任何出现在查询窗口中的语句均会被执行。查询窗口会自动变成结果显示窗口你可以看到查询的结果(见图)。你看到的查询结果也许与图所示的不同。在SQLSever的不同版本中库pubs中的数据会有所不同。对SQLSever来说将会找到两条记录。结果显示窗口中应显示如下内容:phone………………(row(s)affected)图你所执行的SELECT语句从表authors中取出所有名字为Ringer的作者的电话号码。你通过在WHERE子句中使用特殊的选择条件来限制查询的结果。你也可以忽略选择条件从表中取出所有作者的电话号码。要做到这一点单击Query标签返回到查询窗口输入以下的SELECT语句:SELECTPhoneFROMauthors这个查询执行后会取出表authors中的所有电话号码(没有特定的顺序)。如果表authors中包含一百个电话号码会有一百个记录被取出如果表中有十亿个电话号码这十亿条记录都会被取出(这也许需要一些时间)。表authrs的字段包括姓名字电话号码地址城市州和邮政编码。通过在SELECT语句的第一部份指定它们你可以从表中取出任何一个字段。你可以在一个SELECT语句中一次取出多个字段比如:SELECTaufname,aulname,phoneFROMauthors这个SELECT语句执行后将取出这三个列的所有值。下面是这个查询的结果的一个示例(为了节省纸张只显示查询结果的一部分其余记录用省略号代替):aufnameaulnamephone…………………………………………………………………………JohnsonWhiteMarjorieGreenCherylCarsonMichaelO’Leary…(row(s)affected)在SELECT语句中你需要列出多少个字段你就可以列出多少。不要忘了把字段名用逗号隔开。你也可以用星号(*)从一个表中取出所有的字段。这里有一个使用星号的例子:SELECT*FROMauthors这个SELECT语句执行后表中的所有字段的值都被取出。你会发现你将在SQL查询中频繁使用星号。技巧:你可以使用星号来查看一个表的所有列的名字。要做到这一点只需要在执行完SELECT语句后看一下查询结果的列标题。操作多个表到现在为止你只尝试了用一句SQL查询从一个表中取出数据。你也可以用一个SELECT语句同时从多个表中取出数据只需在SELECT语句的FROM从句中列出要从中取出数据的表名称即可:SELECTaulname,titleFROMauthors,titles这个SELECT语句执行时同时从表authors和表titles中取出数据。从表authors中取出所有的作者名字从表titles中取出所有的书名。在ISQLw程序中执行这个查询看一下查询结果。你会发现一些奇怪的出乎意料的情况:作者的名字并没有和它们所著的书相匹配而是出现了作者名字和书名的所有可能的组合这也许不是你所希望见到的。出了什么差错?问题在于你没有指明这两个表之间的关系。你没有通过任何方式告诉SQL如何把表和表关联在一起。由于不知道如何关联两个表服务器只能简单地返回取自两个表中的记录的所有可能组合。要从两个表中选出有意义的记录组合你需要通过建立两表中字段的关系来关联两个表。要做到这一点的途径之一是创建第三个表专门用来描述另外两个表的字段之间的关系。表authors有一个名为auid的字段包含有每个作者的唯一标识。表titles有一个名为titleid的字段包含每个书名的唯一标识。如果你能在字段auid和字段titleid之间建立一个关系你就可以关联这两个表。数据库pubs中有一个名为titleauthor的表正是用来完成这个工作。表中的每个记录包括两个字段用来把表titles和表authors关联在一起。下面的SELECT语句使用了这三个表以得到正确的结果:SELECTauname,titleFROMauthors,titles,titleauthorWHEREauthorsauid=titleauthorauidANDtitlestitleid=titleauthortitleid当这个SELECT语句执行时每个作者都将与正确的书名相匹配。表titleauthor指明了表authors和表titles的关系它通过包含分别来自两个表的各一个字段实现这一点。第三个表的唯一目的是在另外两个表的字段之间建立关系。它本身不包含任何附加数据。注意在这个例子中字段名是如何书写的。为了区别表authors和表titles中相同的字段名auid每个字段名前面都加上了表名前缀和一个句号。名为authorauid的字段属于表authors名为titleauthorauid的字段属于表titleauthor两者不会混淆。通过使用第三个表你可以在两个表的字段之间建立各种类型的关系。例如一个作者也许写了许多不同的书或者一本书也许由许多不同的作者共同完成。当两个表的字段之间有这种“多对多”的关系时你需要使用第三个表来指明这种关系。但是在许多情况下两个表之间的关系并不复杂。比如你需要指明表titles和表publishers之间的关系。因为一个书名不可能与多个出版商相匹配你不需要通过第三个表来指明这两个表之间的关系。要指明表titles和表publishers之间的关系你只要让这两个表有一个公共的字段就可以了。在数据库pubs中表titles和表publishers都有一个名为pubid的字段。如果你想得到书名及其出版商的一个列表你可以使用如下的语句:SELECTtitle,pubnameFROMtitles,publishersWHEREtitlespubid=publisherspubid当然如果一本书是由两个出版商联合出版的那么你需要第三个表来代表这种关系。通常当你予先知道两个表的字段间存在“多对多”关系时就使用第三个表来关联这两个表。反之如果两个表的字段间只有“一对一”或“一对多”关系你可以使用公共字段来关联它门。操作字段通常当你从一个表中取出字段值时该值与创建该表时所定义的字段名联系在一起。如果你从表authors中选择所有的作者名字所有的值将会与字段名aulname相联系。但是在某些情况下你需要对字段名进行操作。在SELECT语句中你可以在缺省字段名后面仅跟一个新名字来取代它。例如可以用一个更直观易读的名字AuthorLastName来代替字段名aulname:SELECTaulname"AuthorLastName"FROMauthors当这个SELECT语句执行时来自字段aulname的值会与“AuthorLastName”相联系。查询结果可能是这样:AuthorLastName……………………………………………………………………WhiteGreenCarsonO’LearyStraight…(row(s)affected)注意字段标题不再是aulname而是被AuthorLastName所取代。你也可以通过执行运算来操作从一个表返回的字段值。例如如果你想把表titles中的所有书的价格加倍你可以使用下面的SELECT语句:SELECTprice*FROMtitles当这个查询执行时每本书的价格从表中取出时都会加倍。但是通过这种途径操作字段不会改变存储在表中的书价。对字段的运算只会影响SELECT语句的输出而不会影响表中的数据。为了同时显示书的原始价格和涨价后的新价格你可以使用下面的查询:SELECTprice"Originalprice",price*"Newprice"FROMtitles当数据从表titles中取出时原始价格显示在标题Originalprice下面加倍后的价格显示在标题Newprice下面。结果可能是这样:originalpricenewprice…………………………………………………………………(row(s)affected)你可以使用大多数标准的数学运算符来操作字段值如加()减()乘(*)和除()。你也可以一次对多个字段进行运算例如:SELECTprice*ytdsales"totalrevenue"FROMtitles在这个例子中通过把价格与销售量相乘计算出了每种书的总销售额。这个SELECT语句的结果将是这样的:totalrevenue……………………………………………,,,,,,,,,,…(row(s)affected)最后你还可以使用连接运算符(它看起来像个加号)来连接两个字符型字段:SELECTaufname""aulname"authorname"FROMauthors在这个例子中你把字段aufname和字段aulname粘贴在一起中间用一个逗号隔开并把查询结果的标题指定为authorname。这个语句的执行结果将是这样的:authornames…………………………………………………………JohnsonWhiteMarjorieGreenCherylCarsonMichaelO’LearyDeanStraight…(row(s)affected)可以看到SQL为你提供了对查询结果的许多控制。你应该在ASP编程过程中充分利用这些优点。使用SQL来操作查询结果几乎总是比使用有同样作用的脚本效率更高。排序查询结果本章的介绍中曾强调过SQL表没有内在的顺序。例如从一个表中取第二个记录是没有意义的。从SQL的角度看来没有一个记录在任何其他记录之前。然而你可以操纵一个SQL查询结果的顺序。在缺省情况下当记录从表中取出时记录不以特定的顺序出现。例如当从表authors中取出字段aulname时查询结果显示成这样:aulname……………………………………WhiteGreenCarsonO’LearyStraight…(row(s)affected)看一列没有特定顺序的名字是很不方便的。如果把这些名字按字母顺序排列读起来就会容易得多。通过使用ORDERBY子句你可以强制一个查询结果按升序排列就像这样:SELECTaulnameFROMauthorsORDERBYaulname当这个SELECT语句执行时作者名字的显示将按字母顺序排列。ORDERBY子句将作者名字按升序排列。你也可以同时对多个列使用ORDERBY子句。例如如果你想同时按升序显示字段aulname和字段aufname你需要对两个字段都进行排序:SELECTaulname,aufnameFROMauthorsORDERBYaulname,aufname这个查询首先把结果按aulname字段进行排序然后按字段aufname排序。记录将按如下的顺序取出:aulnameaufname……………………………………………………………………BennetAbrahamRingerAlbertRingerAnneSmithMeander…(row(s)affected)注意有两个作者有相同的名字Ringer。名为AlbertRinger的作者出现名为AnneRinger的作者之前这是因为姓Albert按字母顺序应排在姓Anne之前。如果你想把查询结果按相反的顺序排列你可以使用关键字DESC。关键字DESC把查询结果按降序排列如下例所示:SELECTaulname,aufnameFROMauthorsWHEREaulname=”Ringer”ORDERBYaulname,aufnameDESC这个查询从表authors中取出所有名字为Ringer的作者记录。ORDERBY子句根据作者的名字和姓将查询结果按降序排列。结果是这样的:aulnameaufname………………………………………………………………………………………RingerAnneRingerAlbert(row(s)affectec)注意在这个表中姓Anne出现在姓Albert之前。作者名字按降序显示。你也可以按数值型字段对一个查询结果进行排序。例如如果你想按降序取出所有书的价格你可以使用如下的SQL查询:SELECTpriceFROMtitlesORDERBYpriceDESC这个SELECT语句从表中取出所有书的价格显示结果时价格低的书先显示价格高的书后显示。警告:不是特别需要时不要对查询结果进行排序因为服务器完成这项工作要费些力气。这意味着带有ORDERBY子句的SELECT语句执行起来比一般的SELECT语句花的时间长。取出互不相同的记录一个表有可能在同一列中有重复的值。例如数据库pubs的表authors中有两个作者的名字是Ringer。如果你从这个表中取出所有的名字名字Ringer将会显示两次。在特定情况下你可能只有兴趣从一个表中取出互不相同的值。如果一个字段有重复的值你也许希望每个值只被选取一次你可以使用关键字DISTINCT来做到这一点:SELCETDISTINCTaulnameFROMauthorsWHEREaulname="Ringer"当这个SELECT语句执行时只返回一个记录。通过在SELECT语句中包含关键字DISTINCT你可以删除所有重复的值。例如假设有一个关于新闻组信息发布的表你想取出所有曾在这个新闻组中发布信息的人的名字那么你可以使用关键字DISTINCT。每个用户的名字只取一次尽管有的用户发布了不止一篇信息。警告:如同ORDERBY子句一样强制服务器返回互不相同的值也会增加运行开销。福气不得不花费一些时间来完成这项工作。因此不是必须的时候不要使用关键字DISTINCT。创建新表前面说过数据库中的所有数据存储在表中。数据表包括行和列。列决定了表中数据的类型。行包含了实际的数据。例如数据库pubs中的表authors有九个字段。其中的一个字段名为为aulname这个字段被用来存储作者的名字信息。每次向这个表中添加新作者时作者名字就被添加到这个字段产生一条新记录。通过定义字段你可以创建一个新表。每个字段有一个名字和一个特定的数据类型(数据类型在后面的“字段类型”一节中讲述)例如字段aulname存储的是字符型数据。一个字段也可以存储其它类型的数据。使用SQLSever创建一个新表的方法是很多的。你可以可执行一个SQL语句或使用SQL事务管理器(SQLEnterpriseManager)来创建一个新表。在下一节里你将学会如何用SQL语句来创建一个新表。用SQL创建新表注意:如果你还没有建立自己的数据库现在就跳回到第三章创建这个库。你绝不能向master,tempdb或任何其他任何系统数据库中添加数据。从SQLSever程序组(在任务栏中)中启动ISQLw程序。出现查询窗口后从窗口顶部的下拉列表中选择你在第三章所创建的数据库。下一步在查询窗口中键入下面的SQL语句单击执行查询按钮执行这个语句:CREATETABLEguestbook(visitorVARCHAR(),commentsTEXT,entrydateDATETIME)如果一切正常你会在结果窗口中看到如下的文字(如果出现异常请参阅第三章):Thiscommandditnotreturndata,anditdidnotreturnanyrows祝贺你你已经建立了你的第一个表!你所创建的表名为guestbook你可以使用这个表来存储来字你站点访问者的信息。你是用REEATETABLE语句创建的这个表这个语句有两部分:第一部份指定表的名子第二部份是括在括号中的各字段的名称和属性相互之间用逗号隔开。表guestbook有三个字段:visitor,comments和entrydate。visitor字段存储访问者的名字comments字段存储访问者对你站点的意见entrydate字段存储访问者访问你站点的日期和时间。注意每个字段名后面都跟有一个专门的表达式。例如字段名comments后面跟有表达式TEXT。这个表达式指定了字段的数据类型。数据类型决定了一个字段可以存储什么样的数据。因为字段comments包含文本信息其数据类型定义为文本型。字段有许多不同的数据类型。下一小节讲述SQL所支持的一些重要的数据类型。字段类型不同的字段类型用来存放不同类型的数据。创建和使用表时更你应该理解五种常用的字段类型:字符型文本型数值型逻辑性和日期型。字符型数据字符型数据非常有用。当你需要存储短的字符串信息时你总是要用到字符型数据。例如你可以把从HTMLform的文本框中搜集到的信息放在字符型字段中。要建立一个字段用来存放可变长度的字符串信息你可以使用表达式VARCHAR。考虑你前面创建的表guestbook:CREATETABLEguestbook(visitorVARCHAR(),commentsTEXT,entrydateDATETIME)在这个例子中字段visitor的数据类型为VARCHAR。注意跟在数据类型后面的括号中的数字。这个数字指定了这个字段所允许存放的字符串的最大长度。在这个例子中字段visitor能存放的字符串最长为四十个字符。如果名字太长字符串会被截断只保留四十个字符。VARCHAR类型可以存储的字符串最长为个字符。要存储更长的字符串数据可以使用文本型数据(下一节中讲述)。另一种字符型数据用来存储固定长度的字符数据。下面是一个使用这种数据类型的例子:CREATETABLEguestbook(visitorCHAR(),commentsTEXT,entrydateDATETIME)在这个例子中字段visitor被用来存储四十个字符的固定长度字符串。表达式CHAR指定了这个字段应该是固定长度的字符串。VARCHAR型和CHAR型数据的这个差别是细微的但是非常重要。假如你向一个长度为四十个字符的VARCHAR型字段中输入数据BillGates。当你以后从这个字段中取出此数据时你取出的数据其长度为十个字符字符串BillGates的长度。现在假如你把字符串输入一个长度为四十个字符的CHAR型字段中那么当你取出数据时所取出的数据长度将是四十个字符。字符串的后面会被附加多余的空格。当你建立自己的站点时你会发现使用VARCHAR型字段要比CHAR型字段方便的多。使用VARCHAR型字段时你不需要为剪掉你数据中多余的空格而操心。VARCHAR型字段的另一个突出的好处是它可以比CHAR型字段占用更少的内存和硬盘空间。当你的数据库很大时这种内存和磁盘空间的节省会变得非常重要。文本型数据字符型数据限制了字符串的长度不能超过2个字符。而使用文本型数据你可以存放超过二十亿个字符的字符串。当你需要存储大串的字符时应该使用文本型数据。这里有一个使用文本型数据的例子:CREATETABLEguestbook(visitorVARCHAR(),commentsTEXT,entrydateDATETIME)在这个例子中字段comments被用来存放访问者对你站点的意见。注意文本型数据没有长度而上一节中所讲的字符型数据是有长度的。一个文本型字段中的数据通常要么为空要么很大。当你从HTMLform的多行文本编辑框(TEXTAREA)中收集数据时你应该把收集的信息存储于文本型字段中。但是无论何时只要你能避免使用文本型字段你就应该不适用它。文本型字段既大且慢滥用文本型字段会使服务器速度变慢。文本型字段还会吃掉大量的磁盘空间。警告:一旦你向文本型字段中输入了任何数据(甚至是空值)就会有K的空间被自动分配给该数据。除非删除该记录否则你无法收回这部分存储空间。数值型数据SQLSever支持许多种不同的数值型数据。你可以存储整数、小数、和钱数。通常当你需要在表中的存放数字时你要使用整型(INT)数据。INT型数据的表数范围是从到的整数。下面是一个如何使用INT型数据的例子:CREATETABLEvisitlog(visitorVARCHAR(),numvisitsINT)这个表可以用来记录你站点被访问的次数。只要没有人访问你的站点超过次nubvisits字段就可以存储访问次数。为了节省内存空间你可以使用SMALLINT型数据。SMALLINT型数据可以存储从到的整数。这种数据类型的使用方法与INT型完全相同。最后如果你实在需要节省空间你可以使用TINYINT型数据。同样这种类型的使用方法也与INT型相同不同的是这种类型的字段只能存储从0到的整数。TINYINT型字段不能用来存储负数。通常为了节省空间应该尽可能的使用最小的整型数据。一个TINYINT型数据只占用一个字节一个INT型数据占用四个字节。这看起来似乎差别不大但是在比较大的表中字节数的增长是很快的。另一方面一旦你已经创建了一个字段要修改它是很困难的。因此为安全起见你应该预测以下一个字段所需要存储的数值最大有可能是多大然后选择适当的数据类型。为了能对字段所存放的数据有更多的控制你可以使用NUMERIC型数据来同时表示一个数的整数部分和小数部分。NUMERIC型数据使你能表示非常大的数比INT型数据要大得多。一个NUMERIC型字段可以存储从到范围内的数。NUMERIC型数据还使你能表示有小数部分的数。例如你可以在NUMERIC型字段中存储小数。当定义一个NUMERIC型字段时你需要同时指定整数部分的大小和小数部分的大小。这里有一个使用这种数据类型的例子:CREATETABLEnumericdata(bignumberNUMERIC(,),fractionNUMERIC(,))当这个语句执行时将创建一个名为numericdata的包含两个字段的表。字段bignumber可以存储直到位的整数。字段fraction可以存储有五位整数部分和四位小数部分的小数。一个NUMERIC型数据的整数部分最大只能有位小数部分的位数必须小于或等于整数部分的位数小数部分可以是零。你可以使用INT型或NUMERIC型数据来存储钱数。但是专门有另外两种数据类型用于此目的。如果你希望你的网点能挣很多钱你可以使用MONEY型数据。如果你的野心不大你可以使用SMALLMONEY型数据。MONEY型数据可以存储从到的钱数。如果你需要存储比这还大的金额你可以使用NUMERIC型数据。SMALLMONEY型数据只能存储从到的钱数。同样如果可以的话你应该用SMALLMONEY型来代替MONEY型数据以节省空间。下面的例子显示了如何使用这两种表示钱的数据类型:CREATETABLEproducts(productVARCHAR(),priceMONEY,DiscountpriceSMALLMONEY)这个表可以用来存储商品的折扣和普通售价。字段price的数据类型是MONEY字段discountprice的数据类型是SMALLMONEY。存储逻辑值如果你使用复选框(CHECKBOX)从网页中搜集信息你可以把此信息存储在BIT型字段中。BIT型字段只能取两个值:或。这里有一个如何使用这种字段的例子:CREATETABLEopinion(visitorVARCHAR(),goodBIT)这个表可以用来存放对你的网点进行民意调查所得的信息。访问者可以投票表示他们是否喜欢你的网点。如果他们投YES就在BIT型字段中存入。反之如果他们投NO就在字段中存入(在下一章里你将学会如何计算投票)。当心在你创建好一个表之后你不能向表中添加BIT型字段。如果你打算在一个表中包含BIT型字段你必须在创建表时完成。存储日期和时间当你建立一个网点时你也许需要记录在一段时间内的访问者数量。为了能够存储日期和时间你需要使用DATETIME型数据如下例所示:CREATETABLvisitorlog(visitorVARCHAR(),arrivaltimeDATETIME,departuretimeDATETIME)这个表可以用来记录访问者进入和离开你网点的时间和日期。一个DATETIME型的字段可以存储的日期范围是从1753年1月1日第一毫秒到年月日最后一毫秒。如果你不需要覆盖这么大范围的日期和时间你可以使用SMALLDATETIME型数据。它与DATETIME型数据同样使用只不过它能表示的日期和时间范围比DATETIME型数据小而且不如DATE

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +2积分

资料评价:

/43
1下载券 下载 加入VIP, 送下载券

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部