SQL Sever数据库语法介绍及相关例子

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地址,但晓得你能这样做总是好的,或许有一天你会有这样的需求。
你的数据库很有能够包括几十个表,一切存储在你数据库中的信息都被存储在这些表中。当你思考怎样把信息存储在数据库中时,你应该思考怎样把它们存储在表中。
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的查找。你将得到其描绘中一起包括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标签,回来到查询窗口,输入以下的SELECT句子:

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句子中,你需求列出多少个字段,你就能够列出多少。不要忘了把字段名用逗号离隔。你也能够用星号(*)从一个表中取出一切的字段。这里有一个运用星号的比方:

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。注重跟在数据类型后边的括号中的数字。这个数字指定了这个字段所答应寄存的字符串的最大长度。在这个比方中,字段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,
quantity INT DEFAULT 50,
entrydate DATETIME DEFAULT GETDATE())

在这个CREATE TABLE句子中,每个字段都指定了一个缺省值。注重DATETIME型字段entrydate所指定的缺省值,该缺省值是函数Getdate()的回来值,该函数回来当时的日期和时刻。

标识字段
每个表能够有一个也只能有一个标识字段。一个标识字段是仅有标识表中每条记载的格外字段。例如,数据库pubs中的表jobs包括了一个仅有标识每个作业标识字段: 

job_id job_desc
…………………………………………………………….
1 New Hire Job not specified
2 Chief Executive officer
3 Bushness Operations Manager
4 Chief Financial Officier
5 Publisher

字段job_id为每个作业供给了仅有的一个数字。若是你决议增加一个新作业,新增记载的job_id字段会被主动赋给一个新的仅有值。
为了树立一个标识字段,你只需在字段界说后边加上表达式IDENTITY即可。你只能把NUMERIC型或INT型字段设为标识字段,这里有一个比方:

CREATE TABLE visitorID (theID NUBERIC(18) IDENTITY,name VARCHAR(40))

这个句子所创立的表包括一个名为theid的标识字段。每逢一个新的拜访者姓名增加到这个表中时,这个字段就被主动赋给一个新值。你能够用这个表为你的站点的每一个用户供给仅有标识。
窍门:
树立一个标明字段时,注重运用满意大的数据类型。例如你运用TINYINT型数据,那么你只能向表中增加255个记载。若是你估计一个表能够会变得很大,你应该运用NUMERIC型数据。

标识字段的存在会使你想测验许多不能够的作业。例如,你或许想运用标识字段来对记载进行依据它们在表中方位的运算。你应该扔掉这种目的。每个记载的标识字段的值是互不相同的,可是,这并不制止一个标识字段的标识数字之间存在距离。例如,你永久不要企图运用一个表的标识字段来取出表中的前十个记载。这种操作会致使失利,比方说6号记载和7号记载底子不存在。

运用SQL业务管理器创立新表
你能够运用前面几节所讲的办法创立新表。可是,运用业务管理器创立新表会更简略。这一节分析怎么运用这个程序创立新表。
从使命栏的SQL Sever程序组中挑选SQL Enterprise Manager,发动该程序,你会看到如图10.4所示的窗口。阅读效劳管理器窗口中的树形布局,挑选名为Database的文件夹。翻开文件夹Database后,挑选你在第三章中所树立的数据库。

注重:
若是你还没有创立个人的数据库,回到第三章创立它。你决不要向master,tempdb或任何其它体系数据库中增加数据。

在挑选了数据库之后,你会看到一个名为Group/users的文件夹和一个名为objects的文件夹。翻开文件夹objects,你会看到许多文件夹,其间一个名为Tables。用右键单击文件夹Tables并挑选New table,就会呈现如图10.5所示的窗口。
你能够运用Manager Tables窗口来创立一个新表。Manager Tables窗口有7个列:Key,Column,Name,Datatype,Size,Nulls和Default。Manager Tables窗口中的每一行标明表中一个字段的信息。

图10.4
10.5

要树立一个新表,你至少要输入一行信息。在名为Column Name的列下面键入mycolumn。下一步,挑选Datatype列,并从下拉列表中挑选CHAR。当你在这两个列中输入信息后,窗口将是如图10.6所示的姿态。

图10.6

你现已树立了一个只需一个字段的简略的表。单击保管按扭保管这个新表。当需求你输入新表的姓名时,输入mytable并单击OK。如今这个表现已保管到了你的数据库中。
若是你翻开效劳管理器窗口中的文件夹Tables,你会看到你所树立的新表被列出。你能够双击该表的图表来修正它,这时Manager Tables窗口会从头呈现,你能够增加新的字段并从头保管。
用SQL业务管理器能够做的作业,你都能够用SQL句子来完结。可是,业务管理器使得建表进程变得愈加简略。

向表中增加数据
下一章将评论怎么运用SQL向一个表中刺进数据。可是,若是你需求向一个表中增加许多条记载,运用SQL句子输入数据是很不便利的。走运的是,Microsoft SQL Sever带有一个称为Microsoft Query 的客户端应用程序,这个程序使得向表中增加数据变得简略了。
发动坐落使命栏SQL Sever程序组中的Microsoft Query程序。从窗口顶部的菜单中挑选File|New Query。这时会显现一个Select Data Source对话框(见图10.7)。挑选你的数据源姓名并单击Use。

图10。7

输入你的登录帐号和暗码后,程序需求你挑选一个表和一个数据库。挑选你在上一节中所树立的表(mytable ),单击按钮Add,然后单击按钮Close封闭该对话框。
在窗口的左上角会呈现一个对话框,框中是取自表mytable的一列字段名。你能够双击任何一个字段,把它增加到主窗口中。若是你双击星号(*)字符,一切的字段都会被增加到主窗口中。
若是你的表中有记载,它们如今现已呈如今主窗口的字段标题下面了。可是,由于你刚刚树立了这个表,表仍是空的。要增加新记载,挑选Records|Allow Editing,主窗口中就会呈现一条新记载。输入一行数据完结这个记载,就向表中增加了一条新记载。

图10。8

当你转到下一条新记载时,你向上一条记载中输入的值会主动被保管。若是你需求,你能够用Microsoft Query 向表中输入几百条记载。

删去和修正表
你应该在树立表之前细心描绘它们,由于你在改动一个现已存在的表时会遭到很大的约束。例如,一旦现已树立了一个表,你就不能删去表中的字段或许改动字段的数据类型。在这种状况你所能做的是删去这个表,然后重头开端(拜见第十一章“中级SQL”中的“运用SQL创立记载和表”一节)。
要删去一个表,你能够运用SQL句子DROP TABLE。例如,又从数据库中完全删去表mytable,你要运用如下的句子:

DROP TABLE mytable

正告:
运用DROP TABLE指令时必定要当心。一旦一个表被删去之后,你将无法康复它。

当你建造一个站点时,你很能够需求向数据库中输入测验数据。而当你预备向国际供给你的网点时,你会想清空表中的这些测验信息。若是你想铲除表中的一切数据但不删去这个表,你能够运用TRUNCATE TABLE句子。例如,下面的这个SQL句子从表mytable中删去一切数据:

TRUNCATE TABLE mytable

尽管你不能删去和修正现已存在的字段,但你能够增加新字段。最简略的完结办法是运用SQL业务管理器中的Manager Tables窗口。你也能够运用SQL句子ALTER TABLE。下面是一个怎么运用这种句子的比方:

ALTER TABLE mytable ADD mynewcolumn INT NULL

这个句子向表mytable中增加了一个新字段mynewcolumn。当你增加新字段时,你有必要答应它承受空值,由于表中本来能够现已有了许多记载。

总结
这一章向你分析了SQL。运用SQL,你能够操作Microsoft SQL Sever数据库。你现已学会了运用SELECT句子从数据库中取出数据,你还学会了怎样运用CREATE TABLE句子和SQL业务管理器来创立新表。结尾,你学会了怎么指明一系列重要的字段特色。
下一章将分析怎么运用索引来增强SQL查询的操作。还将经过许多其它的SQL句子和函数,使你的SQL常识得到进一步扩大。

 

中级SQL

本章内容
■创立索引
■SQL中心句子
■调集函数
■ 其它常用的SQL表达式,
函数,和进程

 

第十章“SQL根底”向你开始分析了SQL。你学会了怎么用SELECT句子进行查询,你还学会了怎么树立个人的表。在这一章里,你将加深你的SQL常识。你将学习怎么树立索引来加速查询速度。你还将学会若是用更多的SQL句子和函数来操作表中的数据。

树立索引
假定你想找到本书中的某一个句子。你能够一页一页地逐页查找,但这会花许多时刻。而经过运用本书的索引,你能够很快地找到你要查找的主题。
表的索引与附在一本书后边的索引十分类似。它能够极大地进步查询的速度。对一个较大的表来说,经过加索引,一个一般要花费几个小时来完结的查询只需几分钟就能够完结。因而没有理由对需求频频查询的表增加索引。
注重:
当你的内存容量或硬盘空间缺乏时,或许你不想给一个表增加索引。关于包括索引的数据库,SQL Sever需求一个可观的额定空间。例如,要树立一个聚簇索引,需求大约1.2倍于数据巨细的空间。要看一看一个表的索引在数据库中所占的空间巨细,你能够运用体系存储进程sp_spaceused,对象名指定为被索引的表名。

聚簇索引和非聚簇索引
假定你现现已过本书的索引找到了一个句子地点的页码。一旦现已晓得了页码后,你很能够漫无目的翻寻这本书,直至找到正确的页码。经过随机的翻寻,你结尾能够抵达正确的页码。可是,有一种找到页码的更有用的办法。
首要,把书翻到大约一半的当地,若是要找的页码比半本书处的页码小,就书翻到四分之一处,不然,就把书翻到四分之三的当地。经过这种办法,你能够持续把书分红更小的有些,直至找到正确的页码邻近。这是找到册页的十分有用的一种办法。
SQL Sever的表索引以类似的办法作业。一个表索引由一组页组成,这些页构成了一个树形布局。根页经过指向别的两个页,把一个表的记载从逻辑上分红和两个有些。而根页所指向的两个页又别离把记载切割成更小的有些。每个页都把记载分红更小的切割,直至抵达叶级页。
索引有两种类型:聚簇索引和非聚簇索引。在聚簇索引中,索引树的叶级页包括实践的数据:记载的索引次序与物理次序相同。在非聚簇索引中,叶级页指向表中的记载:记载的物理次序与逻辑次序没有必定的联络。
聚簇索引十分象目录表,目录表的次序与实践的页码次序是共同的。非聚簇索引则更象书的规范索引表,索引表中的次序一般与实践的页码次序是不共同的。一本书或许有多个索引。例如,它或许一起有主题索引和作者索引。相同,一个表能够有多个非聚簇索引。
一般状况下,你运用的是聚簇索引,可是你应该对两种类型索引的优缺点都有所晓得。
每个表只能有一个聚簇索引,由于一个表中的记载只能以一种物理次序寄存。一般你要对一个表依照标识字段树立聚簇索引。可是,你也能够对其它类型的字段树立聚簇索引,如字符型,数值型和日期时刻型字段。
从树立了聚簇索引的表中取出数据要比树立了非聚簇索引的表快。当你需求取出必定规模内的数据时,用聚簇索引也比用非聚簇索引好。例如,假定你用一个表来记载拜访者在你网点上的活动。若是你想取出在必定时刻段内的登录信息,你应该对这个表的DATETIME型字段树立聚簇索引。
对聚簇索引的首要约束是每个表只能树立一个聚簇索引。可是,一个表能够有不止一个非聚簇索引。实践上,对每个表你最多能够树立249个非聚簇索引。你也能够对一个表一起树立聚簇索引和非聚簇索引。
假定你不只想依据日期,并且想依据用户名从你的网点活动日志中取数据。在这种状况下,一起树立一个聚簇索引和非聚簇索引是有用的。你能够对日期时刻字段树立聚簇索引,对用户姓名段树立非聚簇索引。若是你发现你需求更多的索引办法,你能够增加更多的非聚簇索引。
非聚簇索引需求许多的硬盘空间和内存。别的,尽管非聚簇索引能够进步从表中 取数据的速度,它也会下降向表中刺进和更新数据的速度。每逢你改动了一个树立了非聚簇索引的表中的数据时,有必要一起更新索引。因而你对一个表树立非聚簇索引时要慎重思考。若是你估计一个表需求频频地更新数据,那么不要对它树立太多非聚簇索引。别的,若是硬盘和内存空间有限,也应该约束运用非聚簇索引的数量。

索引特色
这两种类型的索引都有两个重要特色:你能够用两者中任一种类型一起对多个字段树立索引(复合索引);两种类型的索引都能够指定为仅有索引。
你能够对多个字段树立一个复合索引,乃至是复合的聚簇索引。假定有一个表记载了你的网点拜访者的姓和姓名。若是你期望依据完好姓名从表中取数据,你需求树立一个一起对姓字段和姓姓名段进行的索引。这和别离对两个字段树立独自的索引是不相同的。当你期望一起对不止一个字段进行查询时,你应该树立一个对多个字段的索引。若是你期望对各个字段进行别离查询,你应该对各字段树立独立的索引。
两种类型的索引都能够被指定为仅有索引。若是对一个字段树立了仅有索引,你将不能向这个字段输入重复的值。一个标识字段会主动成为仅有值字段,但你也能够对其它类型的字段树立仅有索引。假定你用一个表来保管你的网点的用户暗码,你当然不期望两个用户有相同的暗码。经过强迫一个字段成为仅有值字段,你能够防止这种状况的发作。

用SQL树立索引
为了给一个表树立索引,发动使命栏SQL Sever程序组中的ISQL/w程序。进入查询窗口后,输入下面的句子:

CREATE INDEX mycolumn_index ON mytable (myclumn)

这个句子树立了一个名为mycolumn_index的索引。你能够给一个索导致任何姓名,但你应该在索引名中包括所索引的字段名,这对你将来弄清楚树立该索引的目的是有协助的。
注重:
在本书中你履行任何SQL句子,都会收到如下的信息:
This command did not return data,and it did not return any rows
这说明该句子履行成功了。
索引mycolumn_index对表mytable的mycolumn字段进行。这是个非聚簇索引,也是个非仅有索引。(这是一个索引的缺省特色)
若是你需求改动一个索引的类型,你有必要删去本来的索引并重建 一个。树立了一个索引后,你能够用下面的SQL句子删去它:

DROP INDEX mytable.mycolumn_index

注重在DROP INDEX 句子中你要包括表的姓名。在这个比方中,你删去的索引是mycolumn_index,它是表mytable的索引。
要树立一个聚簇索引,能够运用关键词CLUSTERED。)记住一个表只能有一个聚簇索引。(这里有一个怎么对一个表树立聚簇索引的比方:

CREATE CLUSTERED INDEX mycolumn_clust_index ON mytable(mycolumn)

若是表中有重复的记载,当你企图用这个句子树立索引时,会呈现过错。可是有重复记载的表也能够树立索引;你只需运用关键词ALLOW_DUP_ROW把这一点通知SQL Sever即可:

CREATE CLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn)
WITH ALLOW_DUP_ROW

这个句子树立了一个答应重复记载的聚簇索引。你应该尽量防止在一个表中呈现重复记载,可是,若是现已呈现了,你能够运用这种办法。
要对一个表树立仅有索引,能够运用关键词UNIQUE。对聚簇索引和非聚簇索引都能够运用这个关键词。这里有一个比方:

CREATE UNIQUE COUSTERED INDEX myclumn_cindex ON mytable(mycolumn)

这是你将常常运用的索引树立句子。无论何时,只需能够,你应该尽量对一个对一个表树立仅有聚簇索引来增强查询操作。
结尾,要树立一个对多个字段的索引──复合索引──在索引树立句子中一起包括多个字段名。下面的比方对firstname和lastname两个字段树立索引:

CREATE INDEX name_index ON username(firstname,lastname)

这个比方对两个字段树立了单个索引。在一个复合索引中,你最多能够对16个字段进行索引。

用业务管理器树立索引
用业务管理器树立索引比用SQL句子简略的多。运用业务管理器,你能够看到现已树立的索引的列表,并能够经过图形界面挑选索引选项。
运用业务管理器你能够用两种办法树立索引:运用Manage Tables窗口或运用Manage Indexes窗口。
要用Manage Tables 窗口树立一个新索引,单击按钮Advanced Options(它看起来象一个前面有一加号的表)。这样就翻开了Advanced Options对话框。这个对话框有一有些标名为Primary Key(见图11.1)。

图11。1

要树立一个新索引,从下拉列表中挑选你想对之树立索引的字段名。若是你想树立一个对多字段的索引,你能够挑选多个字段名。你还能够挑选索引是聚簇的还对错聚簇的。在保管表信息后,索引会主动被树立。在Manage Tables窗口中的字段名周围,会呈现一把钥匙。
你现已为你的表树立了“主索引”。主索引有必要对不包括空值的字段树立。别的,主索引强迫一个字段成为仅有值字段。
要树立没有这些约束的索引,你需求运用Manage Indexes窗口。从菜单中挑选Manage|Indexes,翻开Manage Indexes 窗口。在Manage Indexes 窗口中,你能够经过下拉框挑选表和特定的索引。(见图11.2)。要树立一个新索引,从Index下拉框中挑选New Index.,然后就能够挑选要对之树立索引的字段。单击按钮Add,把字段加人到索引中。

图11。2

你能够为你的索引挑选许多不相同的选项。例如,你能够挑选该索引是聚簇的还对错聚簇的。你还能够指定该索引为仅有索引。描绘好索引后,单击按钮Build,树立该索引。

注重:
仅有索引是指该字段不能有重复的值,而不是只能树立这一个索引。

SQL中心句子
在第十章,你学会了怎么用SQL SELECT 句子从一个表中取数据。可是,到如今为止,还没有评论怎么增加,修正或删去表中的数据。在这一节中,你将学习这些内容。

刺进数据
向表中增加一个新记载,你要运用SQL INSERT 句子。这里有一个怎么运用这种句子的比方:

INSERT mytable (mycolumn) valueS (‘some data’)

这个句子把字符串’some data’刺进表mytable的mycolumn字段中。将要被刺进数据的字段的姓名在榜首个括号中指定,实践的数据在第二个括号中给出。
INSERT 句子的完好句法如下:

INSERT [INTO] {table_name|view_name} [(column_list)] {DEFAULT valueS |
values_list | select_statement}

若是一个表有多个字段,经过把字段名和字段值用逗号离隔,你能够向一切的字段中刺进数据。假定表mytable有三个字段first_column,second_column,和third_column。下面的INSERT句子增加了一条三个字段都有值的完好记载:

INSERT mytable (first_column,second_column,third_column)
valueS (‘some data’,’some more data’,’yet more data’)

注重:
你能够运用INSERT句子向文本型字段中刺进数据。可是,若是你需求输入很长的字符串,你应该运用WRITETEXT句子。这有些内容对本书来说太高档了,因而不加评论。要晓得更多的信息,请参阅Microsoft SQL Sever 的文档。

若是你在INSERT 句子中只指定两个字段和数据会怎么样呢?换句话说,你向一个表中刺进一条新记载,但有一个字段没有供给数据。在这种状况下,有下面的四种能够:
■ 若是该字段有一个缺省值,该值会被运用。例如,假定你刺进新记载时没有给字段third_column供给数据,而这个字段有一个缺省值’some value’。在这种状况下,当新记载树立时会刺进值’some value’。
■ 若是该字段能够承受空值,并且没有缺省值,则会被刺进空值。
■ 若是该字段不能承受空值,并且没有缺省值,就会呈现过错。你会收到过错信息:
The column in table mytable may not be null.
■ 结尾,若是该字段是一个标识字段,那么它会主动发作一个新值。当你向一个有标识字段的表中刺进新记载时,只需疏忽该字段,标识字段会给个人赋一个新值。

注重:
向一个有标识字段的表中刺进新记载后,你能够用SQL变量@@identity来拜访新记载
的标识字段的值。思考如下的SQL句子:

INSERT mytable (first_column) valueS(‘some value’)

INSERT anothertable(another_first,another_second)
valueS(@@identity,’some value’)

若是表mytable有一个标识字段,该字段的值会被刺进表anothertable的another_first字段。这是由于变量@@identity总是保管结尾一次刺进标识字段的值。
字段another_first应该与字段first_column有相同的数据类型。可是,字段another_first不能是应该标识字段。Another_first字段用来保管字段first_column的值。

删去记载
要从表中删去一个或多个记载,需求运用SQL DELETE句子。你能够给DELETE 句子供给WHERE 子句。WHERE子句用来挑选要删去的记载。例如,下面的这个DELETE句子只删去字段first_column的值等于’Delete Me’的记载:

DELETE mytable WHERE first_column=’Deltet Me’

DELETE 句子的完好句法如下:

DELETE [FROM] {table_name|view_name} [WHERE clause]

在SQL SELECT 句子中能够运用的任何条件都能够在DELECT 句子的WHERE子句 中运用。例如,下面的这个DELETE句子只删去那些first_column字段的值为’goodbye’或second_column字段的值为’so long’的记载:

DELETE mytable WHERE first_column=’goodby’ OR second_column=’so long’

若是你不给DELETE 句子供给WHERE 子句,表中的一切记载都将被删去。你不该该有这种主意。若是你想删去应该表中的一切记载,应运用第十章所讲的TRUNCATE TABLE句子。

注重:
为啥要用TRUNCATE TABLE 句子替代DELETE句子?当你运用TRUNCATE TABLE句子时,记载的删去是不作记载的。也就是说,这意味着TRUNCATE TABLE 要比DELETE快得多。

更新记载
要修正表中现已存在的一条或多条记载,应运用SQL UPDATE句子。同DELETE句子相同,UPDATE句子能够运用WHERE子句来挑选更新特定的记载。请看这个比方:

UPDATE mytable SET first_column=’Updated!’ WHERE second_column=’Update Me!’

这个UPDATE 句子更新一切second_column字段的值为’Update Me!’的记载。对一切被选中的记载,字段first_column的值被置为’Updated!’。
下面是UPDATE句子的完好句法:

UPDATE {table_name|view_name} SET [{table_name|view_name}]
{column_list|variable_list|variable_and_column_list}
[,{column_list2|variable_list2|variable_and_column_list2}…
[,{column_listN|variable_listN|variable_and_column_listN}]]
[WHERE clause]

注重:
你能够对文本型字段运用UPDATE句子。可是,若是你需求更新很长的字符串,应运用UPDATETEXT句子。这有些内容对本书来说太高档了,因而不加评论。要晓得更多的信息,请参阅Microsoft SQL Sever 的文档。


若是你不供给WHERE子句,表中的一切记载都将被更新。有时这是有用的。例如,若是你想把表titles中的一切书的价钱加倍,你能够运用如下的UPDATE 句子:
你也能够一起更新多个字段。例如,下面的UPDATE句子一起更新first_column,second_column,和third_column这三个字段:

UPDATE mytable SET first_column=’Updated!’
Second_column=’Updated!’
Third_column=’Updated!’
WHERE first_column=’Update Me1’

窍门:
SQL疏忽句子中剩余的空格。你能够把SQL句子写成任何你最简略读的格局。


用SELECT 创立记载和表
你或许现已注重到,INSERT 句子与DELETE句子和UPDATE句子有一点不相同,它一次只操作一个记载。可是,有一个办法能够使INSERT 句子一次增加多个记载

posted on 2013-01-23 01:23  show_time  阅读(343)  评论(0编辑  收藏  举报