第17学时 数 据 查 询
在过去几个学时的课程里,我们已经讨论了如何创建数据库、创建表、分配许可和其他
管理任务。但我们还没有讨论如何取出存储在数据库里的数据。这是一个相当重要的功能,
你需要知道如何去做。
本学时的要点包括:
取数据
pubs数据库概览
打开一个数据库
SELECT语句
限制行数
函数
17.1 取数据
作为数据库日常操作的一部分,你需要从数据库中提取数据。如果无法提取数据,那么
存储的那些数据又有什么用呢?大多数时候,你和你的用户使用为向数据库输入数据而写的
那些应用程序来访问数据库中的数据。但有时,也可以用其他方法访问数据。其中最主要的
方法是使用SELECT语句。
17.2 pubs数据库概览
在先前大部分的时间里,我们使用 OrderCenter数据库完成了绝大多数练习。本学时和接
下来的几个学时里,我们将使用 pubs数据库。这是因为我们还没有在 OrderCenter数据库中放
图17-1 pubs数据库结构关
系图
158 SQL Server 7 24学时教程
任何数据。为了让你理解本章将要讨论的大量 SELECT语句,你必须充分了解pubs数据库的构
成和表之间的相互作用关系。正如我们前面提到的, pubs数据库是一个小型数据库,它在安
装SQL Server时同时被安装。pubs数据库是一个模仿出版公司数据库的模型。该数据库跟踪
作者、出版物、出版商以及其他类似信息。图 17-1显示了pubs数据库的结构关系图。
17.3 打开一个数据库
打开一个数据库就是你登录到SQL Server,并告诉SQL Server你将对一个指定的数据库执
行命令。当你正在SQL Query Analyzer中工作时,可以从两种途径中任选一种来打开数据库。
第一种方法是在右上角下拉列表框中选择所要打开的数据库的名称,如图 17-2所示。
图17-2 SQL Query Analyzer
中的数据库框
另一种途径是在一个SQL脚本中使用SQL Server的USE关键字,下面是该命令的语法:
其中<database_name>是你所要打开的数据库的名称。
17.4 SELECT语句
SELECT语句是从数据库的表中访问和提取数据的一种工具。它是最强有力的工具之一,
而且它有比SQL中其他语句多得多的可用选项。 SELECT语句可以从表中取出所有的行和列,
或者两者任一个的子集。最基本的 SELECT语句是从表中取出所有的行和列。在这个学时的大
部分例子中,我们将使用 authors表。要取出authors表中所有的行和列,你可以执行程序清单
17-1中的命令。
程序清单17-1 简单的SELECT语句
正如你所看到的,程序清单17-1的语句中包含四个基本部分。第一部分是关键字 SELECT.
它告诉SQL Server你将要做什么。语句下一部分是列名的列表,你可以列出你所要从表中输
159第17学时 数 据 查 询
出的列。稍后,我们将详细讨论。这里所做的只是用星号 (*)表示想取出表中所有的列。关键
字SELECT和列的列表组合在一起,有时称作 SELECT子句和SELECT列表。
语句的下一部分是关键字FROM.使用FROM关键字是为了告诉SQL Server你想从哪儿取
出列。最后,你告诉SQL Server需要从哪个表中取出数据。关键字 FROM和表的名字组合在一
起,通常叫做FROM子句。
这是最基本的SELECT语句,仅仅演示了你需要用 SELECT语句所做的工作的很小部分。
需要说明的一件事是,SELECT语句中这些组成部分的位置和间隔并不重要,只要你所写的单
词次序是正确的。例如,下面所有的语句都得到同一个结果,只是程序清单 17-1中语句的排
列较为合适。
和
和
和
执行了这个语句后,你将得到类似于图 17-3所示的结果集。
图17-3 程序清单17-1的结
果集
17.4.1 限制列
或许你会说,这样返回的数据太多了。在非常大的表中,这样要比你所需分类取出的信
息多得多。例如,如果公司的副总裁告诉你他需要一张包含每位作者的名字、姓氏和电话号
160 SQL Server 7 24学时教程
码的清单,将会出现什么样的结果呢?在上面的查询中,你可以找到你要的数据,但如果你
只看到所需要的数据,工作将容易得多。要做到这样,你应当列出需要看到的列的名称。如
果看一下上次查询的结果,你会发现列的名称都排列在返回信息的上面。在这个例子中,你
只需要去查询名为au_fname、au_lname和phone的列。程序清单17-2列出了这次查询需要运行
的命令。
程序清单17-2 限制列数
正如你所见,我们只是把SELECT语句中的星号(*)用由逗号分开的列名代替。 SELECT语
句的其余部分与我们前面列出的一模一样。查询结果如图 17-4所示。
图17-4 程序清单17-2的结
果集
17.4.2 改变列标题
程序清单17-2的查询结果集对于使用户不必再从大量的数据中分类找到所要的信息来说
更有用。对于大多数查询,人们经常更想直接看到所查询的数据。记住,我们现在是为公司
副总裁建一个电话号码清单。
有一个限制是你有时会遇到开发人员用不易理解的名字来命名表中的列。例如,一个名
为SAP的系统中,它所有的列名都是 6~8个字母的德语缩写。可以想象,一个对该系统不熟悉
的人如何才能理解这些列名。这里有一个办法就是改变列的名称,使它易于被人们理解。这
被称作“列别名”。程序清单17-3显示如何操作。
程序清单17-3 改变列标题
正如你所看到的,有两种方法可以解决这个问题。第一种是把别名放在列名的前面,并
161第17学时 数 据 查 询
用等号隔开,就像列名 au__fname、au__lname的情况一样。另一种方法是利用 SQL的AS关键
字。使用它时,可以把别名放在列名后面,并由 AS分开。这两种方法得到相同的结果。但使
用AS加别名是一个更好一点的方法。该查询的结果见图 17-5.
图17-5 程序清单17-3的结
果集
17.4.3 添加说明文字
使用SELECT语句时,另一种功能是向返回的结果集中加入说明文字。说明文字是加入到
返回结果中的字符串值。该值不随行的变化而变化。一个例子是在每一个从服务器返回的电
话号码前加入单词“Phone:”。程序清单17-4列出了该查询的代码。
程序清单17-4 加入说明文字
我们所做的是向结果集中加入单词“ Phone:”(即文字说明),如图17-6所示。它利用了
SQL字符串的连接功能:加号。你让 SQL Server将两个字符串连接而形成一个字符串。
在这个例子中,你也许会想“这又怎么样呢?”。诚然,这个例子并不能充分体现它的作
用,但加入文字说明可能有很多其他的用途。到目前为止,我们学习创建了一个只有名字、
姓氏和电话号码的电话号码清单。但大多数人并不用这种方法在电话号码本里查找电话号码,
他们按照“姓氏,名字”的样式来查找。同样,我们可以使用文字说明把两个列合并起来。
程序清单17-5显示了文字说明与列信息合并的用法。
程序清单17-5 合并列
我们在程序清单17-5中所做的是利用字符串连接功能,把 au_lname 和au_fname两列合并
为一个逻辑列,取名“Name”。该查询的结果如图17-7所示。
162 SQL Server 7 24学时教程
图17-6 程序清单17-4的结果集
图17-7 程序清单17-5的结果集
17.4.4 改变行序
[1] [2] [3] 下一页