|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
支持AIX、FreeBSD、HP-UX、Linux、MacOS、NovellNetware、OpenBSD、OS/2Wrap、Solaris、Windows等多种操作系统初级操纵数据:SQL
操纵数据:SQL
nSQL基本n中级SQLn初级SQL========================================================================
nSQL基本
¨¨SQL先容
¨¨利用SELECT语句从表中取数据
¨¨创立新表
¨¨字段属性
¨¨向表中增加数据
¨¨删除和修正表
为了创建交互站点,你必要利用数据库来存储来自会见者的信息。比方,你要创建一个职业先容服务的站点,你就必要存储诸如团体简历,所感乐趣的事情等等如许的信息。创立静态网叶也必要利用数据库,假如你想显现切合来访者请求的最好的事情,你就必要从数据库中掏出这份事情的信息。你将会发明,在很多情形下必要利用数据库。
在这一章里,你将学会如何利用“布局化查询言语”(SQL〕来操纵数据库。SQL言语是数据库的尺度言语。在ActiveSeverPages中,不管什么时候你要会见一个数据库,你就要利用SQL言语。因而,把握好SQL对ASP编程长短常主要的。
注重:
你能够把“SQL”读作“sequel”,也能够按单个字母的读音读作S-Q-L。两种发音都是准确的,每种发音各有大批的撑持者。在本书里,以为“SQL”读作“sequel”。
经由过程这一章的进修,你将了解如何用SQL完成数据库查询,你将学会如何利用这类查询从数据表中掏出信息,最初,你将学会如何计划和创建本人的数据库。
注重:
经由过程上面几章对SQL的先容,你将对SQL有充足的懂得,从而能够无效地利用ActiveSeverPages。可是,SQL是一种庞大的言语,本书不成能包含它的全体细节。要周全把握SQL言语,你必要进修在MicrosoftSQLSever中利用SQL。你能够到四周的书店往买一本MicrosoftSQLSever6.5。
SQL先容:
本书假定你是在SQL操纵MicrosoftSQLSever的数据库。你也能够用SQL操纵很多别的范例的数据库。SQL是操纵数据库的尺度言语。(现实上,关于SQL言语有一个专门的ANSI尺度〕
注重:
不要在你的站点上试图用MicrosoftAccess取代MicrosoftSQLSever。SQLSever能够同时服务于很多用户,假如你但愿你的站点有较高的会见率,MSAccess是不克不及胜任的。
在进修SQL的细节之前,你必要了解它的两年夜特性。一个特性简单把握,另外一个把握起来有点坚苦。
第一个特性是一切SQL数据库中的数据都存储在表中。一个表由行和列构成。比方,上面这个复杂的表包含name和e-mailaddress:
NameEmailAddress
................................................................
BillGatesbillg@microsoft.com
presidentClintonpresident@whitehouse.com
StephenWaltherswalther@somewhere.com
这个表有两列(列也称为字段,域〕: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查询的句法十分复杂。假定有一个名为email_table的表,包括名字和地点两个字段,要失掉BillGates的e_mail地点,你可使用上面的查询:
SELECTemailfromemail_tableWHEREname="BillGates"
当这个查询实行时,就从名为email_table的表中读取BillGates的e_mail地点。这个复杂的语句包含三部分:
■SELECT语句的第一部分指名要拔取的列。在此例中,只要email列被拔取。当实行时,只显现email列的值billg@microsoft.com。
■SELECTT语句的第二部分指明要从哪一个(些)表中查询数据。在此例中,要查询的表名为email_table。
■最初,SELECT语句的WHERE子句指明要选择满意甚么前提的纪录。在此例中,查询前提为只要name列的值为BillGates的纪录才被拔取。
BillGates很有大概具有不止一个email地点。假如表中包括BillGates的多个email地点。用上述的SELECT语句能够读取他一切的email地点。SELECT语句从表中掏出一切name字段值为BillGates的纪录的email字段的值。
后面说过,查询能够在查询前提中包括逻辑运算符。假设你想读取BillGates或Clinton总统的一切email地点,你可使用上面的查询语句:
SELECTemailFROMemail_tableWHEREname="BillGates"OR
name="presidentClinton"
此例中的查询前提比前一个庞大了一点。这个语句从表email_table当选出一切name列为BillGates或presidentClinton的纪录。假如表中含有BillGates或presidentClinton的多个地点,一切的地点都被读取。
SELECT语句的布局看起来很直不雅。假如你请一个伴侣从一个表中为你选择一组纪录,你大概以十分类似的体例提出你的请求。在SQLSELECT语句中,你“SELECT特定的列FROM一个表WHERE某些列满意一个特定的前提”。
下一节将先容如何实行SQL查询来拔取纪录。这将匡助你熟习用SELECT语句从表中取数据的各类分歧办法。
利用ISQL实行SELECT查询
当你安装SQLSever时,你同时安装了一个叫作ISQL/w的使用程序。ISQL/w同意你实行交互的SQL查询。在把查询包含到你的ASP网页中之前,用ISQL/w对其举行测试长短常有效的。
注重:
在这本书的第一部分,你进修了如何安装和设置MicrosoftSQLSever。假如没有安装SQLSever大概SQLSever不克不及运转,请参阅第三章“安装和利用SQLSever”。
选择义务上SQLSever程序组中的ISQL_w以启动该程序。程序启动时,起首会呈现一个对话框,请求输出服务器信息和登录信息(见0.1)。在Sever框中,输出你的SQL服务器的名字。假如服务器正运转在当地盘算机上,服务器名字就是你盘算机的名字。在登录信息框中,输出一个登录帐号和暗码或选择利用“可托毗连”,然后单击Connect按钮。
0。1
注重:
假如你将SQLSever设置为利用完全平安或夹杂平安,那末你可使用可托毗连。假如你利用尺度平安,你则必要供应用户帐号和暗码。要懂得更多信息,拜见第三章。
假如统统一般,在你单击毗连按钮后会呈现一个查询窗口,如0.2所示。(假如有非常,请参考第三章)
0.2
在实行查询之前,你必要选择数据库。安装SQLSever时你已为本人创立了一个数据库,SQLSever另有很多体系数据库,如master,model,msdb,和tempdb。
便利的是,SQLSever带有一个特别的名为pubs的例子数据库。库pubs中包括供一个假造的出书商利用的各个表。文档中一切的例子程序都是针对这个库来计划的。本书中的很多例子也利用这个数据库。
在查询窗口顶部的DB下拉框当选择数据库pubs,如许你就选择了数据库。你一切的查询都将针对这个库中的各个表来实行。如今你能够实行你的第一个查询了。这真让人镇静!
你的第一个查询将针对一个名为autrors的表,表中包括一切为某个假造出书商事情的作者的相干数据。单击查询窗口并输出以下的语句:
SELECTphoneFROMauthorsWHEREau_name="Ringer"
输出完成后,单击实行查询按钮(一个绿色三角形,看起来像VCR播放键)。单击此按钮后,任何呈现在查询窗口中的语句均会被实行。查询窗口会主动酿成了局显现窗口,你能够看到查询的了局(见0.3)。
你看到的查询了局大概与0.3所示的分歧。在SQLSever的分歧版本中,库pubs中的数据会有所分歧。对SQLSever6.5来讲,将会找到两笔记录。了局显现窗口中应显现以下内容:
phone
……………….
801826_0752
801826_0752
(2row(s)affected)
0.3
你所实行的SELECT语句从表authors中掏出一切名字为Ringer的作者的德律风号码。你经由过程在WHERE子句中利用特别的选择前提来限定查询的了局。你也能够疏忽选择前提,从表中掏出一切作者的德律风号码。要做到这一点,单击Query标签,前往到查询窗口,输出以下的SELECT语句:
SELECTPhoneFROMauthors
这个查询实行后,会掏出表authors中的一切德律风号码(没有特定的按次)。假如表authors中包括一百个德律风号码,会有一百个纪录被掏出,假如表中有十亿个德律风号码,这十亿笔记录城市被掏出(这大概必要一些工夫)。
表authrs的字段包含姓,名字,德律风号码,地点,乡村,州和邮政编码。经由过程在SELECT语句的第一部分指定它们,你能够从表中掏出任何一个字段。你能够在一个SELECT语句中一次掏出多个字段,好比:
SELECTau_fname,au_lname,phoneFROMauthors
这个SELECT语句实行后,将掏出这三个列的一切值。上面是这个查询的了局的一个示例(为了节俭纸张,只显现查询了局的一部分,其他纪录用省略号取代):
au_fnameau_lnamephone
………………………………………………………………………….
JohnsonWhite408496_7223
MarjorieGreen415986_7020
CherylCarson415548_7723
MichaelO’Leary408286_2428
…
(23row(s)affected)
在SELECT语句中,你必要列出几个字段,你就能够列出几。不要忘了把字段名用逗号离隔。你也能够用星号(*)从一个表中掏出一切的字段。这里有一个利用星号的例子:
SELECT*FROMauthors
这个SELECT语句实行后,表中的一切字段的值都被掏出。你会发明你将在SQL查询中频仍利用星号。
技能:
你可使用星号来检察一个表的一切列的名字。要做到这一点,只必要在实行完SELECT语句后看一下查询了局的列题目。
操纵多个表
到如今为止,你只实验了用一句SQL查询从一个表中掏出数据。你也能够用一个SELECT语句同时从多个表中掏出数据,只需在SELECT语句的FROM从句中列出要从中掏出数据的表称号便可:
SELECTau_lname,titleFROMauthors,titles
这个SELECT语句实行时,同时从表authors和表titles中掏出数据。从表authors中掏出一切的作者名字,从表titles中掏出一切的书名。在ISQL/w程序中实行这个查询,看一下查询了局。你会发明一些奇异的出人意料的情形:作者的名字并没有和它们所著的书相婚配,而是呈现了作者名字和书名的一切大概的组合,这大概不是你所但愿见到的。
出了甚么不对?成绩在于你没有指明这两个表之间的干系。你没有经由过程任何体例告知SQL怎样把表和表联系关系在一同。因为不晓得怎样联系关系两个表,服务器只能复杂地前往取自两个表中的纪录的一切大概组合。
要从两个表当选出成心义的纪录组合,你必要经由过程创建两表中字段的干系来联系关系两个表。要做到这一点的路子之一是创立第三个表,专门用来形貌别的两个表的字段之间的干系。
表authors有一个名为au_id的字段,包括有每一个作者的独一标识。表titles有一个名为title_id的字段,包括每一个书名的独一标识。假如你能在字段au_id和字段title_id之间创建一个干系,你就能够联系关系这两个表。数据库pubs中有一个名为titleauthor的表,恰是用来完成这个事情。表中的每一个纪录包含两个字段,用来把表titles和表authors联系关系在一同。上面的SELECT语句利用了这三个表以失掉准确的了局:
SELECTau_name,titleFROMauthors,titles,titleauthor
WHEREauthors.au_id=titleauthor.au_id
ANDtitles.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的字段。假如你想失掉书名及其出书商的一个列表,你可使用以下的语句:
SELECTtitle,pub_nameFROMtitles,publishers
WHEREtitles.pub_id=publishers.pub_id
固然,假如一本书是由两个出书商团结出书的,那末你必要第三个表来代表这类干系。
一般,当你予先晓得两个表的字段间存在“多对多”干系时,就利用第三个表来联系关系这两个表。反之,假如两个表的字段间只要“一对一”或“一对多”干系,你可使用大众字段来联系关系它门。
操纵字段
一般,当你从一个表中掏出字段值时,该值与创立该表时所界说的字段名接洽在一同。假如你从表authors当选择一切的作者名字,一切的值将会与字段名au_lname相接洽。可是在某些情形下,你必要对字段名举行操纵。在SELECT语句中,你能够在缺省字段名前面仅跟一个新名字来代替它。比方,能够用一个更直不雅易读的名字AuthorLastName来取代字段名au_lname:
SELECTau_lname"AuthorLastName"FROMauthors
当这个SELECT语句实行时,来自字段au_lname的值会与“AuthorLastName”相接洽。查询了局多是如许:
AuthorLastName
……………………………………………………………………..
White
Green
Carson
O’Leary
Straight
…
(23row(s)affected)
注重字段题目不再是au_lname,而是被AuthorLastName所代替。
你也能够经由过程实行运算,来操纵从一个表前往的字段值。比方,假如你想把表titles中的一切书的代价更加,你可使用上面的SELECT语句:
SELECTprice*2FROMtitles
当这个查询实行时,每本书的代价从表中掏出时城市更加。可是,经由过程这类路子操纵字段不会改动存储在表中的书价。对字段的运算只会影响SELECT语句的输入,而不会影响表中的数据。为了同时显现书的原始代价和跌价后的新代价,你可使用上面的查询:
SELECTprice"Originalprice",price*2"Newprice"FROMtitles
当数据从表titles中掏出时,原始代价显现在题目Originalprice上面,更加后的代价显现在题目Newprice上面。了局多是如许:
originalpricenewprice
……………………………………………………………….
19.9919.9939.98
11.9523.90
2.992.995.98
19.9919.9939.98
…
(18row(s)affected)
你可使用年夜多半尺度的数学运算符来操纵字段值,如加(+),减(-),乘(*)和除(/)。你也能够一次对多个字段举行运算,比方:
SELECTprice*ytd_sales"totalrevenue"FROMtitles
在这个例子中,经由过程把代价与发卖量相乘,盘算出了每种书的总发卖额。这个SELECT语句的了局将是如许的:
totalrevenue
……………………………………………..
81,859,05
46,318,20
55,978,78
81,859,05
40,619,68
…
(18row(s)affected)
最初,你还可使用毗连运算符(它看起来像个加号)来毗连两个字符型字段:
SELECTau_fname+""+au_lname"authorname"FROMauthors
在这个例子中,你把字段au_fname和字段au_lname粘贴在一同,两头用一个逗号离隔,并把查询了局的题目指定为authorname。这个语句的实行了局将是如许的:
authornames
…………………………………………………………
JohnsonWhite
MarjorieGreen
CherylCarson
MichaelO’Leary
DeanStraight
…
(23row(s)affected)
能够看到,SQL为你供应了对查询了局的很多把持。你应当在ASP编程过程当中充实使用这些长处。利用SQL来操纵查询了局几近老是比利用有一样感化的剧本效力更高。
排序查询了局
本章的先容中曾夸大过,SQL表没有内涵的按次。比方,从一个表中取第二个纪录是没成心义的。从SQL的角度看来,没有一个纪录在任何其他纪录之前。
但是,你能够利用一个SQL查询了局的按次。在缺省情形下,当纪录从表中掏出时,纪录不以特定的按次呈现。比方,当从表authors中掏出字段au_lname时,查询了局显现成如许:
au_lname
…………………………………….
White
Green
Carson
O’Leary
Straight
…
(23row(s)affected)
看一列没有特定按次的名字是很不便利的。假如把这些名字按字母按次分列,读起来就会简单很多。经由过程利用ORDERBY子句,你能够强迫一个查询了局按升序分列,就像如许:
SELECTau_lnameFROMauthorsORDERBYau_lname
当这个SELECT语句实行时,作者名字的显现将按字母按次分列。ORDERBY子句将作者名字按升序分列。
你也能够同时对多个列利用ORDERBY子句。比方,假如你想同时按升序显现字段au_lname和字段au_fname,你必要对两个字段都举行排序:
SELECTau_lname,au_fnameFROMauthorsORDERBYau_lname,au_fname
这个查询起首把了局按au_lname字段举行排序,然后按字段au_fname排序。纪录将按以下的按次掏出:
au_lnameau_fname
…………………………………………………………………….
BennetAbraham
RingerAlbert
RingerAnne
SmithMeander
…
(23row(s)affected)
注重有两个作者有不异的名字Ringer。名为AlbertRinger的作者呈现名为AnneRinger的作者之前,这是由于姓Albert按字母按次应排在姓Anne之前。
假如你想把查询了局按相反的按次分列,你可使用关头字DESC。关头字DESC把查询了局按降序分列,以下例所示:
SELECTau_lname,au_fnameFROMauthors
WHEREau_lname=”Ringer”ORDERBYau_lname,au_fnameDESC
这个查询从表authors中掏出一切名字为Ringer的作者纪录。ORDERBY子句依据作者的名字和姓,将查询了局按降序分列。了局是如许的:
au_lnameau_fname
……………………………………………………………………………………….
RingerAnne
RingerAlbert
(2row(s)affectec)
注重在这个表中,姓Anne呈现在姓Albert之前。作者名字按降序显现。
你也能够按数值型字段对一个查询了局举行排序。比方,假如你想按降序掏出一切书的代价,你可使用以下的SQL查询:
SELECTpriceFROMtitlesORDERBYpriceDESC
这个SELECT语句从表中掏出一切书的代价,显现了局时,代价低的书先显现,代价高的书后显现。
告诫:
不是出格必要时,不要对查询了局举行排序,由于服务器完成这项事情要费些力量。这意味着带有ORDERBY子句的SELECT语句实行起来比一样平常的SELECT语句花的工夫长。
掏出互不不异的纪录
一个表有大概在统一列中有反复的值。比方,数据库pubs的表authors中有两个作者的名字是Ringer。假如你从这个表中掏出一切的名字,名字Ringer将会显现两次。
在特定情形下,你大概只要乐趣从一个表中掏出互不不异的值。假如一个字段有反复的值,你大概但愿每一个值只被拔取一次,你可使用关头字DISTINCT来做到这一点:
SELCETDISTINCTau_lnameFROMauthorsWHEREau_lname="Ringer"
当这个SELECT语句实行时,只前往一个纪录。经由过程在SELECT语句中包括关头字DISTINCT,你能够删除一切反复的值。比方,假定有一个关于旧事组信息公布的表,你想掏出一切曾在这个旧事组中公布信息的人的名字,那末你可使用关头字DISTINCT。每一个用户的名字只取一次——只管有的用户公布了不止一篇信息。
告诫:
好像ORDERBY子句一样,强迫服务器前往互不不异的值也会增添运转开支。福分不能不消费一些工夫来完成这项事情。因而,不是必需的时分不要利用关头字DISTINCT。
创立新表
后面说过,数据库中的一切数据存储在表中。数据表包含行和列。列决意了表中数据的范例。行包括了实践的数据。
比方,数据库pubs中的表authors有九个字段。个中的一个字段名为为au_lname,这个字段被用来存储作者的名字信息。每次向这个表中增加新作者时,作者名字就被增加到这个字段,发生一条新纪录。
经由过程界说字段,你能够创立一个新表。每一个字段有一个名字和一个特定的数据范例(数据范例在前面的“字段范例”一节中报告),比方字段au_lname存储的是字符型数据。一个字段也能够存储别的范例的数据。
利用SQLSever,创立一个新表的办法是良多的。你能够可实行一个SQL语句或利用SQL事件办理器(SQLEnterpriseManager)来创立一个新表。鄙人一节里,你将学会怎样用SQL语句来创立一个新表。
用SQL创立新表
注重:
假如你还没有创建本人的数据库,如今就跳回到第三章创立这个库。你毫不能向master,tempdb或任何其他任何体系数据库中增加数据。
从SQLSever程序组(在义务栏中)中启动ISQL/w程序。呈现查询窗口后,从窗口顶部的下拉列表当选择你在第三章所创立的数据库。下一步,在查询窗口中键进上面的SQL语句,单击实行查询按钮,实行这个语句:
CREATETABLEguestbook(visitorVARCHAR(40),commentsTEXT,entrydate
DATETIME)
假如统统一般,你会在了局窗口中看到以下的笔墨(假如呈现非常,请参阅第三章):
Thiscommandditnotreturndata,anditdidnotreturnanyrows
庆祝你,你已创建了你的第一个表!
你所创立的表名为guestbook,你可使用这个表来存储来字你站点会见者的信息。你是用REEATETABLE语句创立的这个表,这个语句有两部分:第一部分指定表的名子;第二部分是括在括号中的各字段的称号和属性,互相之间用逗号离隔。
表guestbook有三个字段:visitor,comments和entrydate。visitor字段存储会见者的名字,comments字段存储会见者对你站点的定见,entrydate字段存储会见者会见你站点的日期和工夫。
注重每一个字段名前面都跟有一个专门的表达式。比方,字段名comments前面跟有表达式TEXT。这个表达式指定了字段的数据范例。数据范例决意了一个字段能够存储甚么样的数据。由于字段comments包括文本信息,其数据范例界说为文本型。
字段有很多分歧的数据范例。下一大节报告SQL所撑持的一些主要的数据范例。
字段范例
分歧的字段范例用来寄存分歧范例的数据。创立和利用表时,更你应当了解五种经常使用的字段范例:字符型,文本型,数值型,逻辑性和日期型。
字符型数据
字符型数据十分有效。当你必要存储短的字符串信息时,你老是要用到字符型数据。比方,你能够把从HTMLform的文本框中汇集到的信息放在字符型字段中。
要创建一个字段用来寄存可变长度的字符串信息,你可使用表达式VARCHAR。思索你后面创立的表guestbook:
CREATETABLEguestbook(visitorVARCHAR(40),commentsTEXT,entrydate
DATETIME)
在这个例子中,字段visitor的数据范例为VARCHAR。注重跟在数据范例前面的括号中的数字。这个数字指定了这个字段所同意寄存的字符串的最年夜长度。在这个例子中,字段visitor能寄存的字符串最长为四十个字符。假如名字太长,字符串会被截断,只保存四十个字符。
VARCHAR范例能够存储的字符串最长为255个字符。要存储更长的字符串数据,可使用文本型数据(下一节中报告)。
另外一种字符型数据用来存储流动长度的字符数据。上面是一个利用这类数据范例的例子:
CREATETABLEguestbook(visitorCHAR(40),commentsTEXT,entrydate
DATETIME)
在这个例子中,字段visitor被用来存储四十个字符的流动长度字符串。表达式CHAR指定了这个字段应当是流动长度的字符串。
VARCHAR型和CHAR型数据的这个不同是渺小的,可是十分主要。假设你向一个长度为四十个字符的VARCHAR型字段中输出数据BillGates。当你今后从这个字段中掏出此数据时,你掏出的数据其长度为十个字符——字符串BillGates的长度。
如今假设你把字符串输出一个长度为四十个字符的CHAR型字段中,那末当你掏出数据时,所掏出的数据长度将是四十个字符。字符串的前面会被附加过剩的空格。
当你创建本人的站点时,你会发明利用VARCHAR型字段要比CHAR型字段便利的多。利用VARCHAR型字段时,你不必要为剪失落你数据中过剩的空格而费心。
VARCHAR型字段的另外一个凸起的优点是它能够比CHAR型字段占用更少的内存和硬盘空间。当你的数据库很年夜时,这类内存和磁盘空间的节俭会变得十分主要。
文本型数据
字符型数据限定了字符串的长度不克不及凌驾255个字符。而利用文本型数据,你能够寄存凌驾二十亿个字符的字符串。当你必要存储年夜串的字符时,应当利用文本型数据。
这里有一个利用文本型数据的例子:
CREATETABLEguestbook(visitorVARCHAR(40),commentsTEXT,entrydate
DATETIME)
在这个例子中,字段comments被用来寄存会见者对你站点的定见。注重文本型数据没有长度,而上一节中所讲的字符型数据是有长度的。一个文本型字段中的数据一般要末为空,要末很年夜。
当你从HTMLform的多行文本编纂框(TEXTAREA)中搜集数据时,你应当把搜集的信息存储于文本型字段中。可是,不管什么时候,只需你能制止利用文本型字段,你就应当不合用它。文本型字段既年夜且慢,滥用文本型字段会使服务器速率变慢。文本型字段还会吃失落大批的磁盘空间。
告诫:
一旦你向文本型字段中输出了任何数据(乃至是空值),就会有2K的空间被主动分派给该数据。除非删除该纪录,不然你没法发出这部分存储空间。
数值型数据
SQLSever撑持很多种分歧的数值型数据。你能够存储整数、小数、和钱数。
一般,当你必要在表中的寄存数字时,你要利用整型(INT)数据。INT型数据的表数局限是从-2,147,483,647到2,147,483,647的整数。上面是一个怎样利用INT型数据的例子:
CREATETABLEvisitlog(visitorVARCHAR(40),numvisitsINT)
这个表能够用来纪录你站点被会见的次数。只需没有人会见你的站点凌驾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型字段时,你必要同时指定整数部分的巨细和小数部分的巨细。这里有一个利用这类数据范例的例子:
CREATETABLEnumeric_data(bignumberNUMERIC(28,0),
fractionNUMERIC(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型数据,以节俭空间。上面的例子显现了怎样利用这两种暗示钱的数据范例:
CREATETABLEproducts(productVARCHAR(40),priceMONEY,
Discount_priceSMALLMONEY)
这个表能够用来存储商品的扣头和一般售价。字段price的数据范例是MONEY,字段discount_price的数据范例是SMALLMONEY。
存储逻辑值
假如你利用复选框(CHECKBOX)从网页中汇集信息,你能够把此信息存储在BIT型字段中。BIT型字段只能取两个值:0或1。这里有一个怎样利用这类字段的例子:
CREATETABLEopinion(visitorVARCHAR(40),goodBIT)
这个表能够用来寄存对你的网点举行平易近意查询拜访所得的信息。会见者能够投票暗示他们是不是喜好你的网点。假如他们投YES,就在BIT型字段中存进1。反之,假如他们投NO,就在字段中存进0(鄙人一章里,你将学会怎样盘算投票)。
小心,在你创立好一个表以后,你不克不及向表中增加BIT型字段。假如你盘算在一个表中包括BIT型字段,你必需在创立表时完成。
存储日期和工夫
当你创建一个网点时,你大概必要纪录在一段工夫内的会见者数目。为了可以存储日期和工夫,你必要利用DATETIME型数据,以下例所示:
CREATETABLvisitorlog(visitorVARCHAR(40),arrivaltimeDATETIME,
departuretimeDATETIME)
这个表能够用来纪录会见者进进和分开你网点的工夫和日期。一个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。比方,上面的表中两个字段都同意承受空值:
CREATETABLEempty(empty1CHAR(40)NULL,empty2INTNULL(
注重:
BIT型数据不克不及是空值。一个这类范例的字段必需取0大概1。
偶然你必要克制一个字段利用空值。比方,假定有一个表存储着信誉卡号码和信誉卡无效日期,你不会但愿有人输出一个信誉卡号码但不输出无效日期。为了强迫两个字段都输出数据,你能够用上面的办法创建这个表:
CREATETABLEcreditcards(creditcard_numberCHAR(20)NOTNULL,
Creditcard_expireDATETIMENOTNULL)
注重字段界说的前面跟有表达式NOTNULL。经由过程包括表达式NOTNULL,你能够克制任何人只在一个字段中拔出数据,而不输出另外一个字段的数据。
你将会发明,在你建立本人的网点过程当中,这类克制空值的才能长短常有效的。假如你指定一个字段不克不及承受空值,那末当你试图输出一个空值时,会有毛病告诫。这些毛病告诫能够为程序调试供应有代价的线索。
缺省值
假定有一个存储地点信息的表,这个表的字段包含街道、乡村、州、邮政编码和国度。假如你估计地点的年夜部分是在美国,你能够把这个值作为country字段的缺省值。
为了在创立一个表时指定缺省值,你可使用表达式DEFAULT。请看上面这个在创立表时利用缺省值的例子:
CREATETABLEaddresses(streetVARCHAR(60)NULL,
cityVARCHAR(40)NULL,
stateVARCHAR(20)NULL
zipVARCHAR(20)NULL,
countryVARCHAR(30)DEFAULT‘USA’)
在这个例子中,字段country的缺省值被指定为美国。注重单引号的利用,引号指明这是字符型数据。为了给非字符型的字段指定缺省值,不要把该值扩在引号中:
CREATETABLEorders(priceMONEYDEFAULT$38.00,
quantityINTDEFAULT50,
entrydateDATETIMEDEFAULTGETDATE())
在这个CREATETABLE语句中,每一个字段都指定了一个缺省值。注重DATETIME型字段entrydate所指定的缺省值,该缺省值是函数Getdate()的前往值,该函数前往以后的日期和工夫。
标识字段
每一个表能够有一个也只能有一个标识字段。一个标识字段是独一标识表中每笔记录的特别字段。比方,数据库pubs中的表jobs包括了一个独一标识每一个事情标识字段:
job_idjob_desc
…………………………………………………………….
11NewHireJobnotspecified
22ChiefExecutiveofficer
33BushnessOperationsManager
44ChiefFinancialOfficier
55Publisher
字段job_id为每一个事情供应了独一的一个数字。假如你决意增添一个新事情,新增纪录的job_id字段会被主动赋给一个新的独一值。
为了创建一个标识字段,你只需在字段界说前面加上表达式IDENTITY便可。你只能把NUMERIC型或INT型字段设为标识字段,这里有一个例子:
CREATETABLEvisitorID(theIDNUBERIC(18)IDENTITY,nameVARCHAR(40))
这个语句所创立的表包括一个名为theid的标识字段。每当一个新的会见者名字增加到这个表中时,这个字段就被主动赋给一个新值。你能够用这个表为你的站点的每个用户供应独一标识。
技能:
创建一个标示字段时,注重利用充足年夜的数据范例。比方你利用TINYINT型数据,那末你只能向表中增加255个纪录。假如你估计一个表大概会变得很年夜,你应当利用NUMERIC型数据。
标识字段的存在会使你想实验很多不成能的事变。比方,你大概想使用标识字段来对纪录举行基于它们在表中地位的运算。你应当丢弃这类企图。每一个纪录的标识字段的值是互不不异的,可是,这其实不克制一个标识字段的标识数字之间存在距离。比方,你永久不要试牟利用一个表的标识字段来掏出表中的前十个纪录。这类操纵会招致失利,好比说6号纪录和7号纪录基本不存在。
利用SQL事件办理器创立新表
你可使用后面几节所讲的办法创立新表。可是,利用事件办理器创立新表会更简单。这一节先容怎样利用这个程序创立新表。
从义务栏的SQLSever程序组当选择SQLEnterpriseManager,启动该程序,你会看到如0.4所示的窗口。扫瞄服务办理器窗口中的树形布局,选择名为Database的文件夹。翻开文件夹Database后,选择你在第三章中所创建的数据库。
注重:
假如你还没有创立本人的数据库,回到第三章创立它。你决不要向master,tempdb或任何别的体系数据库中增加数据。
在选择了数据库以后,你会看到一个名为Group/users的文件夹和一个名为objects的文件夹。翻开文件夹objects,你会看到很多文件夹,个中一个名为Tables。用右键单击文件夹Tables并选择Newtable,就会呈现如0.5所示的窗口。
你可使用ManagerTables窗口来创立一个新表。ManagerTables窗口有7个列:Key,Column,Name,Datatype,Size,Nulls和Default。ManagerTables窗口中的每行标明表中一个字段的信息。
0.4
10.5
要创建一个新表,你最少要输出一行信息。在名为ColumnName的列上面键进mycolumn。下一步,选择Datatype列,并从下拉列表当选择CHAR。当你在这两个列中输出信息后,窗口将是如0.6所示的模样。
0.6
你已创建了一个只要一个字段的复杂的表。单击保留按扭保留这个新表。当请求你输出新表的名字时,输出mytable并单击OK。如今这个表已保留到了你的数据库中。
假如你翻开服务办理器窗口中的文件夹Tables,你会看到你所创建的新表被列出。你能够双击该表的图表来编纂它,这时候ManagerTables窗口会从头呈现,你能够增添新的字段偏重新保留。
用SQL事件办理器能够做的事情,你都能够用SQL语句来完成。可是,事件办理器使得建表历程变得加倍复杂。
向表中增加数据
下一章将会商怎样利用SQL向一个表中拔出数据。可是,假如你必要向一个表中增加很多笔记录,使提供用于管理、检查、优化数据库操作的管理工具。 |
|