现在位置: 首页 -> 网站开发 -> 数据库技术

Transact-SQL语法元素

  • 文章来源:微尔IT 作者:光骑士 更新时间:2009-1-11 推荐等级:   查看次数:   
  • 关 键 字:Transact-SQL语法元素
  • 推荐给QQ/MSN好友:
  • 页面收藏到:

1.3 Transact-SQL语法元素



DML语句包含了很多Transact-SQL的语法元素。其中包括批处理命令(Batch directives )、注释语句(Comments )、标识符(Identifiers )、数据类型、变量(Variables )、系统函数、运算符、表达式、流控制语句和保留的关键字。

1.3.1 批处理命令


SQL Server能以批处理的方式处理单个或多个Transact-SQL语句。一个批处理命令指示SQL Server分析并运行一个批处理内的所有指令。有两种指示SQL Server运行批处理的方法。
GO
对SQL Server来说 GO是作为向SQL Server发出Transact-SQL批处理语句的一种信号。GO命令告诉SQL Server 使用Transact-SQL执行批处理和结束批处理,它实际上并不是Transact-SQL语句。
使用GO命令时,注意以下情况:
当前的批处理语句包含上一个GO语句后输入的所有语句或从ad hoc 会话开始的语句(或者脚本,如果这是第一个GO)。
尽管一行中可以包含注释语句,但Transact-SQL语句不能和GO语句同处一行。
在批处理中,用户必须遵守一定的规则,例如,某些数据定义语句必须和其他的Transact-SQL语句分开执行,此时通过GO命令来隔离这些语句。
局部变量(用户定义的)的作用范围局限于一个批处理内部,在GO命令后,就不能再使用这个变量了。
注意:GO实际上并不是Transact-SQL语句,它只是用于声明一个批处理。

1.3.2 EXEC


EXEC命令用于执行用户定义的函数、系统存储过程、用户自定义的存储过程或扩展存储过程。在一个Transact-SQL批处理内部,它也能控制一个字符串的运行。使用EXEC时,可以传递参数并返回运行后的结果。

1.3.3 注释语句


注释语句是不可执行的语句,你可以把它放在其他SQL语句中作为注释,或在测试时使一些语句无效。注释语句有两种用法:一种是嵌于行内的注释语句,另一种是整块注释。

1、嵌于行内的注释语句
在某一行内用两个联字符(--)创建注释语句,把正式语句和注释语句分开。Transact-SQL将把出现在这个符号后的所有字符视为注释语句。这个注释语句符号可以使某一行语句无效(多在测试时使用)。
下面的例子使用嵌于行内的注释语句来解释正在进行的计算。
USE northwind
SELECT productname
,(unitsinstock - unitsonorder) -- Calculates inventory
,supplierid
FROM products
GO
下面的例子使用嵌于行内的注释语句来避免运行某一段语句。
USE northwind
SELECT productname
, (unitsinstock - unitsonorder) -- Calculates inventory
-- , supplierid
FROM products
GO

2、块注释语句
在注释语句的开始处输入(/*),在注释语句的结束处输入(*/),就可以把这两个符号间的所有字符变成注释语句,从而创建包含多行的块注释语句。
使用块注释语句符能够创建一行或多行的注释语句,或者在脚本语句头部创建注释语句标题,这种标题用于解释后面的SQL语句的作用。块注释语句标题通常包含作者姓名、创建日期和最后一次修改的日期、版本信息,并解释下面的语句所作的工作。
下面的例子显示了一个注释语句标题的用法,这个标题跨越了多行。
/*
This code retrieves all rows of the products table
and displays the unit price,the unit price increased by 10 percent,
and the name of the product.
*/
USE northwind
SELECT unitprice, (unitprice * 1.1),productname FROM products
GO
注意: 应当尽可能多地在SQL脚本中使用注释语句,它们能够描述你的语句所作的工作。在别人需要察看或修改你的脚本时,注释语句显得尤为重要。
下面的例子中,通过使用块注释语句符来避免某段语句的运行。在调试或修改脚本文件时,往往有用。
/*
DECLARE @v1 int
SET @v1=0
WHILE @v1<100
BEGIN
SELECT @v1=(@v1+1)
SELECT @v1
*/

1.3.4 标识符


SQL Server为对象标识符提供了一系列的标准命名规则,同时提供了用限定标识符表示非标准标识符的方法。我们推荐你尽量使用标准的标识符字符来表示对象。

1、标准标识符
标准标识符可以包含1到128位字符,包括字母,符号(_、@或#)及数字。标准标识符中不允许有空格。

2、限定标识符
如果标识符遵守所有的标识符规则,则此标识符既可以和限定符一起使用,也可以单独使用。但如果它不遵守一个或多个的格式规则时,必须使用限定标识符。
在下列情况下,使用限定标识符:
当对象名字包含空格时;

当保留关键字被用作对象名或对象部分的名字时。

 

当限定标识符出现在Transact-SQL语句中时,必须使用中括号或双引号把限定标识符括起来。
用中括号表示括起来的标识符([])
SELECT * FROM [Blanks In Table Name]
注意 :括起来的标识符总是可以被使用,不管SET QUOTED_IDENTIFER选项的状态如何。
用双引号表示引用的标识符(””)
SELECT * FROM “Blanks in Table Name”
只有SET QUOTED_IDENTIFIER选项为on时,才能使用引用的标识符。

3、标识符的命名原则
给数据库中的对象起名时,应该:
名字尽量短;

尽量使用有意义的名字;

使用简单的清晰的命名习惯;

使用能够区分出对象类型的标识符,尤其是视图和存储过程的名字;

保持对象名和用户名的唯一性。

 


1.3.5 数据类型


数据类型限制了数据库中保存的数值。数据类型指定了一个字段、参数或变量中所能存储的信息的类型。大多数Transact-SQL语句并不明确指定数据类型,但SQL语句中各对象数据类型的作用结果,将影响大多数语句的运行结果。
SQL Server提供了系统数据类型(基本数据类型),但你也可以创建自定义数据类型。基本数据类型有以下几种:

1、数字型
这种类型的数据代表数字,包括各种整数如int、tinyint、smallint和bigint。还包含精确些的十进制小数如numeric、decimal、money和smallmoney。也包括浮点数如float和real。

2、日期型
这种类型的数据代表日期和日期范围。包含datetime,可以精确到0.333毫秒;及smalldatetime,精确到1分钟的时间间隔。

3、字符型
这种类型的数据用于表示字符数据或字符串,包括定长的字符串类型char和nchar,也包含变长字符串类型varchar和nvarchar。

4、二进制型
这种数据类型在存储和结构上很象字符型数据,但这种数据的内容被当作一串比特值对待。二进制数据包括binary和varbinary。bit这种类型的数据代表1位的值,即0或1。

5、唯一标识符(Unique Identifiers)
uniqueidentifier是一种特殊的数据类型,它代表一个全局的特殊标识符(GUID),是一个16位16进制的数,它的值总是唯一的。

6、SQL变量
这些数据类型能够代表SQL Server所支持的各种数据类型,但不包括text、ntext、rowversion和Sql_variant这几种数据类型。

7、图像和文本(image&text)
这两种数据类型属于大型二进制对象结构(BLOB),它们代表定长或变长的数据类型,其中可以存储Unicode、非Unicode及二进制数据,如image、text及ntext。

8、表(Tables)
表数据类型用于确定类型表的本地变量或用户定义函数的返回值。

9、游标(Cursors)
这种数据类型用于存储过程中,或在低层客户接口中使用。游标从不用于数据定义语言(DDL)语句中。

10、用户自定义数据类型
这种数据类型是由数据库管理员创建的,它基于系统数据类型。当多个表需要在一个字段存储同一类数据时,并且这些字段必须具有相同的数据类型、长度和可空属性(Nullability)时,你可以选择使用用户自定义数据类型。

1.3.6 变量


变量是可以赋值的SQL语句元素。在Transact-SQL中,你可以使用局部变量。
用户可以使用DECLARE语句来定义一个局部变量,通过使用SET或SELECT语句为这个局部变量赋值,然后就可以在它被定义的语句、批处理或过程中,使用这个局部变量。局部变量名前必须带有@。
注意:如果一个变量前面有两个@符号,那么它将被作为函数处理。
语法:
DECLARE{@10cal_variabledata_type}[,...n]
SET@local_variable_name=expression
下面的例子创建@EmpID和@vlname两个局部变量,给@vlname赋值后,根据@vlname的值查询数据库Northwind,然后把查询结果赋给@EmpID。
USE northwind
DECLARE @EmpID varchar(11)
,@vlName char(20)
SET @vlname=’Dodsworth’
SELECT @EmpID=employeeid
FROM employees
WHERE LastName=@vlname
SELECT @EmpID AS EmployeeID
GO
运行结果:
EmployeeID
9
(1row(s)affected)

1.3.7 系统函


在SELECT语句中,允许出现表达式的任何地方都可以使用系统函数。Transact-SQL提供了很多有返回值的系统函数。
函数一般需要一定的输入参数,并返回一定的值,这些返回值可以用在表达式中。Transact-SQL编程语言提供三种函数:

1、 聚集(Aggregate)函数

 

对一个集合中的值进行运算,然后返回一个单个的、汇总的值。
下面的例子计算products表中unitprice字段的平均值。
USE northwind
SELECT AVG(unitprice) AS AvgPrice
FROM products
GO
运行结果:
AvgPrice
28.8663
(1row(S)affected)

2、 标量(scalar)函数

 

只对单个值进行运算并返回单一的值。只要一个表达式是正确的就可以使用这些函数。标量函数可被分为以下几种。
函数类型 描述
设置函数 返回关于当前设置信息的值
游标函数 返回关于游标信息的函数
日期和时间函数 根据输入的日期和时间,运算并返回一个字符串、数值或日期、时间值
数学函数 根据输入的值进行数学计算,并返回一个数字值
元数据函数 返回关于数据库和数据库对象的信息
安全函数 返回关于用户和角色的值
字符串函数 根据输入字符的值(char或varchar ),返回一个字符串或数字值
系统函数 进行相应运算后,返回SQL Server内部关于值、对象和设置的信息
系统统计函数 返回关于系统的统计信息
下面的例子显示了一个元数据函数的使用,它返回当前所使用的数据库的名字。
USE northwind
SELECT DB_NAME() AS‘database’
GO
运行结果:
database
Northwind
(1row(s)affected)

3、 行集(Rowset)函数

 

在Transact-SQL语句中,行集函数可以用作表参考(table reference)。
下面的例子对表titles中的信息进行分布式的查询。
SELECT *
FROM OPENQUERY(OracleSvr , ’SELECT name,id FROM owner,titles,)
GO
下面是另外一些系统函数的例子:
SELECT ’ANSI:’, CONVERT(varchar(30), GETDATE(), 102) AS
Style
UNION
SELECT ’Japanese:’, CONVERT(varchar(30), GETDATE(), 111)
UNION
SELECT ’European:’, CONVERT(varchar(30), GETDATE(), 113)
GO

1.3.8 运算符


运算符是进行数学计算、字符操作及字段、常量和变量比较的符号。可以在查询条件中组合使用不同的运算符。当你组合使用这些运算符时,这些运算符是按照预先定义好的顺序被处理的。
部分语法
{constant/column_name/function/ (subquery)}
[{arithmetic_operator/string_operator/
AND.OR.NOT}
{constant/column_name/function/ (subquery)}.}

1、运算符的种类
SQL Server支持四种运算符:算术运算符、比较运算符、字符串运算符和逻辑运算符。
算术运算符
算术运算符对数字型的字段和常量进行运算。Transact-SQL支持的算术运算符包括:加(+)、减(-)、乘(*)、除(/)、取模(%)(整数被除后的整数余数)。
比较运算符
比较运算符比较两个表达式。可以在相同类型的变量、字段及表达式间进行比较操作。
下面列出了所有的比较运算符。
. = 等于

. 〉 大于

. < 小于

. >= 大于或等于

. <= 小于或等于

. <> 不等于

 

字符串运算符
字符串运算符(+)把两个字符串连起来。所有其它的字符操作都需使用字符操作函数进行。空字符不等于空值。
逻辑运算符
逻辑运算符与(AND)、或(OR)和非(NOT)用于连接WHERE子句中的查询条件。

2、运算符优先级
如果在表达式中,你需要结合使用多种运算符(逻辑或数学运算符),SQL Server按照这些运算符的优先级别来处理这些运算符,这种顺序将会影响返回的值。各种运算符的优先级别如下(由高到低排列)。

类型 运算符 符号
分组 基本分组 ()
算术运算符 乘法 */%
算术运算符 加法 -+
其余 字符串联 +
逻辑运算符 非 NOT
逻辑运算符 与 AND
逻辑运算符 或 OR

SQL Server首先处理最深一层的嵌套表达式。然后,如果表达式中所有的算术运算符的优先级别一致的话,由左到右处理各运算符。
注意:在SQL Server中,逻辑运算符的优先级别和其他编程语言的不一样。

1.3.9 表达式


表达式是各种符号和对单个数据进行操作的运算符组合。它们可能很简单,如一个常量、变量、字段或单个的值;或者可能很复杂,如由运算符连在一起的一个或多个表达式。
表达式结果的数据类型由表达式中的成员决定。在运算过程中,表达式的成员可能经常会出现隐含的数据类型转换。
下面的例子计算一次购物中的产品记录,首先对单价和数量进行乘法,然后对结果进行过滤,只有那些价钱大于10,000美元的记录才会被显示出来。
SELECT OrderID, ProductID
, (UnitPrice * Quantity) AS ExtendedAmount
FROM [Order Details]
WHERE (UnitPrice * Quantity) > 10000
GO
运行结果:
OrderlD ProductID ExtendedAmount
10353 38 10540.0000
10417 38 10540.0000
10424 38 10329.2000
10865 38 15810.0000
10889 38 10540.0000
10981 38 15810.0000
(6 row(s) affected)

1.3.10 流控制语言


Transact-SQL包含控制逻辑流的语句,也包含CASE表达式,它允许你在一个SELECT或UPDATE语句中,每次对一个单个的行进行一次条件判断。

1、语句级(Statement level)
下面的语句可以使你在脚本语句中控制逻辑流:
BEGIN.END块, 包含在这个语句中的一系列Transact-SQL语句,都可以作为一个单元运行。

IF.ELSE块, 使用这个语句时,如果满足条件,SQL Server将执行IF中的语句,否则,执行ELSE中的语句。

WHILE块,只要满足条件,则WHILE下的语句将被重复执行。BREAK和CONTINUE能够在WHILE循环中控制语句的执行。

 

下面的例子中,演示了根据某顾客是否还有订单的情况,把顾客从顾客列表中相应地删除。
USE northwind
IF EXISTS (SELECT * FROM orders
WHERE customerid = ’fran’ )
PRINT ‘*** Customer cannot be deleted ***’
ELSE
BEGIN
DELETE customers WHERE customerid = ’frank’
PRINT ‘*** Customer deleted ***’
END
GO

2、行级(Row level)
在CASE语句中,列出几种可能的值,并逐一进行检测。如果表达式返回值是true,则CASE表达式返回WHEN子句中的值。如果表达式的返回值是false,并且指定了ELSE语句的话,SQL Server将返回ELSE子句中的值。你可以在使用表达式的任意地方使用CASE语句。
语法
CASE expression
{WHEN expression THEN result} [,.n]
[ELSE result]
END
下例声明了一个局部变量,并且检测它的值是等于4、5或6,根据它具体的值,进入WHILE循环判断当前值是奇数还是偶数。
DECLARE @n tinyint
SET @n = 5
IF (@n BETWEEN 4 and 6)
BEGIN
WHILE (@n > 0)
BEGIN
SELECT @n AS ‘Number’
,CASE
WHEN (@n%2) = 1
THEN ’ODD’,
ELSE ‘EVEN’
END AS ‘Type’
SET @n = @n - 1
END
END
ELSE
PRINT ‘NO ANALYSIS’
GO
运行结果:
Number Type
5 EVEN
(1 row(s) affected)
Number Type
4 ODD
(1 row(s) affected)
Number Type
3 EVEN
(1 row(s) affected)
Number Type
2 ODD
(1 row(s) affected)
Number Type
1 EVEN
(1 row(s) affected)
注意:在这个例子中的块语句(BEGIN/END)的使用能够改善脚本语句的可读性。

1.3.11 保留关键字


SQL Server为自己保留了一些专用的关键字。例如,在osql或SQL Query Analyzer中使用DUMP或BACKUP关键字时,表示SQL Server进行某一数据库部分的或全部的备份,或者进行事务日志的备份。
在Transact-SQL语句的任何其他地方,你都不能使用SQL Server已经定义的保留关键字。给一个对象起名时,你也应当避免使用保留关键字。如果一个对象的名字恰好是一个关键字,那么每次你需要引用这个对象名时,你必须使用限定标识符把这个对象名括起来,如引号或方括号。
检查Transact-SQL语句或数据库对象名中是否有保留关键字,这个任务通常由系统管理员、数据库管理员或数据库创建者来担任。
注意:用户构造出的语法上正确的Transact-SQL语句,即使能够通过语法检测和编译,在执行时仍可能出现运行时的错误。你养成一种良好的习惯,尽量不要使用保留关键字。

上篇文章: Transact-SQL语句的类型
下篇文章:使用SQL查询分析器 使用osql工具
相关文章:
没有相关文章