13. T-SQL 与 SQL Query Analyzer
什么是SQL?
什么是 T-SQL?
介绍 T-SQL 的新特色
如何使用 T-SQL
本章总结
在本章中我们将介绍结构化查询语言〈Structured Query Language,SQL〉与Transact-SQL〈T-SQL〉一些基本的观念以及这两种语言之间的差异。本章解释了数据定义语言〈DDL〉与 数据操作语言 ,并且包含了范例。我们也将简单介绍 Microsoft SQL Server 2000 中 T-SQL的新功能。您将学习如何使用不同的 SQL Server 公用程序来建立和管理数据库对象,包括命令列 T-SQL 和 SQL Query Analyzer。您也可以学到建立 T-SQL 指令码的相关知识。
什么是SQL?
SQL 是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系型数据库系统。美国国家标准局(ANSI)与国际标准化组织(ISO)已经制定了 SQL 标准。ANSI 是一个美国工业和商业集团组织,发展美国的商务和通讯标准。ANSI 同时也是 ISO 和 International Electrotechnical Commission(IEC)的成员之一。ANSI 发布与国际标准组织相应的美国标准。1992年,ISO 和 IEC 发布了 SQL 的国际标准,称为 SQL-92。ANSI 随之发布的相应标准是 ANSI SQL-92。ANSI SQL-92 有时被称为 ANSI SQL。尽管不同的关系型数据库使用的 SQL 版本有一些差异,但大多数都遵循 ANSI SQL 标准。SQL Server 使用 ANSI SQL-92 的扩展集,称为 T-SQL,其遵循 ANSI 制定的 SQL-92 标准。
SQL 语言包括两种主要程序设计语言类别的陈述式: 数据定义语言 (DDL)与 数据操作语言 (DML)。下面我们将介绍这两类语言。
DDL
DDL 用于定义和管理对象,例如数据库、数据表以及检视表( 第18章 将会解释何谓检视表)。DDL 陈述式通常包括每个对象的CREATE、ALTER 以及 DROP 命令。举例来说,CREATE TABLE、ALTER TABLE 以及 DROP TABLE 这些陈述式便可以用来建立新数据表、修改其属性(如新增或删除数据行)、删除数据表等,下面我们会一一介绍。
CREATE TABLE 陈述式
使用 DDL 在 MyDB 数据库建立一个名为 Customer_Data 的范例数据表,本章后面的例子我们会使用到这个数据表。如前所述,CREATE TABLE 陈述式可以用来建立数据表。这个范例数据表被定义成四个数据行,如下所示:
Use MyDB
CREATE TABLE Customer_Data
(customer_id smallint,
first_name char(20),
last_name char(20),
phone char(10))
GO
这个陈述式能产生 Customer_Data 数据表,这个数据表会一直是空的直到数据被填入数据表内。关于建立数据库数据表的细节,请参阅 第10章 。
ALTER TABLE 陈述式
ALTER TABLE 陈述式用来变更数据表的定义与属性。在下面的例子中,我们利用 ALTER TABLE 在已经存在的 Customer_Data 数据表中新增 middle_initial 数据行。
ALTER TABLE Customer_Data
ADD middle_initial char(1)
GO
现在数据表的定义包括了五个数据行,而不是之前的四个数据行。关于使用ALTER TABLE 的更多细节,请参阅 第15章 。
DROP TABLE 陈述式
DROP TABLE 陈述式用来删除数据表定义以及所有的数据、索引、触发程序、条件约束以及数据表的权限。要删除我们的 Customer_Data 数据表,可利用下列命令:
DROP TABLE Customer_Data
GO
关于 DROP TABLE 陈述式的详细内容,请参阅 第15章 。
DML
DML 利用 INSERT、SELECT、UPDATE 及 DELETE 等陈述式来操作数据库对象所包含的数据。
INSERT 陈述式
INSERT 陈述式用来在资料表或检视表中插入一列资料。例如,如果要在Customer_Data 数据表中新增一个客户,可使用类似以下的 INSERT 陈述式:
INSERT INTO Customer_Data
(customer_id, first_name, last_name, phone)
VALUES (777, "Frankie", "Stein", "4895873900")
请注意 SQL 陈述式中第二行的数据行名称清单,清单上数据行名称的次序决定了数据数值将被放在哪个资料行。举例来说,第一个数据数值将被放在清单列出的第一个数据行 customer_id、第二个资料数值放在第二个资料行,依此类推。由于我们在建立数据表时,定义数据数据行填入数值的次序与现在相同,因此我们不必特意指定字段名称。我们可以用以下的 INSERT 陈述式代替:
INSERT INTO Customer_Data
VALUES (777, "Frankie", "Stein", "4895873900")
________________________________________
注意
如果使用这种形式的 INSERT 陈述式,但被插入的数值次序上与建立数据表时不同,数值将被放入错误的数据行。如果数据的型别与定义不符,则会收到一个错误讯息。
________________________________________
SELECT 陈述式
SELECT 陈述式用来检索数据表中的数据,而哪些数据被检索由列出的数据行与陈述式中的 WHERE 子句决定。例如,要从之前建立的 Customer_Data 数据表中检索 customer_id 以及 first_name 数据行的数据,并且只想取出每列中 first_name 数据行值为 Frankie 的数据,那么可以利用以下的 SELECT 陈述式:
SELECT customer_id, first_name FROM Customer_Data
WHERE first_name = "Frankie"
如果有一列符合 SELECT 陈述式中的标准,则结果将显示如下:
customer_id first_name
------------- ------------
777 Frankie
UPDATE 陈述式
UPDATE 陈述式用来更新或改变一列或多列中的值。例如,一位名称为 Frankie Stein 的客户想要在记录中改变他的姓氏为 Franklin,可使用以下 UPDATE 陈述式:
UPDATE Customer_Data
SET first_name = "Franklin"
WHERE last_name = "Stein" and customer_id= 777
我们在 WHERE 子句中加入 customer_id 的项目来确定其它名称为 Stein 的客户不会被影响-只有customer_id为777的客户,姓氏会有所改变。
________________________________________
说明
当您使用 UPDATE 陈述式时,要确定在 WHERE 子句提供充份的筛选条件,如此才不会不经意地改变了一些不该改变的数据。
________________________________________
DELETE 陈述式
DELETE 陈述式用来删除数据表中一列或多列的数据,您也可以删除数据表中的所有数据列。要从 Customer_Data 数据表中删除所有的列,您可以利用下列陈述式:
DELETE FROM Customer_Data
或
DELETE Customer_Data
数据表名称前的 FROM 关键词在 DELETE 陈述式中是选择性的。除此之外,这两个陈述式完全相同。
要从 Customer_Data 数据表中删除 customer_id 数据行的值小于100的列,可利用下列陈述式:
DELETE FROM Customer_Data
WHERE customer_id < 100
现在我们已经快速浏览了 SQL 提供的 DDL 与 DML 陈述式,接着,下面将介绍 T-SQL。
什么是 T-SQL?
T-SQL 是标准 SQL 程序设计语言的增强版,它是用来让应用程序与 SQL Server 沟通的主要语言。T-SQL 提供标准 SQL的DDL 和 DML 功能,加上延伸的函数、系统预存程序以及程序设计结构(例如 IF 和 WHILE)让程序设计更有弹性。T-SQL 的功能随着新版的 SQL Server 而持续成长,让我们来看一下 T-SQL 最新增加的特色。
介绍 T-SQL 的新特色
在 Microsoft SQL Server 7.0 中 T-SQL 有着为数不少的新增功能,包括新的预存程序、系统数据表、函数、数据型别、陈述式以及现存陈述式中的选项。这些都被保留在 SQL Server 2000 中,因此我们在这里要先回顾 (特别是在您还不很熟悉 SQL Server 7.0 中 T-SQL 的功能,这个温习就很重要了)。因为有太多的新功能需要讨论,在此我们仅为每个类别举少数例子来加以介绍。
________________________________________
相关信息
要找寻这些功能的完整清单,可以参考 SQL Server《在线丛书》中 「Transact-SQL新增与加强的功能」 主题。
________________________________________
系统预存程序
系统预存程序是 SQL Server 提供来执行管理与其它工作,包括了系统数据表更新以及从系统数据表中检索数据等。系统预存程序是和 SQL Server 一起安装,名称以 sp_ (系统预存程序) 或 xp_ (延伸的预存程序)开头。这些预存程序储存在 master 数据库中,权限归系统管理者所有。不过,许多程序可以从使用者自订的数据库执行,用来在特定数据库中从系统数据表检索信息。当您执行一个系统预存程序,它是在目前数据库的系统数据表中展开作业。
________________________________________
相关信息
关于这类型程序的更多相关信息,请参考《在线丛书》中 「延伸预存程序」 主题。
________________________________________
在 SQL Server 7 中新增了许多系统预存程序,如今在 SQL Server 2000 中同样可以利用。表13-1列出了一些可能对您有所帮助的系统预存程序。
表13-1 Procedures Introduced....
系统预存程序 描述
sp_cycle_errorlog 关闭目前的错误日志档案,重新命名为errorlog.1(以及,如果需要的话,将旧的errorlog.1重新命名为errorlog.2,依此类推),以及开始一个新的错误日志档案。
sp_helpfile 传回与目前数据库相关之档案的名称与属性。
sp_helpfilegroup 传回与目前数据库相关之档案群组的名称与属性。
sp_helprole 传回与目前数据库相关中角色的信息。
sp_help_alert 报告服务器定义的警示信息。
sp_start_job 指示SQL Server代理程序开始执行一个工作。
并不是只有这些预存程序提供立即的信息,不过它们在使用您的使用者数据库时会相当有用。例如,当执行 T-SQL 指令码并将输出结果储存到一个档案时,提供使用者信息的程序就会相当有帮助。您可以将 sp_helpfile、sp_helpfilegroup以及 sp_helpdb 的执行结果储存在特定的数据库中,毕竟当您需要重建数据库时有必要了解档案、档案群组、数据库选项在起初建立时的原始设定。在 SQL Server 7.0 新增并保留 SQL Server 2000 中的系统预存程序清单,可以在《在线丛书》「Transact-SQL新增与加强的功能」这个主题里找到。
系统数据表
系统数据表用来储存 SQL Server 中所有数据库的设定信息,以及对象、使用者和使用者存取权限的定义。每个使用者数据库有各自的系统数据表,其中保存数据库的信息。只有在 master 数据库的系统数据表才握有服务器层级的设定信息。您应该利用系统预存程序来存取系统数据表而不是直接存取系统数据表。关于新的 SQL Server 7.0 新增的系统数据表清单可在《在线丛书》里的「Transact-SQL新增与加强的功能」这个主题里找到。底下列出一些有趣的新系统数据表:
backupfile这个数据表存放在 msdb 数据库中。它记录了所有记录文件备份或数据库档案备份的相关信息。这些信息包括档案识别码、档案归属的档案群组,以及档案存在的实体磁盘或数据分割的名称。
restorehistory这个数据表存放在 msdb 数据库中。它包含对应于各还原作业相关信息的数据列,不论是档案的还原或是数据库的还原。这些信息包括还原的日期与时间、目的数据库、数据回复的时间点以及还原的类型。
sysfiles此数据表为一虚拟数据表,亦即无法直接更新或修改。它包含了每个数据库档案的相关信息,诸如实体装置及逻辑的文件名称、档案大小及最大档案大小以及数据库增长大小(如果数据库有所增长的话)。
________________________________________
注意
请永远使用系统预存程序来存取系统数据表,系统预存程序提供一层隔离以确保您不会更动到不可更改的数据。如果您以手动方式存取系统数据表,可能会有变更重要系统信息的风险。
________________________________________
函数
SQL Server 内建的函数提供了一个快速、简单的方法来完成某些特定的工作。SQL Server 7.0 新增了几个有用的函数,并且也包含在 SQL Server 2000 中。了解哪些函数是可用的,SQL Server 应用程序的设计工作可以变得稍为简单。在《在线丛书》中的「Transact-SQL 新增与加强的功能」这个主题可以找到新增函数的完整清单。此处仅介绍一些对您可能很有帮助的函数:
NEWID 建立一个 uniqueidentifier 数据型别的 全域唯一识别项 (GUID)。您需要使用这个函数将值分派给该数据型别的数据行,使用方式为 NEWID() 。(此函数不需自变量)
YEAR 传回指定日期年份部分的完整整数。使用方式为 YEAR(date) 。例如:以下陈述式 SELECT YEAR('07/11/01') 将会传回值 2001。
MONTH 传回指定日期月份部分的整数。使用方式为 MONTH(date) 。例如:以下陈述式 SELECT MONTH('07/11/01') 将会传回值7。
DAY 传回指定日期日期部分的整数。使用方式为 DAY(date) 。例如:以下陈述式 SELECT DAY('07/11/01') 将会传回值 11。
FILE_NAME 传回档案识别码(ID)的逻辑文件名称。使用方式为 FILE_NAME (file_id_number)。例如:陈述式 SELECT FILE_NAME(4) 档案识别码为4的档案逻辑名称。如果数据库中找不到有此识别码的档案,则传回 NULL。
资料型别
在 SQL Server 7 中新增了几种新的数据型别,一些已经有的数据型别的尺寸也有延伸。此外,SQL Server 2000 新增了三种资料型别,这些资料别多数在 第10章 已经讨论过。此处仅列出 SQL Server 7 有改变,并且也包含在 SQL Server 2000 中的数据型别:
数据指针变量新增了一个 cursor 数据型别。关于指针的相关讯息,请参考《在线丛书》里「Cursors」这个主题。
新增了三种新的 Unicode 数据型别-nchar、nvarchar 以及 ntext。每一个 Unicode 字符使用两个字节,并支持所有国际字符。
新增了一种 uniqueidentifier 数据型别,用于储存通用唯一识别码(GUID)。
字符数据和二进制字符串的最大长度扩展到8,000字节。这一长度适用于 char、varchar、binary 以及 varbinary 等型别。
SQL Server 2000 则新增了下列资料型别:
bigint储存8个位组长度的整数。
sql_variant允许不同数据型别的值储存于同一个数据行。此型别的数据行储存数据本身的值并且加以描述-它的基本型别、小数字数、精确性、最大大小以及定序(collation)。
table运作方式与暂存数据表类似;其宣告包含数据行清单与数据型别。此数据型别可用来定义一个区域变量或是一个使用者自订函数的传回值。
陈述式
SQL Server 7.0 包括了许多新的 T-SQL 陈述式和已经存在陈述式的新选项。同样的,这些也保留在S QL 2000 之中。这些陈述式对应 SQL Server 7.0 的一些新功能。例如,ALTER DATABASE 陈述式包含了下列一些针对档案与档案群组的新选项:MODIFY FILE、ADD FILEGROUP、MODIFY FILEGROUP、REMOVE FILE 以及 REMOVE FILEGROUP。特别是档案群组,新的 DBCC CHECKFILEGROUP 陈述式会检查档案群组中所有数据表的分配和结构的完整性。
SQL Server 7.0 与 SQL Server 2000 包括两个额外的 DBCC 陈述式、DBCC SHRINKFILE 与 DBCC SHRINKDATABASE。前者能缩减数据文件的大小,后者可缩减数据库的所有数据文件并释放未使用的磁盘空间。
SQL Server 7 与 SQL Server 2000 支持一种改进的备份和还原结构。新的BACKUP 陈述式允许全部或部份的数据库备份和记录文件备份。新的 RESTORE 陈述式允许使用全部或部份数据库备份和记录文件备份来还原。这些代替了 SQL Server 较早版本中的 DUMP 和 LOAD 陈述式。关于 SQL Server 7.0 与 SQL Server 2000 新增陈述式与选项的完整清单,请见《在线丛书》里「Transact-SQL 新增与加强的功能」这个主题。
如何使用 T-SQL
除了使用 T-SQL 设计您的应用程序(这个主题已经超过本书的讨论范围)之外,您可以利用以下三个 SQL Server 的工具-ISQL、OSQL 或 Query Analyzer 其中之一来执行 T-SQL 陈述式,或是建立与执行 T-SQL 指令码。
ISQL 公用程序
ISQL 公用程序与 SQL Server 之间是透过 DB-Library 来沟通,它可以让您执行 T-SQL 陈述式、预存程序与指令码。由于 DB-Library 保留了 SQL Server 6.5 版的功能,因此 ISQL 应用程序可能无法支持部份 SQL Server 2000 的新功能。比方说,ISQL 就不能检索 Unicode ntext数据型别的数据。
OSQL公用程序
OSQL 公用程序是在 SQL Server 7.0 中新增并保留至 SQL Server 2000 的新工具,主要用来取代 ISQL。这两个公用程序基本上并没有很大差异,不过 OSQL 是利用 开放式数据库连结接口 (Open Database Connectivity,ODBC)与 SQL Server 沟通,而不是 DB-Library,并且 OSQL 支持 SQL Server 2000 所有的功能。OSQL 与 ISQL 的其它功能都相类似,SQL Server 2000 对两者也都支持,不过,您应该使用 OSQL 来取代 ISQL,以避免之前提到的那些问题。
要从命令提示字符窗口(MS-DOS提示窗口)执行 OSQL,您可以利用下列适当的参数来执行 OSQL.EXE 程序:
osql -U username -P password -S servername
当 OSQL 与 SQL Server 连接后,会出现下面这个数字提示字符:
1>
在这一提示字符下可键入 T-SQL 陈述式,
1> sp_helpdb master
2> go
这项陈述式将列出有关 master 数据库的信息。关键词 GO 并不是一个 T-SQL陈述式,它是一个ISQL、OSQL 以及 Query Analyzer 均能识别的命令,主要用来作为一段 T-SQL 陈述式的结束标记(视为批次操作)。类似这种交互式查询的结果将显示在命令提示字符窗口内。
如果在 OSQL 中输入错误,可以利用 RESET 这个 OSQL 命令来重回 1> 提示字符,
1> sp_helpbd
2> reset
1> sp_helpdb
2> go
要停止 OSQL,可输入 QUIT 或 EXIT。您也可以同时按 Ctrl+C,在不退出OSQL 公用程序的情况下结束一个命令或中断查询动作。
OSQL 公用程序可识别的参数不只有 -U、-P 和 -S。关于 OSQL 公用程序可用的参数及 OSQL 的相关讯息,请参考在线指南的 osql Utility 主题。
Query Analyzer
Query Analyzer 可让您在 GUI 接口中执行 T-SQL 陈述式或指令码,并将结果输出至窗口。您也可以利用这个工具来执行某些索引与查询分析的工作。有些人较喜欢利用 Query Analyzer 来执行陈述式而非 MS-DOS 提示字符窗口。要执行 Query Analyzer,可依下列步骤:
1. 利用下列三种方法之一来启动 Query Analyzer:
o 在命令提示字符后输入『 isqlw 』。
o 开启 Enterprise Manager,在 工具 菜单选择 SQL Query Analyzer。
o 从 开始 / 程序集 / Microsoft SQL Server / Query Analyzer
出现 联机到SQL Server 对话框(除非您已联机到服务器),如图13-1所示。
图13-1 联机到 SQL Server对话框
2. 从 SQL Server 下拉式选单中选择您要联机的服务器名称。输入您的登入信息,如果 SQL Server 目前尚未启动而您希望它自动启动服务,请在选项下的复选框打勾。按一下 确定 。SQL Query Analyzer 将会出现,如图13-2所示。
图13-2 SQL Query Analyzer
3. 在查询窗口输入任何 T-SQL 陈述式或呼叫预存程序,如图13-3所示。注意查询窗口已经放到最大,占据了整个 SQL Query Analyzer 窗口。
图13-3 在 Query Analyzer 的查询窗口中呼叫一个预存程序
4. 要执行这个陈述式,按一下工具列上的 执行查询 按钮(绿色指向右的三角箭头)或同时按Ctrl+E。结果将显示于结果窗格内,如图13-4所示。
图13-4 在 Query Analyzer 中显示的查询结果
5. 要在 Query Analyzer 中加载并执行您预先建立的 T-SQL 指令码,按一下工具列上 加载SQL指令码 按钮(黄色数据夹符号),或是从 档案 / 开启旧档 中浏览并找出您的档案。指令码将显示于上方的窗格。按一下 执行查询 按钮来执行指令码。
________________________________________
说明
SQL Query Analyzer 尚有许多其它的选项,包括 SQL Server 2000 新增的一些功能,请参阅 第35章 以获得更多详细说明。
________________________________________
T-SQL 指令码
当您需要多次执行一些 T-SQL 陈述式或预存程序,建立您自己的指令码是一个相当不错的方法。 指令码 (Script)是内含要执行之 T-SQL 的简单档案,其中可以是一条陈述式或是一系列连续的陈述式。建议您在建立 T-SQL 指令码时,档案扩展名均定为 .sql,如此您可以很快地辨识出它们。
下面的程序代码是一个简单的指令码范例。这个指令码呼叫了几个系统预存程序,可以输出关于 MyDB 数据库与其档案、档案群组及数据表(Customer_Data和 Product_Info)的种种信息。我们假设这个指令码已经预先储存至名为 My_DB.sql 的档案中。
use MyDB
go
sp_helpdb MyDB
go
sp_helpfilegroup
go
sp_spaceused Customer_Data
go
sp_spaceused Product_Info
go
要透过命令列来执行这个指令码,您可以使用 OSQL 的 -i 选项与 -o 选项。 -i 选项后填入要输入的指令码文件名, -o 选项后填入执行结果打算输出至哪个档案的档名-本例中,档名为 MyDB_info.out。我们也可以使用 -e 选项让原始 T-SQL 陈述式显示在输出档案中,让结果更为清楚。举例而言,要以系统管理员身份执行上述指令码,在命令提示字符后输入下列程序代码:
osql -Usa -P -i MyDB_info.sql -o MyDB_info.out -e
检查输出档案以确定指令码是否如您预期一般正确执行。以这种方式使用T-SQL 执行档可以让您将结果储存于输出档案,便于稍后检视。尤其当您在数据库变动前与变动后,想比较指令码执行的输出结果时,这个方法就能符合您的期望。此外,指令码在您需要执行一些陈述式一次以上时,也显得很有帮助。
另一个让您可以不用每次都要输入一堆 OSQL 命令来执行指令码的方法,是利用 OSQL 命令来建立一个 . cmd 档案。本例中,我们可以命名一个 MyDB_info.cmd 档案,其中含有我们刚刚键入的 OSQL 命令。如果输入与输出的档案与 .cmd 档案不在同一个目录里,要确定已经指出它们的路径。现在您可以在命令提示字符下直接执行 MyDB_info.cmd 或在 Microsoft Windows Explorer 中按两下 MyDB_info.cmd 文件名称。
您也可以在 Query Analyzer 中执行 T-SQL 指令码。要执行我们的指令码 My_Dbinfo.sql,从 档案 菜单中选择 开启旧档 ,浏览并选择打算执行的档案。按一下 开启 后指令码的程序代码将会显示在上方的窗格。按一下 执行查询 按钮或同时按 Ctrl+E 来执行这些陈述式。每个陈述式的执行结果将依序出现,就如图13-5所示。注意最上端的两个结果数据表,分别来自指令码中前两个 sp_helpdb 预存程序。
图13-5 指令码在 Query Analyzer 中的执行结果
本章总结
在本章中,您已学习到 SQL 与 T-SQL 的基本观念,并且也已看到 DDL 与DML 陈述式的一些简单范例。我们也介绍了执行 T-SQL 陈述式的不同方法-包括 ISQL、OSQL、SQL Query Analyzer 以及 T-SQL 指令码。在接下来两章以及 第25章 中,会发现更多使用 T-SQL 的相关讯息。