14. 使用 T-SQL 检索数据
SELECT 陈述式
使用 T-SQL 函数
SELECT 的其它用法
本章总结
在本章中,您将学习如何使用 Transcat-SQL(T-SQL)的 SELECT 陈述式来检索资料,本章同时涵盖许多在 SELECT 陈述式中使用的选择性子句、搜寻条件和函数。这些元素在您提出查询时有助于您找到真正需要的数据。
SELECT 陈述式
尽管 SELECT 陈述式主要用于检索特定的数据,它同时也可以用来分配值给本域变量或呼叫函数,这部分内容会在本章最后的 〈SELECT 的其它用途〉 一节介绍。SELECT 陈述式可以很简单,也可以很复杂-当然能不复杂最好。当您还要再继续检索结果时,尽量使您的 SELECT 陈述式简单化。例如,如果您只需要一个数据表中的两个数据行的数据,那么只须把这两个数据行包括在 SELECT 陈述式中,以减少传回的数据量。
当您决定哪些数据要从哪些数据表回传后,您可以加入其它任何有必要的选项。这些选项包括:使用索引时,指定 WHERE 子句中要包括哪些数据行、指定传回的数据是否需要排序、指定是否只需要回传不同的数据。关于查询最佳化的相关信息,请参阅 第35章 。
让我们从检视 SELECT 陈述式中的不同选项和每个子句的检索范例讲起。本章范例中使用的数据库是 pubs 和 Northwind,这两个数据库在您安装 Microsoft SQL Server 2000 时即已自动建立。您可以使用 SQL Server Enterprise Manager 来检视 pubs 和 Northwind 数据库的数据表,以熟悉这两个数据库。
SELECT 陈述式的语法由几个选择性的子句组成。在大多数的情况下,一个SELECT 陈述式至少包括一条 SELECT 子句和 FROM 子句。这两条子句分别判断哪一个数据行或哪几个数据行的数据需要检索,以及从哪个数据表中检索数据。例如,对于 pubs 数据库的 authors 数据表,一条简单的 SELECT 陈述式如下:
SELECT au_fname, au_lname
FROM authors
如果您使用 OSQL 命令数据列 ( 第13章 中介绍的 ),不要忘记使用 GO 命令执行陈述式。要使用 OSQL,SELECT 陈述式的完整的 T-SQL 语法如下:
USE pubs
SELECT au_fname, au_lname
FROM authors
GO
________________________________________
说明
由于关键词并不分大小写,您可以随意使用,但最好尽量保持一致,以便您的语法便于阅读。因此,本书中关键词均采用大写字母。
________________________________________
当您互动地使用 SELECT 陈述式时 (例如使用 OSQL 或 SQL Server 查询 Analyzer ),结果会显示在各数据行中,同时每一个数据行都以标题指明。 (有关 T-SQL 简介、OSQL 和查询 Analyzer 的介绍,请参考 第13章 )
SELECT 子句
SELECT 子句由选择性的自变量和您所要求的选取清单组成。 选取清单 (select list)是一个包含 表达式 (expression)或数据行的清单,用以在 SELECT 子句中指明哪些数据行需要回传。下面介绍选择性的自变量和选取清单。
自变量
SELECT 子句使用下列两个自变量控制传回的数据数据列:
• DISTINCT 只传回唯一的资料列。如果选择的清单包括数个数据行,当至少有一数据行的数据值不同时,数据列会被视为是唯一的。如果有两数据列数据相同,它们必定在每一数据行中的值都相同。
• TOP n [PERCENT] 传回结果集合的前 n 数据列。如果指定了PERCENT,那么将只传回前 n 个百分比的资料列数。当使用 PERCENT 时,n 必须是介于 0 到 100 之间的数。如果查询中包括一条 ORDER BY 子句 (ORDER BY 子句将在本章后面 〈ORDER BY子句〉 一节中细述),数据列会先按顺序排数据列,然后从排好的结果中传回前 n 资料列或前百分之 n 资料列。
下面的 T-SQL 语法显示了 SELECT 子句范例,它执行了三次,每次使用不同的自变量。第一次查询时使用 DISTINCT 自变量,第二次使用 TOP 50 PERCENT 自变量,第三次使用 TOP 5 自变量。
SELECT DISTINCT au_fname, au_lname
FROM authors
GO
SELECT TOP 50 PERCENT au_fname, au_lname
FROM authors
GO
SELECT TOP 5 au_fname, au_lname
FROM authors
GO
第一次查询传回 23 数据列,每一数据列均为唯一的。第二次传回 12 数据列 (大约为 50%,无条件进入 ),第三次传回 5 资料列。
选取清单
如上所述,选取清单是关于表达式或数据行的清单,用于在 SELECT 子句中指定哪些数据行的数据需要回传。表达式可以是数据行名称、函数或常数的清单。选取清单可以包括好几个表达式或数据行名称,彼此之间用逗号隔开。上面的例子使用了以下的选取清单:
au_fname, au_lname
星号或万用符号 您可以使用星号 (* )或万用符号在选取清单中指定需要传回FROM 子句中指定数据表和检视表的所有数据和数据行。例如,传回 sales 数据表的所有数据行的数据列,可以使用下列查询:
SELECT *
FROM sales
GO
本章后面 〈交叉联结〉 一节将讲述当 SELECT * 陈述式的 FROM 子句资料列出了不只一个资料表的情形。
IDENTITYCOL和ROWGUIDCOL 要从数据表中的识别数据行(Identity Column)中检索数值,可以简单地在选取清单中使用 IDENTITYCOL 表达式。下面是查询 Northwind 数据库的范例,其中 Employess 数据表中定义了识别数据行:
USE Northwind
GO
SELECT IDENTITYCOL
FROM Employees
GO
结果集将如下面所示:
EmployeeID
----------
3
4
8
1
2
6
7
5
9
(影响9个数据列)
请您注意结果集中的数据行标题和数据库中具有 IDENTITY 属性的数据行的名称符合,在本例中是 EmployeeID。
同样的,您可以在选取清单中使用 ROWGUIDCOL 表达式检索资料列的通用唯一识别码(GUID)数据行,即具有 ROWGUIDCOL 属性的数据行。必须是 uniqueidentifier 数据型别的数据行才有 ROWGUIDCOL 属性。
数据行别名 使用数据行别名可以使结果集中显示的数据行标题换成您希望的样子。使用别名可让输出数据行中的数据意义更清楚,可指派标题给函数中使用的数据行,亦可在 ORDER BY 子句中引用这些别名。
当在多个不同的资料表中拥有同名的数据行,为了易于分辨起见,您可能需要在输出的数据行标题中包含数据表的名称。举一个使用别名的例子。让我们看看 pubs 数据库中的 employee 数据表中的lname数据行。如果您执行以下的查询:
USE pubs
GO
SELECT lname
FROM employee
GO
将会得到如下的结果:
lname
--------
Cruz
Roulet
Devon
...
O'Rourke
Ashworth
Latimer
(影响43个数据列)
要使显示结果中的数据行标题 lname 换成 「 Employee Last Name」,以强调lname的实质意义,可利用 AS 关键词:
SELECT lname AS "Employee Last Name"
FROM employee
GO
此命令显示的结果为:
Employee Last Name
------------------
Cruz
Roulet
Devon
...
O'Rourke
Ashworth
Latimer