SQL Server实用基础教程第5章 SQL语言.docx
- 文档编号:30460433
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:50
- 大小:294.88KB
SQL Server实用基础教程第5章 SQL语言.docx
《SQL Server实用基础教程第5章 SQL语言.docx》由会员分享,可在线阅读,更多相关《SQL Server实用基础教程第5章 SQL语言.docx(50页珍藏版)》请在冰豆网上搜索。
SQLServer实用基础教程第5章SQL语言
第5章 SQL语言
ÿ本章学习目标
在SQLServer2000的应用程序中,有两种方法可以用来对SQLServer数据库中的数据进行操作:
一种是Internet应用程序通过统一资源定位器(URLs)或ADO和OLEDB应用程序接口来执行Xpath查询或T-SQL语句,然后SQLServer再以XML文档的形式返回数据,这就是SQLServer2000中增加的对XML支持的特性;另一种是应用程序利用数据库应用程序接口来执行T-SQL语句,然后SQLServer再以表的形式返回数据给用户,这也是关系数据库比较传统的方式。
SQLServer所提供的T-SQL语言不仅可以完成数据的查询,而且还具有数据库管理的功能,例如SQLServer所提供的企业管理器所能完成的大多数功能,都可以利用T-SQL语言编写的代码来实现。
因此,也可以这样说,SQL(结构化查询语言)是一种在关系数据库中定义和操纵数据的标准语言。
SQL语言通常分成四类:
查询语言(SELECT)、操纵语言(INSERT、UPDATE、DELETE)、定义语言(CREATE、ALTER、DROP)和控制语言(COMMIT、ROLLBACK)。
其中的定义语言在前面的章节中已经有了详细的讲解,这里就不再赘述了,而有关控制语言方面的知识也将在后面的相关章节中进行讲述,因此本章就主要对查询语言和操纵语言进行详细的介绍,主要包括数据的查询、插入数据、修改数据和删除数据等内容。
对数据库表中数据的操作是SQLServer中最常用的操作,而熟练使用T-SQL语言来进行该操作,则会达到事半功倍的效果,因此读者应该重点掌握,以便为今后深层次的学习打下更加坚实的基础。
ÿ学习重点与难点
☑数据查询方法与技巧
☑数据的插入
☑修改数据
☑删除数据
☑使用企业管理器存取和修改数据
5.1查询语言
SQL语言中最重要、最核心的部分就是它的查询功能,而查询语言就是主要用来对已经存在于数据库中的数据按照特定的组合、条件表达式或次序进行检索的。
SQL执行查询的最基本方式是使用SELECT语句,该语句按照用户给定的条件从SQLServer数据库中取出数据,并将它们通过一个或多个结果集返回给用户。
与作为数据库对象的表类似,SELECT语句的结果集也采用表的形式,即由行和列组成。
SELECT语句主要由以下几个方面来描述其要返回的结果集:
◆要查询的表有哪些,以及这些表之间的逻辑关系。
◆结果集中要包含的列有哪些,也就是要从表中取哪些列的数据出来。
◆从表中取出数据所需要的条件,也就是表中的行可以被取出到结果集中的条件。
◆取出到结果集中的行按什么方式进行排序。
该语句的基本格式为:
SELECT<列表名>
[INTO<新表名>]
FROM<表或视图名>
[WHERE<查询限定条件>]
[GROUPBY<表达式>]
[HAVING<条件>]
[ORDERBY<表达式>[ASC|DESC]]
以上格式中用中括号括起来的部分为可选项目,用户可根据查询的需要进行选择。
5.1.1简单查询
所谓简单查询,就是在进行数据查询时不对要查询的表中的行添加限定条件,也就是说,该查询是针对表中的所有记录来进行检索的,而此操作最后要做的也最多是对查询的结果集进行一些必要的设置。
1、检索表中所有列
对一个表的所有列进行检索,以查询出该表中所有已经存在的数据,是SQL查询语言中最基本的操作,而其所使用的语句也是SELECT语句中最基本的语句形式。
其格式如下:
SELECT*FROM〈表名〉
例、要对前面建立的Sales数据库中的Customers表中所有列及其所有已经存在的记录进行查询,可以在查询分析器中输入下面的语句:
USESales
SELECT*
FROMCustomers
在查询分析器中执行该语句后,可看到在其结果窗格中显示出了该表中的所有列及其存在的所有记录,如图5-1所示。
2、检索表中特定列
用户可以指定表中特定的列来进行检索,这种方式可以使所查询到的结果集一目了然,便于用户对结果集进行查看。
该方式通常用于用户对要查询的内容有很强的针对性时的查询操作。
其格式为:
SELECT<列名表列>
FROM〈表名〉
例、要查询Sales数据库Goods表中所有货品的库存量,则只需要查询出该表中的“品名”列和“库存量”列即可,此时就需用到对特定列进行检索的方法。
要在查询分析器中进行输入的具体语句如下:
USESales
SELECT品名,库存量
FROMGoods
该语句的执行结果如图5-2所示。
图5-1 显示所有列及其记录 图5-2 执行特定列查询
3、重排列顺序
默认情况下,在对表中数据的查询过程中,其结果集中的列顺序是按照其在原表中的排列顺序进行排列的。
但是,用户也可以根据特定的需要对结果集中的列序进行重排,以充分显示要查询的结果的主次关系。
一般来讲,在SELECT后面的列名的顺序决定了显示结果中列的顺序。
因此,用户可以通过改变SELECT后面的列名的顺序来对结果集中的列重新排序。
例、在对Customers表的查询中,为了掌握该销售部门在以后工作中的重点对象,需要首先了解各客户的职位,这就有必要在查询的结果集中让“职位”列排在最前面。
不仅如此,为了联系的方便,在该查询中还有必要让“电话”列排在“地址”列的前面,以使进行电话联系时一目了然。
因此,应该在查询分析器中输入下要的语句:
USESales
SELECT职位,姓名,电话,地址
FROMCustomers
执行该语句后所返回的结果集如图5-3所示。
4、用单引号加入字符串
有时,为了使查询到的列具有可读性,还需要为其添加一些说明性的文字。
在SQL语言中,可以在SELECT语句的列名表列中通过使用单引号为结果集加入字符串或常量,从而为特定的列进行注释。
例、在查询Orders表中的“客户号”、“货品名称”和“下单日期”列时,即可以在查询结果中为“货品名称”列添加备注,以说明该列中名称的意义。
其具体代码如下:
USESales
SELECT客户号,下单日期,货品名称,‘*名称为代号*’
FROMOrders
在查询分析器中执行该语句的结果如图5-4所示。
5、改变列标题
在默认的情况下,结果集显示的查询结果中的列标题都是列名。
但用户也可以通过以下两种方法来改变结果集中的列标题:
◆采用“列标题=列名”的格式。
◆采用“列名[AS]列标题”的格式。
图5-3 按顺序显示查询的列 图5-4为结果集加入字符串和常量
例、在图5-4所显示的查询结果中,用户就可以非常方便地用改变列标题的方法,使查询到的“货品名称”列显示为“货品代号”列。
其具体代码如下:
USESales
SELECT客户号,下单日期,货品名称AS‘货品代号’
FROMOrders
当然,用户也可以使用以下的代码来进行操作:
USESales
SELECT客户号,下单日期,‘货品代号’=货品名称
FROMOrders
应用以上两种代码分别在查询分析器中执行以后,其结果分别如图5-5和图5-6所示。
从这两个图中可以看出,执行两种代码后,在查询分析器的结果窗格中所返回的结果集是完全一样的。
图5-5改变列标题
(一) 图5-6 改变列标题
(二)
6、消除重复行
在有的时候,查询到的结果集中的数据会出现大量的重复信息。
这时,用户可以使用SQL语言所提供的关键字DISTINCT来消除结果集中的重复行。
例、当在Customers表中查询销售部门所联系的客户的具体职位都有哪些时,就会出现一些重复的信息。
如果要求消除其中的重复信息,则需使用以下的语句:
USESales
SELECTDISTINCT职位
FROMCustomers
该语句执行后的结果集如图5-7所示。
由图可知,该结果集中并没有将所有客户的职位一一显示出来,而是每一种职位的信息只显示了一次,这样就达到了执行本次查询的目的。
7、返回有限的结果
在要查询的结果集中,如果用户并不需要其后面的一些记录,则可以使用TOP关键字来限制查询时返回的记录的个数。
其语法格式为:
TOPn[PERCENT]
其中,n表示的是需要返回的查询记录的个数。
参数PERCENT为可选项,即如果使用了该参数,则表示要返回的记录的个数为记录总数的百分之n个;不使用该参数,则返回的记录数就是n所表示的数字。
例、要在Orders表中查询最先订货的五个客户及其相关信息,可使用以下代码:
SELECTTOP5*
FROMOrders
而要查询Orders表中最先订货的前百分之二十的客户及其相关信息,就需要使用以下的代码:
SELECTTOP20PERCENT*
FROMOrders
通过在查询分析器中执行后可知,第一种代码会在结果集中显示出五条记录,而第二种代码则最多只能在结果集中显示出所有的九条记录中的两条。
8、使用算术运算符操纵列
在查询结果集中列出现的位置上,用户可以使用算术运算符来操纵列,并可以对查询的结果进行计算。
这些运算符包括:
+(加)、—(减)、*(乘)、/(除)和%(取模)。
例、可以对Sales数据库中的Goods表中的列进行计算,从而在查询结果中形成两个新的列:
“货品”和“金额”。
其具体代码如下:
USESales
SELECT货号,品名+’(’+描述+’)’AS‘货品’,
库存量*价格AS‘金额’
FROMGoods
该语句在查询分析器中执行后,其结果如图5-8所示。
由图可知,在结果集中所显示的“货品”列是由Goods表中的“品名”列加上左括号,再加上“描述”列,然后又在最后加上右括号而得到的;而其中的“金额”列则是由Goods表中的“库存量”列与“价格”列相乘得到的。
图5-7 消除结果集中的重复行 图5-8 对查询的结果进行计算
9、使用函数操纵列
在结果集中列出现的位置上,还可以使用SQL语言所提供的各类函数来对查询结果进行计算。
通常使用的函数有数学函数、字符函数、日期函数、系统函数和安全函数。
下面即是一些常用的函数及其意义:
◆substring函数:
取子字符串函数。
可以在其中应用一些相关的参数,以限制所要取得的子字符串的范围。
◆getdate()函数:
用于返回当前的日期和时间。
该函数用于为所创建的表中的日期列添加默认值。
◆year(data)函数:
用于返回日期中的年份。
◆convert函数:
实现类型转换的函数。
该函数可用于将表中的某些特定列的数据类型进行强制转换。
下面仅举几个简单的例子以抛砖引玉,有关函数用户可以参阅中文版SQLServer2000的联机丛书。
例如:
查询Sales数据库中Goods表的“品名”列的前两个字符(即只在结果集中显示出货品的品牌),并将其中的重复行消除。
其代码如下:
USESales
SELECTDISTINCTsubstring(品名,1,2)AS‘品牌’
FROMGoods
同理,要查询Customers表中客户在北京分布的情况,则可以用以下的代码来进行查询:
USESales
SELECTDISTINCTsubstring(地址,1,3)AS‘地区’
FROMCustomers
以上两代码在查询分析器中执行后分别如图5-9中的两种结果所示。
substring函数中的第二个参数表示从所取字段(列)的第几个字符开始,如果有兴趣,可以自己将其进行更改后再来查看一下结果。
例如,返回当前连接服务器的用户名。
其代码如下:
SELECT‘LOGIN’=SUSER_SNAME()
其执行结果如图5-10所示。
图5-9查询子字符串 图5-10 查询当前连接服务器的用户名
例如:
查询pubs数据库的titles表中所有书的价格信息,对于书名长度超过38个字符的,将其多余部分截掉。
其具体代码如下:
USEpubs
SELECTconvert(char(38),title)+’IS$’+
convert(varchar(10),price)
FROMtitles
pubs数据库是SQLServer的示例数据库,
因为pubs数据库是SQLServer2000中提供的示例数据库,所以有关titles表中title列和price列的原数据类型,用户可以自己进行查看。
另外,本章中有关pubs数据库的例子,读者都可自行在查询分析器中输入相应的代码来查看其执行结果。
5.1.2选择行查询
在现实应用中,大多数的查询都不是针对全表所有行的查询,而只是从整个表中选出想要的记录即可。
要实现这样的特定的查询,就要用到WHERE子句。
WHERE子句中条件的书写与一般高级语言中条件的书写基本相同。
一般来讲,用于在WHERE子句中书写条件的操作运算符见表5-1。
表5-1 书写条件的运算符
搜索功能
运算符
比较
=、>、<、>=、<=、<>、!
=、!
<、!
>
范围
BETWEEN、NOTBETWEEN
列表
IN、NOTIN
字符串匹配
LIKE、NOTLIKE
未知值判断
ISNULL、ISNOTNULL
组合条件
AND、OR
取反
NOT
应该尽量避免使用否定条件,因为有的时候在查询的过程中,查询优化器并不能识别否定条件。
1、基于比较选择行
基于比较的选择行查询,其WHERE子句中的查询条件可以是比较布尔表达式,这些表达式可以使用任何一个比较运算符(例如:
=、>、<、>=、<=、<>、!
=、!
<、!
>)。
其语法格式如下:
SELECT<列表名>
FROM<表或视图名>
WHERE<表达式><比较运算符><表达式>
例、要在Sales数据库的Goods表中查询库存量大于70的货品的信息,则其代码如下:
USESales
SELECT*
FROMGoods
WHERE库存量>’70’
其执行结果如图5-12所示。
图5-12 查询库存量大于70的货品信息
系统在执行这种条件查询时,逐行地对表中的数据进行比较(假设是全表扫描),检查它们是否满足条件。
如果满足条件,则取出该行,如果不满足条件,则不取该行。
使用WHERE子句时,若该列是字符型和日期型,需要使用单引号将字符括起来,而且单引号中的字符串区分大小写形式。
2、基于范围选择行
基于范围进行选择行查询时,需要在WHERE子句中使用BETWEEN或NOTBETWEEN运算符。
格式:
SELECT<列表名>
FROM<表或视图名>
WHERE<表达式> [NOT]BETWEEN<表达式>AND<表达式>
例、要在Sales数据库的Orders表中查询订货日期在3/7/2004到3/9/2004之间的客户号、货品名称、订货数量以及订货日期等信息,其具体代码如下:
USESales
SELECT客户号,货品名称,数量,下单日期
FROMOrders
WHERE下单日期BETWEEN‘3/7/2004’AND‘3/9/2004’
这里使用的是BETWEEN运算符。
如果要查询的结果为不在该日期范围内的有关信息,则可以在此使用NOTBETWEEN运算符来对条件进行限制,但是SQLServer一般不推荐使用这个运算符,而应通过其他方法来设定该条件。
以上语句在查询分析器中执行后,其结果如图5-13所示。
图5-13查询限定日期范围的订货信息
3、基于列表选择行
如果要执行基于列表的选择行查询,则需使用IN运算符。
IN运算符的作用是检查列值是否等于它后面括弧内的一组值中的任意一个,如果等于其中一个,就将其取出来放入结果集之中。
格式:
SELECT<列表名>
FROM<表或视图名>
WHERE[NOT]<表达式>[NOT]IN(列值)
例、要查询Sales数据库的Orders表中除了方正品牌以外的所有订单信息,则可使用以下的语句来执行查询:
USESales
SELECT*
FROMOrders
WHERE货品名称NOTIN(‘方正A’,’方正B’)
该查询的执行结果如图5-14所示。
图5-14 查询除方正外的所有订单信息
4、基于字符串选择行
所谓基于字符串来选择行进行查询,也就是说在执行查询时,对字符串进行比较,以实现字符串之间的模糊匹配。
执行该类查询,需要使用LIKE运算符。
格式:
SELECT<列表名>
FROM<表或视图名>
WHERE<表达式>[NOT]LIKE 字符串
在WHERE子句中的表达式的值和指定的字符串相同时,选择条件为TRUE。
在指定的字符串中可以包含通配符。
在SQLServer中,共提供了如下四个通配符:
◆百分号(%):
代表任意多个字符。
有三种情况:
当其置于字符后面时,表示以其前面的字符开头的字符串;当其置于字符前面时,表示以其后面的字符结尾的字符串;当字符置于两个百分号中间时,表示中间出现这些指定字符的字符串。
◆下划线(_):
代表单个字符。
用于表示仅在同一个位置上有不相同字符的字符串。
◆中括号([]):
代表指定范围内的单个字符。
位于中括号中间的既可以是单个字符(如[abcd]),也可以是指定的一个字符范围(如[a-d])。
◆复合符号([^]):
代表不在指定范围内的单个字符。
其用法与中括号基本相似,即中间既可以是单个字符(如[^abcd]),也可以是指定的一个字符范围(如[^a-d])。
含通配符的字符串要用单引号引起来。
例、要查询Sales数据库的Customers表中电话号码第一位数字为6的客户的信息,则其代码如下:
USESales
SELECT*
FROMCustomers
WHERE电话LIKE‘6%’
5、基于未知值选择行
未知值即指空的、不存在的或不可应用的数据,通常用NULL表示。
使用ISNULL、ISNOTNULL运算符,可以基于未知值进行选择行查询。
格式:
SELECT<列表名>
FROM<表或视图名>
WHERE<列名>IS[NOT]NULL
例、要显示Sales数据库中Customers表所有没有记录地址的客户,则其代码如下:
USESales
SELECT客户号,姓名
FROMCustomers
WHERE地址ISNULL
6、基于多个搜索条件选择行
用户还可以基于多个搜索条件进行选择行查询,在该查询中,可以使用逻辑运算符(NOT、AND、OR)来连接多个条件,从而构成一个更复杂的条件以进行查询。
例、查询Sales数据库的Customers表中地址在朝阳区,并且电话号码第一位数字为6或8的客户的信息。
其具体代码如下:
USESales
SELECT姓名,职位,电话,地址
FROMCustomers
WHERE(电话LIKE‘6%’OR电话LIKE‘8%’)
AND(地址LIKE‘朝阳区%’)
该代码的执行结果如图5-17所示。
图5-17基于多个搜索条件进行选择行查询
7、结果排序
用户可以为查询的结果集指定特殊的排序方式,在查询时使用ORDERBY子句即可以改变查询结果的显示顺序。
其语法格式如下:
SELECT<列表名>
FROM<表或视图名>
[WHERE<查询限定条件>]
[ORDERBY<表达式>[ASC|DESC],……]
在进行该查询时应注意以下几个问题:
(1)在ORDERBY中可以使用列号。
(2)如果没有指定,缺省为升序。
(3)可以对多达16个列执行ORDERBY子句。
例、查询Sales数据库的Orders表中的订单信息,其结果按照数量的升序和金额的降序(在数量相同时)进行排列。
其具体代码如下:
USESales
SELECT*
FROMOrders
ORDERBY数量,金额DESC
该查询语句执行后的结果如图5-18所示。
图5-18结果排序
5.1.3生成总结数据
使用SQL查询语言,用户可以方便地为查询到的结果进行分组、计算或对其进行过滤等,从而得到总结性的数据结果集。
1、使用集合函数进行统计
使用SQLServer提供的集合函数,可以计算表中数据的总和,然后得到统计的结果,并将其显示出来。
SQLServer中提供的集合函数见表5-2:
表5-2 集合函数及其说明
集合函数
说 明
AVG
求平均值
COUNT
求记录数
MAX
求最大值
MIN
求最小值
SUM
求和
在以上所有的集合函数中,除了COUNT函数需要考虑NULL值外,其他集合函数都不考虑NULL值列。
下面分别对上述各集合函数进行介绍:
(1)AVG
该函数用于计算查询结果的平均值。
其语法格式为:
AVG([ALL|DISTINCT]算术表达式)
其中各参数的意义如下:
◆ALL:
全部数据都参与计算,为默认的选项。
◆DISTINCT:
消除重复的数据,只计算不同的值的平均值。
◆算术表达式:
该表达式既可以只涉及一列,也可以涉及多列。
例:
计算Sales数据库中Goods表的所有货品的平均价格。
其代码如下:
USESales
SELECTAVG(价格)
FROMGoods
执行该语句后显示,所有的库存商品的平均价格为6250.00元。
(2)MIN
该函数用于查找最小值。
其语法格式为:
MIN([ALL|DISTINCT]算术表达式)
该函数及以下的各个函数的参数均与AVG函数一样。
例:
查找Sales数据库中Goods表的所有货品中最便宜的价格。
其代码如下:
USESales
SELECTMIN(价格)
FROMGoods
执行结果显示,最便宜的价格为5500.00元。
(3)MAX
该函数用于查找最大值。
其语法格式为:
MAX([ALL|DISTINCT]算术表达式)
例:
查找Sales数据库中Goods表的所有货品中最昂贵的价格。
其代码如下:
USESales
SELECTMAX(价格)
FROMGoods
执行结果显示,最昂贵的价格为7000.00元。
(4)SUM
该函数用于计算查询到的数据值的总和。
其语法格式为:
SUM([ALL|DISTINCT]算术表达式)
例:
计算pubs数据库的titles表中所有商业类书籍的平均预付款和本年度迄今为止的全部销售额。
其代码如下:
USEpubs
SELECTAVG(advance),SUM(ytd_sales)
FROMtitles
WHEREtype=‘business’
执行结果显示,所有商业类书籍的平均预付款为6281.25元,本年度迄今为止的全部销售额为30788.00元。
(5)COUNT
该函数可以计算查询到的结果的数目。
其语法格式分为两种情况:
(1)计算不为空的行数:
COUNT([ALL|DISTINCT]算术表达式)
(2)计算所有行的数目(包括有空
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SQL Server实用基础教程第5章 SQL语言 Server 实用 基础教程 语言