sql基础转.docx

上传人:b****0 文档编号:18394450 上传时间:2023-08-16 格式:DOCX 页数:24 大小:31.83KB
下载 相关 举报
sql基础转.docx_第1页
第1页 / 共24页
sql基础转.docx_第2页
第2页 / 共24页
sql基础转.docx_第3页
第3页 / 共24页
sql基础转.docx_第4页
第4页 / 共24页
sql基础转.docx_第5页
第5页 / 共24页
sql基础转.docx_第6页
第6页 / 共24页
sql基础转.docx_第7页
第7页 / 共24页
sql基础转.docx_第8页
第8页 / 共24页
sql基础转.docx_第9页
第9页 / 共24页
sql基础转.docx_第10页
第10页 / 共24页
sql基础转.docx_第11页
第11页 / 共24页
sql基础转.docx_第12页
第12页 / 共24页
sql基础转.docx_第13页
第13页 / 共24页
sql基础转.docx_第14页
第14页 / 共24页
sql基础转.docx_第15页
第15页 / 共24页
sql基础转.docx_第16页
第16页 / 共24页
sql基础转.docx_第17页
第17页 / 共24页
sql基础转.docx_第18页
第18页 / 共24页
sql基础转.docx_第19页
第19页 / 共24页
sql基础转.docx_第20页
第20页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

sql基础转.docx

《sql基础转.docx》由会员分享,可在线阅读,更多相关《sql基础转.docx(24页珍藏版)》请在冰点文库上搜索。

sql基础转.docx

sql基础转

规律:

数字不用单引号,字符用单引号

选择

1.假设有一个名为email_table的表,包含名字和地址两个字段,要得到BillGates的e_mail地址,你可以使用下面的查询:

SELECTemailfromemail_tableWHEREname=’BillGates’

2.前面说过,查询可以在查询条件中包含逻辑运算符。

假如你想读取BillGates或Clinton总统的所有email地址,你可以使用下面的查询语句:

SELECTemailFROMemail_tableWHEREname=’BillGates’ORname=’presidentClinton’

(selectname,email,[add]fromnamewherename='zhd')单词不完整时,默认加[]

3.你可以在一个SELECT语句中一次取出多个字段,比如:

SELECTau_fname,au_lname,phoneFROMauthors

在SELECT语句中,你需要列出多少个字段,你就可以列出多少。

不要忘了把字段名用逗号隔开。

你也可以用星号(*)从一个表中取出所有的字段。

这里有一个使用星号的例子:

SELECT*FROMauthors

(SELECT*FROMNAME,NAME1)

4.你也可以用一个SELECT语句同时从多个表中取出数据,只需在SELECT语句的FROM从句中列出要从中取出数据的表名称即可:

SELECTau_name,titleFROMauthors,titles,titleauthor

WHEREauthors.au_id=titleauthor.au_id

ANDtitles.title_id=titleauthor.title_id

5.要指明表titles和表publishers之间的关系,你只要让这两个表有一个公共的字段就可以了。

在数据库pubs中,表titles和表publishers都有一个名为pub_id的字段。

如果你想得到书名及其出版商的一个列表,你可以使用如下的语句:

SELECTtitle,pub_nameFROMtitles,publishers

WHEREtitles.pub_id=publishers.pub_id

6.在SELECT语句中,你可以在缺省字段名后面仅跟一个新名字来取代它。

例如,可以用一个更直观易读的名字AuthorLastName来代替字段名au_lname:

SELECTau_lname‘AuthorLastName’FROMauthors

当这个SELECT语句执行时,来自字段au_lname的值会与“AuthorLastName”相联系。

查询结果可能是这样:

AuthorLastName

White

Green

Carson

O’Leary

Straight

注意字段标题不再是au_lname,而是被AuthorLastName所取代。

7.如果你想把表titles中的所有书的价格加倍,你可以使用下面的SELECT语句:

SELECTprice*2FROMtitles

当这个查询执行时,每本书的价格从表中取出时都会加倍。

但是,通过这种途径操作字段不会改变存储在表中的书价。

对字段的运算只会影响SELECT语句的输出,而不会影响表中的数据。

为了同时显示书的原始价格和涨价后的新价格,你可以使用下面的查询:

SELECTprice"Originalprice",price*2"Newprice"FROMtitles

当数据从表titles中取出时,原始价格显示在标题Originalprice下面,加倍后的价格显示在标题Newprice下面。

结果可能是这样:

originalpricenewprice

19.9939.98

11.9523.90

2.995.98

19.9939.98

19.100

8.你可以使用大多数标准的数学运算符来操作字段值,如加(+),减(-),乘(*)和除(/)。

你也可以一次对多个字段进行运算,例如:

SELECTprice*ytd_sales‘totalrevenue’FROMtitles

在这个例子中,通过把价格与销售量相乘,计算出了每种书的总销售额。

这个SELECT语句的结果将是这样的:

totalrevenue

81,859,05

46,318,20

55,978,78

81,859,05

40,619,68

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

SELECTau_fname+’’+au_lname’authorname’FROMauthors

(Selectau_fname+au_lname’authorname’fromauthors)

这个语句的执行结果将是这样的:

authornames

JohnsonWhite

MarjorieGreen

CherylCarson

MichaelO’Leary

DeanStraight

(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

如果你想把查询结果按降序排列,你可以使用关键字DESC。

SELECTau_lname,au_fnameFROMauthors

WHEREau_lname=’Ringer’ORDERBYau_lname,au_fnameDESC

这个查询从表authors中取出所有名字为Ringer的作者记录。

ORDERBY子句根据作者的名字和姓,将查询结果按降序排列。

结果是这样的:

au_lnameau_fname

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

RingerAnne

RingerAlbert

(2row(s)affectec)

取出互不相同的值

一个表有可能在同一列中有重复的值。

例如,数据库pubs的表authors中有两个作者的名字是Ringer。

如果你从这个表中取出所有的名字,名字Ringer将会显示两次。

在特定情况下,你可能只有兴趣从一个表中取出互不相同的值。

如果一个字段有重复的值,你也许希望每个值只被选取一次,你可以使用关键字DISTINCT来做到这一点:

SELCETDISTINCTau_lnameFROMauthorsWHEREau_lname=’Ringer’

警告:

如同ORDERBY子句一样,强制服务器返回互不相同的值也会增加运行开销。

不得不花费一些时间来完成这项工作。

因此,不是必须的时候不要使用关键字DISTINCT。

创建表

在查询窗口中键入下面的SQL语句,单击执行查询按钮,执行这个语句:

CREATETABLEguestbook(visitorVARCHAR(40),commentsTEXT,entrydateDATETIME)

删除表和修改表

1.要删除一个表,你可以使用SQL语句DROPTABLE。

DROPTABLEmytable

警告:

使用DROPTABLE命令时一定要小心。

一旦一个表被删除之后,你将无法恢复它。

2.如果你想清除表中的所有数据但不删除这个表,你可以使用TRUNCATETABLE语句。

TRUNCATETABLEmytable

3.虽然你不能删除和修改已经存在的字段,但你可以增加新字段。

ALTERTABLEmytableADDmynewcolumnINTNULL

注意:

ALTERTABLE只允许添加可包含空值或指定了DEFAULT定义的列。

索引(有待深入理解)

对于包含索引的数据库,SQLSever需要一个可观的额外空间。

例如,要建立一个聚簇索引,需要大约1.2倍于数据大小的空间。

索引有两种类型:

聚簇索引和非聚簇索引。

在聚簇索引中,索引树的叶级页包含实际的数据:

记录的索引顺序与物理顺序相同。

在非聚簇索引中,叶级页指向表中的记录:

记录的物理顺序与逻辑顺序没有必然的联系。

聚簇索引非常象目录表,目录表的顺序与实际的页码顺序是一致的。

非聚簇索引则更象书的标准索引表,索引表中的顺序通常与实际的页码顺序是不一致的。

一本书也许有多个索引。

例如,它也许同时有主题索引和作者索引。

同样,一个表可以有多个非聚簇索引。

通常情况下,你使用的是聚簇索引,但是你应该对两种类型索引的优缺点都有所理解。

每个表只能有一个聚簇索引,因为一个表中的记录只能以一种物理顺序存放。

通常你要对一个表按照标识字段建立聚簇索引。

但是,你也可以对其它类型的字段建立聚簇索引,如字符型,数值型和日期时间型字段。

从建立了聚簇索引的表中取出数据要比建立了非聚簇索引的表快。

当你需要取出一定范围内的数据时,用聚簇索引也比用非聚簇索引好。

例如,假设你用一个表来记录访问者在你网点上的活动。

如果你想取出在一定时间段内的登录信息,你应该对这个表的DATETIME型字段建立聚簇索引。

对聚簇索引的主要限制是每个表只能建立一个聚簇索引。

但是,一个表可以有不止一个非聚簇索引。

实际上,对每个表你最多可以建立249个非聚簇索引。

你也可以对一个表同时建立聚簇索引和非聚簇索引。

假如你不仅想根据日期,而且想根据用户名从你的网点活动日志中取数据。

在这种情况下,同时建立一个聚簇索引和非聚簇索引是有效的。

你可以对日期时间字段建立聚簇索引,对用户名字段建立非聚簇索引。

如果你发现你需要更多的索引方式,你可以增加更多的非聚簇索引。

非聚簇索引需要大量的硬盘空间和内存。

另外,虽然非聚簇索引可以提高从表中取数据的速度,它也会降低向表中插入和更新数据的速度。

每当你改变了一个建立了非聚簇索引的表中的数据时,必须同时更新索引。

因此你对一个表建立非聚簇索引时要慎重考虑。

如果你预计一个表需要频繁地更新数据,那么不要对它建立太多非聚簇索引。

另外,如果硬盘和内存空间有限,也应该限制使用非聚簇索引的数量。

这两种类型的索引都有两个重要属性:

你可以用两者中任一种类型同时对多个字段建立索引(复合索引);两种类型的索引都可以指定为唯一索引。

1.非聚簇索引:

CREATEINDEXmycolumn_indexONmytable(myclumn)

注意:

蓝色必填,索引名字

2.如果你需要改变一个索引的类型,你必须删除原来的索引并重建一个。

建立了一个索引后,你可以用下面的SQL语句删除它:

DROPINDEXmytable.mycolumn_index

聚簇索引:

可以使用关键字CLUSTERED。

CREATECLUSTEREDINDEXmycolumn_clust_indexONmytable(mycolumn)

(旧版本:

如果表中有重复的记录,当你试图用这个语句建立索引时,会出现错误。

但是有重复记录的表也可以建立索引;你只要使用关键字ALLOW_DUP_ROW把这一点告诉SQLSever即可:

CREATECLUSTEREDINDEXmycolumn_cindexONmytable(mycolumn)

WITHALLOW_DUP_ROW)

3.要对一个表建立唯一索引,可以使用关键字UNIQUE。

对聚簇索引和非聚簇索引都可以使用这个关键字。

这里有一个例子:

CREATEUNIQUECOUSTEREDINDEXmyclumn_cindexONmytable(mycolumn)

4.要建立一个对多个字段的索引──复合索引──在索引建立语句中同时包含多个字段名。

下面的例子对firstname和lastname两个字段建立索引:

CREATEINDEXname_indexONusername(firstname,lastname)

添加修改删除数据

添加:

向表中添加新记录

INSERTmytable(first_column,second_column,third_column)

VALUES(‘somedata’,’somemoredata’,’yetmoredata’)

你可以使用INSERT语句向文本型字段中插入数据。

但是,如果你需要输入很长的字符串,你应该使用WRITETEXT语句(旧版本)。

如果你在INSERT语句中只指定两个字段和数据会怎么样呢?

换句话说,你向一个表中插入一条新记录,但有一个字段没有提供数据。

在这种情况下,有下面的四种可能:

1.如果该字段有一个缺省值,该值会被使用。

2.如果该字段可以接受空值,而且没有缺省值,则会被插入空值。

3.如果该字段不能接受空值,而且没有缺省值,就会出现错误。

4.最后,如果该字段是一个标识字段,那么它会自动产生一个新值。

当你向一个有标识字段的表中插入新记录时,只要忽略该字段,标识字段会给自己赋一个新值。

向一个有标识字段的表中插入新记录后,你可以用SQL变量@@identity来访问新记录

的标识字段的值。

考虑如下的SQL语句:

INSERTmytable(first_column)VALUES(‘somevalue’)

INSERTanothertable(another_first,another_second)

VALUES(@@identity,’somevalue’)

如果表mytable有一个标识字段,该字段的值会被插入表anothertable的another_first字段。

这是因为变量@@identity总是保存最后一次插入标识字段的值。

(查询最后一个)

注意:

SETIDENTITY_INSERT表名Off,当IDENTITY_INSERT设置为OFF时,不能向表'book'中的标识列插入显式值。

SETIDENTITY_INSERT表名on,当IDENTITY_INSERT设置为ON时,必须指定表'book'中标识列的显式值。

删除:

要从表中删除一个或多个记录,需要使用SQLDELETE语句。

你可以给DELETE语句提供WHERE子句。

WHERE子句用来选择要删除的记录。

DELETEmytableWHEREfirst_column=’goodby’ORsecond_column=’solong’

如果你不给DELETE语句提供WHERE子句,表中的所有记录都将被删除。

如果你想删除应该表中的所有记录,应使TRUNCATETABLE语句。

当你使用TRUNCATETABLE语句时,记录的删除是不作记录的。

也就是说,这意味着TRUNCATETABLE要比DELETE快得多。

修改:

要修改表中已经存在的一条或多条记录,应使用SQLUPDATE语句。

同DELETE语句一样,UPDATE语句可以使用WHERE子句来选择更新特定的记录。

UPDATEmytableSETfirst_column=’Updated!

Second_column=’Updated!

Third_column=’Updated!

WHEREfirst_column=’UpdateMe1’

如果你不提供WHERE子句,表中的所有记录都将被更新。

注意:

你可以对文本型字段使用UPDATE语句。

但是,如果你需要更新很长的字符串,应使用UPDATETEXT语句。

Insert和select、update

有一个方法可以使INSERT语句一次添加多个记录。

INSERTmytable(first_column,second_column)

SELECTanother_first,another_second

FROManothertable

WHEREanother_first=’CopyMe!

这个语句从anothertable拷贝记录到mytable.只有表anothertable中字段another_first的值为’CopyMe!

’的记录才被拷贝。

如果你需要拷贝整个表,你可以使用SELECTINTO语句。

SELECT*INTOnewtableFROMmytable

你也可以指定只有特定的字段被用来创建这个新表。

SELECTfirst_columnINTOnewtable

FROMmytable

WHEREsecond_column=’CopyMe!

假设你想从一个表中删除一个字段。

使用SELECTINTO语句,你可以创建该表的一个拷贝,但不包含要删除的字段。

这使你既删除了该字段,又保留了不想删除的数据。

如果你想改变一个字段的数据类型,你可以创建一个包含正确数据类型字段的新表。

创建好该表后,你就可以结合使用UPDATE语句和SELECT语句,把原来表中的所有数据拷贝到新表中。

通过这种方法,你既可以修改表的结构,又能保存原有的数据。

其它常用表达式

1.假设你有一个表用来保存对你的站点进行民意调查的结果。

现在你想向所有对你的站点的评价在7到10之间的访问者发送书面的感谢信。

SELECTusernameFROMopinionWHEREvote>6andvote<11

这个SELECT语句会实现你的要求。

你使用下面的SELECT语句也可以得到同样的结果:

SELECTusernameFROMopinionWHEREvoteBETWEEN7AND10

2.现在假设你只想取出对你的站点投了1或者10的访问者的名字。

要从表opinion中取出这些名字,你可以使用如下的SELECT语句:

SELECTusernameFROMopinionWHEREvote=1orvote=10

这个SELECT语句会返回正确的结果,没有理由不使用它。

但是,存在一种等价的方式。

使用如下的SELECT可以得到相同的结果:

SELECTusernameFROMopinionWHEREvoteIN(1,10)

注意表达式IN的使用。

这个SELECT语句只取出vote的值等于括号中的值之一的记录。

3.你也可以使用IN来匹配字符数据。

例如,假设你只想取出BillGates或PresidentClinton的投票值。

SELECTvoteFROMopinionWHEREusernameIN(‘BillGates’,’PresidentClinton’)

4.你可以在使用BETWEEN或IN的同时使用表达式NOT。

例如,要取出那些投票值不在7到10之间的人的名字,你可以使用如下的SELECT语句:

SELECTusernameFROMopinionWHEREvoteNOTBETWEEN7and10

5.要选取那些某个字段的值不在一列值之中的记录,你可以同时使用NOT和IN,如下例所示:

SELECTvoteFROMopinionWHEREusernameNOTIN(‘BillGates’,’PresidentClinton’)

转换数据:

在需要的时候可以把大部分数值从一种类型转换为另一种类型。

假设你想从一个MONEY型字段中取出所有的值,并在结果后面加上字符串“USDollars”。

你需要使用函数CONVERT()

SELECTCONVERT(CHAR(8),price)+ ‘USDollars’FROMorders

函数CONVERT()带有两个变量。

第一个变量指定了数据类型和长度。

第二个变量指定了要进行转换的字段。

在这个例子中,字段price被转换成长度为8个字符的CHAR型字段。

字段price要被转换成字符型,才可以在它后面连接上字符串’USDollars’。

当向BIT型,DATETIME型,INT型,或者NUMERIC型字段添加字符串时,你需要进行同样的转换操作。

例如,下面的语句在一个SELECT语句的查询结果中加入字符串’Thevoteis’,该SELECT语句返回一个BIT型字段的值:

SELECT‘Thevoteis’+CONVERT(CHAR

(1),vote)FROMopinion

下面是这个语句的结果示例:

Thevoteis1

Thevoteis1

Thevoteis0

操作字符串数据

1.要把一个字符串与另一个字符串的一部分相匹配,你需要使用通配符。

你使用通配符和关键字LIKE来实现模式匹配。

取出包含关键字tradingcard的站点的列表

SELECTSITE_nameFROMsite_directoryWHEREsite_descLIKE‘%tradingcark%’

百分号是通配符的例子之一。

它代表0个或多个字符。

2.目录分成更多页:

你想显示所有首字母在A到M之间的站点

SELECTsite_nameFROMsite_directoryWHEREsite_nameLIKE‘[A-M]%’

你想显示所有首字母在N到Z之间的站点

SELECTsite_nameFROMsite_directoryWHEREsite_nameLIKE‘[N-Z]%’

3.你想显示那些以A,B或C开头的站点,

SELECTsite_nameFROMsite_directoryWHEREsite_nameLIKE‘[ABC]%’

4.你可以取出那些首字母在C到F之间,或者以字母Y开头的站点:

SELECTsite_nameFROMsite_directoryWHEREsite_nameLIKE‘[C-FY]%’

5.你也可以使用脱字符(^)来排除特定的字符或字符范围。

要得到那些名字不以Y开头的站点,

SELECTsite_nameFROMsite_directoryWHEREsite_nameLIKE‘[^Y]%’

6.通过使用下划线字符(_),你可以匹配任何单个字符。

例如,下面这个查询返回每一个其名字的第二个字符为任何字母的站点:

SELECTsite_nameFROMsite_directoryWHEREsite_nameLIKE‘M_crosoft’

与通配符’%’不同,下划线只代表单个字符。

注意:

如果你想匹配百分号或下划线字符

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学反思汇报

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2