
第6章5L5 erver的数据在询 在前面的章节中我们己经使用了SCT语句进行查询。的确,SELECT语句是数据库应 用技术的核心,学习SQLServer的过程中可能用的最多的就是SECT语句了,SCT语句 格式中除了一些基本参数外,还有大量的选项可以用于数据查询。当我们构造CT语句 的时候。熟悉所有的可能选项将会更有效地实现数据直询。本章将学习这些技能,即详细对 SELECT语句的通用形式及使用进行阐述. 61 SELECT语句中的数学问题&.21 SQLServer中的变量 Transact-SgL语言中有两种形式的变量,一种是用户自己定义的局部变量,另外一种 是系统提供的全局变量: 1.局部变量 局部变量是一个能够拥有特定数据类型的树象,它的作用范围仅限制在程序内部。局部 变量可以作为计要器来计算循环执行的次数,或是控制循环执行的次数。另外,利用局部变 量还可以保存数据值,以供控制流语句测试以及保存由存储过程返日的数据值等。局部变量 被引用时要在其名称前加上标志“@”,而且必颈先用D配命令定义后才可以使用。 其说明形式知下:DECLAREEvariable_mamedatatype[,varia动le_namedatatype] 在Transact--SL中不能像在一般的程序语言中一样使用“variable_nae=value”米 给变量赋值,必须使用5包ECT或5可命令来设定变量的值。其语法如下: SELECTevariable_name=value SET@variable_nane"value 【101】声明一个长度为8个字符的变量eid,并赋值。 DECLAREidCHAR(8) S8 LECTeid午'10010001” 2全局变量 全局变量是S观Sev©r系统内部使用的变量,其作用范围并不局限于茶一程序,面是任 何程序均可随时调用,全局变量通常存储一些SqSF的配置设定值和效能统计数据,用 户可在程序中用全具变量来测试系统的设定值或Transact-SL命令执行后的状态值。使用 全局变量时应该注意以下几点: ()全局变量不是由用户的程序定义的,它们是在服务落领定义的: (②用户只能使用预先定义的全局变量
第 6 章 SQL Server 的数据查询 在前面的章节中我们已经使用了 SELECT 语句进行查询。的确,SELECT 语句是数据库应 用技术的核心,学习 SQLServer 的过程中可能用的最多的就是 SELECT 语句了。SELECT 语句 格式中除了一些基本参数外,还有大量的选项可以用于数据查询。当我们构造 SELECT 语句 的时候,熟悉所有的可能选项将会更有效地实现数据查询。本章将学习这些技能,即详细对 SELECT 语句的通用形式及使用进行阐述。 6.1SELECT 语句中的数学问题 6.2.1SQLServer 中的变量 Transact-SQL 语言中有两种形式的变量,一种是用户自己定义的局部变量,另外一种 是系统提供的全局变量。 1.局部变量 局部变量是一个能够拥有特定数据类型的对象,它的作用范围仅限制在程序内部。局部 变量可以作为计数器来计算循环执行的次数,或是控制循环执行的次数。另外,利用局部变 量还可以保存数据值,以供控制流语句测试以及保存由存储过程返回的数据值等。局部变量 被引用时要在其名称前加上标志“@”,而且必须先用 DECLARE 命令定义后才可以使用。 其说明形式如下:DECLARE@variable_namedatatype[,@variable_namedatatype…] 在 Transact-SQL 中不能像在一般的程序语言中一样使用“@variable_name=value”来 给变量赋值,必须使用 SELECT 或 SET 命令来设定变量的值。其语法如下: SELECT@variable_name=value SET@variable_name=value 【10-1】声明一个长度为 8 个字符的变量@id,并赋值。 DECLARE@idCHAR(8) SELECT@id=’10010001’ 2.全局变量 全局变量是 SQLServer 系统内部使用的变量,其作用范围并不局限于某一程序,而是任 何程序均可随时调用。全局变量通常存储一些 SQLServer 的配置设定值和效能统计数据。用 户可在程序中用全局变量来测试系统的设定值或 Transact-SQL 命令执行后的状态值。使用 全局变量时应该注意以下几点: ⑴全局变量不是由用户的程序定义的,它们是在服务器级定义的。 ⑵用户只能使用预先定义的全局变量

(的引用全局变量时,必须以标记符“解”开头。 ()局部变量的名称不修与全同变量的名称相同,否则会在应用程序中出现不可预测的结 果。 及注释符 在Transact-SQL.中可使用两类注释符: (14NSI标准的注释符”一”用于单行注释。 (的与C语言相同的程序注释符号,即“/体/”。/体用于注释文字的开头,/用于注 释文字的结尾,可在程序中标识多行文字为注释。 62.2SWS0rver的运算符 运算符是一些符号,它们能够用来执行算术运算、字符串莲接,献值以及在字段,常量 和变量之间进行比较。在SQLServer2000中,运算符主要有以下大大类:算术运算符、赋值 运算符、位运算符、比较运算符、逻辑运算符以及字符串连接运算符。如表61所示, 表6.ISQLServer的运算符 运算 种类 脱明 种类 运算行 说明 下,林 取模,指数 等于 算术运算荷,/ 所、除 Q,!= 不等于 , 如、减 . 大于、小于 小于等于、大于 NOT 取相反的逻辑值 =,2■ 于 两个值为真则结 RETNEEN 检索两值之间的内 逻辑运算衍WD 关系运前 为真 N-· 容 只要一个值为真刻 检索匹配列表中的 果就为真 按位与(两个操指 检索匹配字符样式 LIKE 数) 的数据 位运算符 按位成像(两个切 ISNULL 检索空数据 作数) 按位异或(两个词 赋值运厨 将数据植指深给料
⑶引用全局变量时,必须以标记符“@@”开头。 ⑷局部变量的名称不能与全局变量的名称相同,否则会在应用程序中出现不可预测的结 果。 3.注释符 在 Transact-SQL 中可使用两类注释符: ⑴ANSI 标准的注释符“--”用于单行注释。 ⑵与 C 语言相同的程序注释符号,即“/*……*/”,/*用于注释文字的开头,*/用于注 释文字的结尾,可在程序中标识多行文字为注释。 6.2.2SQLServer 的运算符 运算符是一些符号,它们能够用来执行算术运算、字符串连接、赋值以及在字段、常量 和变量之间进行比较。在 SQLServer2000 中,运算符主要有以下六大类:算术运算符、赋值 运算符、位运算符、比较运算符、逻辑运算符以及字符串连接运算符。如表 6.l 所示。 表 6.lSQLServer 的运算符 种类 运 算 符 说明 种类 运算符 说明 算术运算符 %,** 取模,指数 关系运算 符 = 等于 *,/ 乘、除 <>,!= 不等于 +,-, 加、减 >,= 小于等于、大于等 于 AND 两个值为真则结果 为真 BETWEEN … AND… 检索两值之间的内 容 OR 只要一个值为真结 果就为真 IN 检索匹配列表中的 值 位运算符 & 按位与(两个操作 数) LIKE 检索匹配字符样式 的数据 | 按位或 OR(两个操 作数) ISNULL 检索空数据 ^ 按位异或(两个操赋值运算= 将数据值指派给特

作数) 定的对象 字符串运划 将两个字符串莲接 符 算术运算符可以在两个表达式上执行数学运算,这两个表达式可以是数植数据分类的任 何数据类型。算术运算符包括加+)、减(一、乘()、除)、番数(*)和取模)。 味值运算符()能够将数据值指派给特定的对象。 位运算符能够在整型数据或者二进制数据(ge数据类型除外)之间执行位操作。 比较运算符用于比较两个表达式的大小或是否相同,其比较的结果是布尔值,即 TE(表示表达式的结果为真)、FSE(表示表达式的结果为)以及N。除了text、 text或i题e数据类型的之外,比较运算符可以用于其它爱据类型的数据的比较。 逐辑运算符可以把多个关系表达式连接起来。逻辑运算符包括AD、R和0T.逐辑运 算符和比较运算符一样,返国带有T阻E或FSE值的布尔数据类型。 字符串运算符允许通过加号(+)进行字符串连接,这个加号即被称为字符串连接运算符。 例,对千语句s过ECT'adein”+'china',其结果为国deinchina. 用运算符将常量,变量,两数连接起米的式子为表达式,在一个表达式中,算术运算的 优先级由高到低是:指数、乘除、求模、加被,在同一级别中则按从左到右的顺序执行。逐 辑运算的优先级由高到低是:0T、AND、0.SQLServer运算符的优先级别 62.350 Server中的函量 1.数学函数 SQLServer的数学函数主要用来对数值表达式进行数学运算并返回运算结果。数学函数 可以对SQLServer提供的数值数据(decinal,integer,.float,real,oaey,saallnoney, s■1lint和tinyint)进行处理。常用的数字稀数如表6.2所示。 表82常用数字函数 函数 益述 函数 描述 反正弦函数ASIN(n)为以弧度表示 ASIN(n) S (n) 求n的绝对值。 的角度值。 反余弦离数A0S(n)为以弧度表示 ACOS (n) EXP(n) 求n的指数值。 的角度值 ATAN (n) 反正切函数ATW(n)为以%度表示 a0(.n 求■除以■的余数
作数) 符 定的对象 字符串运算 符 + 将两个字符串连接 起来 算术运算符可以在两个表达式上执行数学运算,这两个表达式可以是数值数据分类的任 何数据类型。算术运算符包括加(+)、减(—)、乘(*)、除(/)、指数(**)和取模(%)。 赋值运算符(=)能够将数据值指派给特定的对象。 位运算符能够在整型数据或者二进制数据(image 数据类型除外)之间执行位操作。 比较运算符用于比较两个表达式的大小或是否相同,其比较的结果是布尔值,即 TRUE(表示表达式的结果为真)、FALSE(表示表达式的结果为假)以及 UNKNOWN。除了 text、 ntext 或 image 数据类型的之外,比较运算符可以用于其它数据类型的数据的比较。 逻辑运算符可以把多个关系表达式连接起来。逻辑运算符包括 AND、OR 和 NOT。逻辑运 算符和比较运算符一样,返回带有 TRUE 或 FALSE 值的布尔数据类型。 字符串运算符允许通过加号(+)进行字符串连接,这个加号即被称为字符串连接运算符。 例如,对于语句 SELECT’madein’+’china’,其结果为 madeinchina。 用运算符将常量、变量、函数连接起来的式子为表达式。在一个表达式中,算术运算的 优先级由高到低是:指数、乘除、求模、加减,在同一级别中则按从左到右的顺序执行。逻 辑运算的优先级由高到低是:NOT、AND、OR。SQLServer 运算符的优先级别 6.2.3SQLServer 中的函数 1.数学函数 SQLServer 的数学函数主要用来对数值表达式进行数学运算并返回运算结果。数学函数 可以对 SQLServer 提供的数值数据(decimal、integer、float、real、money、smallmoney、 smallint 和 tinyint)进行处理。常用的数字函数如表 6.2 所示。 表 6.2 常用数字函数 函数 描述 函数 描述 ASIN(n) 反正弦函数 ASIN(n)为以弧度表示 的角度值。 ABS(n) 求 n 的绝对值。 ACOS(n) 反余弦函数 ACOS(n)为以弧度表示 的角度值。 EXP(n) 求 n 的指数值。 ATAN(n) 反正切函数 ATAN(n)为以弧度表示MOD(m,n) 求 m 除以 n 的余数

的角度值。 求正弦函数,。为以弧度为单位的 返目大于等于。的最小数 SIN(n) CEILING(n) 角度 数。 求余弦函数,■为以弧度为单位的 返目小于等于■的最大整 C0s (n) 00R(n 角度。 数 求正切函数,■为以弧度为单位的 对n做四舍五入处理,保留 TAN (n) OUXD(n.m) 角度。 位, 弧度单位的角度转换为度数为单位 DEGREES(n) SQRT (n) 求n的平方根。 的角度。 度数单位的角度转换为氧度为单位 RA知IANS(n 0G10( 求以0为底的对数。 的角度。 PI P1的常量值3.14159265359979。 LOG(n) 求自然对数。 RAND 返回0广1之间的随机值。 OE球(血,求n乘指定次方■的值。 求n的符号,正(+1)、零(0)或负 SIGX(n) SQUARE ( 求n的平方, (-1)号. 【例61】在查询分析器中使用CEILING0,F0O球O、0UND0函数 SELECTeei11ng(13,40,f1oor(13,4),round(134567.3) 在查询分析签中运行上述语句的结果为:141313.4570 【例62】求几个数值00(45.923,2)、0ND(45923,0)、0D(45.92么,-1)的近拟 值。 S.CTround(45923,2,round(45.923,0),round(45923,-1) 在查询分析器中运行上运语句的结果为:45.92046.00050.000 2字符申函数 字符串函数可以对二进制数据、字符串和表达式执行不月的运算,大多数字符串函数贝 能用于char和varchar数据类型以及明确转换成char和varchar的数据类型,少数几个字 符串函数也可以用于binary和arbinar叮数据类型。此外,某些字符串函数还能够处理 text、ntext、.ie数据类型的数据。常用的字符串橘数如表6.3所示。 【例63】先使用SUBSTRING函数从字符串中获取指定的子学符串,然后使用段函 数、吃家函数对子字符串进行转换,且把PE饿函数长套在海E求函数内或把E成函数
的角度值。 SIN(n) 求正弦函数,n 为以弧度为单位的 角度。 CEILING(n) 返回大于等于 n 的最小整 数。 COS(n) 求余弦函数,n 为以弧度为单位的 角度。 FLOOR(n) 返回小于等于 n 的最大整 数。 TAN(n) 求正切函数,n 为以弧度为单位的 角度。 ROUND(n,m) 对 n 做四舍五入处理,保留 m 位。 DEGREES(n) 弧度单位的角度转换为度数为单位 的角度。 SQRT(n) 求 n 的平方根。 RADIANS(n) 度数单位的角度转换为弧度为单位 的角度。 LOG10(n) 求以 10 为底的对数。 PI PI 的常量值 3.14159265358979。 LOG(n) 求自然对数。 RAND 返回 0~1 之间的随机值。 POWER(n,m)求 n 乘指定次方 m 的值。 SIGN(n) 求 n 的符号,正(+1)、零(0)或负 (-1)号。 SQUARE(n) 求 n 的平方。 【例 6.1】在查询分析器中使用 CEILING()、FLOOR()、ROUND()函数。 SELECTceiling(13.4),floor(13.4),round(13.4567,3) 在查询分析器中运行上述语句的结果为:141313.4570 【例 6.2】求几个数值 ROUND(45.923,2)、ROUND(45.923,0)、ROUND(45.923,-1)的近似 值。 SELECTround(45.923,2),round(45.923,0),round(45.923,-1) 在查询分析器中运行上述语句的结果为:45.92046.00050.000 2.字符串函数 字符串函数可以对二进制数据、字符串和表达式执行不同的运算,大多数字符串函数只 能用于 char 和 varchar 数据类型以及明确转换成 char 和 varchar 的数据类型,少数几个字 符串函数也可以用于 binary 和 varbinary 数据类型。此外,某些字符串函数还能够处理 text、ntext、image 数据类型的数据。常用的字符串函数如表 6.3 所示。 【例 6.3】先使用 SUBSTRING 函数从字符串中获取指定的子字符串,然后使用 LOWER 函 数、UPPER 函数对子字符串进行转换,且把 UPPER 函数嵌套在 LOWER 函数内或把 LOWER 函数

能套在P课内。在查询分析署中输入以下语句: DECLARE@string_lower_uppervarchar(40) SETEstring_lover_upper='InformationModelCreat ionIssues.' SEL.ECTLOWER(SUBSTRING(@strimg_lower_upper,1,11))ASLower, UPPER(SIESTRING(@string_lower_upper,13,5))ASUpper. LOWER (UPPER (SUBSTRING(estring_lower_upper,19,8)))AsLowerlpper. UPPER (LOWER (SUBSTRING(estring_lower_upper,28,7)))AsUpperLower 语句运行结果如图62所示. 图6-2例63中语句的运行结果 表6,3常用字符串函数 种类 函数名 参数 说明 PPER char_expr 小写字符串转换为大写字符串 LOWER char expr 大写字符串转换为小写字符串 立生指定个数的空格组成字荷 SPACE integer_expr REPLICATE char_expr,integer_expr 指定的次数重复字符串 基本字符串国 在char_exprl字符串中从 char_exprl,start,lengt 数 STUFF tart开始,长度length的字 h,char_expr2 碎串用char_epr2代替 REVERSE char_expr 反向字符串表达式cr_cpr LTRIN char_expr 除字符串前面的空格 RTRIV char_expr 制除字符串后面的空格 char_exprl,char_expr2[ 在串2中搜索char_epr1的起 CHARINDEX 字符串查找厨 start] 始位置 数 在字半中搜索pattern出现的 PATINDEX Spatterns'char_expr 起的位置 从start开始,搜索length均 长度和分析本SLESTRING char_expr,start,length 度的子串 LEFT char_expr.integer_expr 从左边开始搜索指定个数的子
嵌套在 UPPER 内。在查询分析器中输入以下语句: DECLARE@string_lower_uppervarchar(40) SET@string_lower_upper=’InformationModelCreationIssues.’ SELECTLOWER(SUBSTRING(@string_lower_upper,1,11))ASLower, UPPER(SUBSTRING(@string_lower_upper,13,5))ASUpper, LOWER(UPPER(SUBSTRING(@string_lower_upper,19,8)))AsLowerUpper, UPPER(LOWER(SUBSTRING(@string_lower_upper,28,7)))AsUpperLower 语句运行结果如图 6-2 所示。 图 6-2 例 6.3 中语句的运行结果 表 6.3 常用字符串函数 种类 函数名 参数 说明 基本字符串函 数 UPPER char_expr 小写字符串转换为大写字符串 LOWER char_expr 大写字符串转换为小写字符串 SPACE integer_expr 产生指定个数的空格组成字符 串 REPLICATE char_expr,integer_expr 指定的次数重复字符串 STUFF char_expr1,start,lengt h,char_expr2 在 char_expr1 字符串中从 start 开始,长度 length 的字 符串用 char_expr2 代替 REVERSE char_expr 反向字符串表达式 char_expr LTRIM char_expr 删除字符串前面的空格 RTRIM char_expr 删除字符串后面的空格 字符串查找函 数 CHARINDEX char_expr1,char_expr2[ ,start] 在串2中搜索char_expr1的起 始位置 PATINDEX ’%pattern%’,char_expr 在字串中搜索 pattern 出现的 起始位置 长度和分析函 数 SUBSTRING char_expr,start,length 从 start 开始,搜索 length 长 度的子串 LEFT char_expr,integer_expr 从左边开始搜索指定个数的子

从右边开始搜索指定个数的了 RIGHT char_expr,integer_expr 学符串量左端字符的ASCII同 ASCII char_expr 玛值 转换函数 CHAR integer_expr SC11代码值转换为字符 float_expr[,length[,de STR 数值数据转换为字符型数据 cimal]] 【例64】使用LTRM函数到障字符变量中的起始空格。 DECLAREestr ing_to_trimvarchar (60) SETestring_to_trim='Fivespacesareatthebeginningofthisstring.' SELECT'Hereisthestringwithouttheleadingspaces:+LTRIM(@string_to_trim) 在查询分析器中运行上述语句的结果为: Bereisthestringvithout theleadingspaces:Fivespacesareatthebeginningofthisstr ing. 【例65】使用EFT函数运国字符串hedefg最左边的4个字符. SELECTLEFT('abedefg",4) 在查询分析器中运行上述语句的结果为:bcd 【例66】将指定的字符串的排列顺序颠倒。 SELECTREVERSE(123).REYERSE("abe" 在查询分析器中运行上述语句的结果为:321a 【例67】在第一个字符串(abcdef)中到除从第二个位置(字符b)开始的三个字符,然 后在刚制除的起始位置插入第二个字符串,创建并返回一个字符串。 s8 ECTSTUFF('abedef”,2.3,”ijklmn') 在查询分析器中运行上述语句的结果为:aijk1nef 及日期和时何函数 日期和时间函数用于对日期和时间数据送行各种不同的处理和运算,并运回一个字符 串,数字值或日期和时间值,在SS0rveT2000中,日期和时间函数如表6.4所示表中列出 了日期和时阿函数的名称、参数以及相关解释
串 RIGHT char_expr,integer_expr 从右边开始搜索指定个数的子 串 转换函数 ASCII char_expr 字符串最左端字符的 ASCII 代 码值 CHAR integer_expr ASCII 代码值转换为字符 STR float_expr[,length[,de cimal]] 数值数据转换为字符型数据 【例 6.4】使用 LTRIM 函数删除字符变量中的起始空格。 DECLARE@string_to_trimvarchar(60) SET@string_to_trim=’Fivespacesareatthebeginningofthisstring.’ SELECT’Hereisthestringwithouttheleadingspaces:’+LTRIM(@string_to_trim) 在查询分析器中运行上述语句的结果为: Hereisthestringwithouttheleadingspaces:Fivespacesareatthebeginningofthisstr ing. 【例 6.5】使用 LEFT 函数返回字符串 abcdefg 最左边的 4 个字符。 SELECTLEFT(’abcdefg’,4) 在查询分析器中运行上述语句的结果为:abcd 【例 6.6】将指定的字符串的排列顺序颠倒。 SELECTREVERSE(123),REVERSE(’abc’) 在查询分析器中运行上述语句的结果为:321cba 【例 6.7】在第一个字符串(abcdef)中删除从第二个位置(字符 b)开始的三个字符,然 后在删除的起始位置插入第二个字符串,创建并返回一个字符串。 SELECTSTUFF(’abcdef’,2,3,’ijklmn’) 在查询分析器中运行上述语句的结果为:aijklmnef 3.日期和时间函数 日期和时间函数用于对日期和时间数据进行各种不同的处理和运算,并返回一个字符 串、数字值或日期和时间值。在 SQLServer2000 中,日期和时间函数如表 6.4 所示表中列出 了日期和时间函数的名称、参数以及相关解释

表6,4日期和封间函数 函数名 参数 说明 (datepart.numher. 以datepart指定的方式,给出dhte与 DATEADO date) urber之和 (datepart,datel.d 以datepart指定的方式,给出d血te2与 DATEDIFF ate2) atel之差 给出dnte中dat0mrt指定邻分所对应的字 DATENAME (datepart.date) 符串 给出date中山tepart指定部分所对应的室 DATEPART (datepart,.date】 数植 GETDATE 0 哈出系统当前的日期的时间 DAY (date) 从date日期和时间类型数据中提取天数 MONTH date) 从date日期和时间类型数据中提取月份数 YEAR (date) 从date日期和时间类型数据中提取年份数 【例68】从GETDATE函数返国的日期中提取月份数 SELECTGETDATEO CurrentDate'.DATEPART (month,GETDATE()AS'MonthNumber' 在查询分析器中运行上述语句的结果如图63所示。 图6-3例6,8中语句的运行结果 【例69】从指定日期03/12/2005中返回月份数、天数和年粉数。 SELECT0NTH('03/12/2005),DAY(°03/12/2005”),YEAR('03/12/2005”) 在查询分析器中运行上述语句的结果如图一4所示。 图6-4例69语句中的运行结果 4.转换函数 SQLServer能够白动处理某些数据类型的转换。例如,char和varchar、smallint和 int,SQLServer可以将它们白动转换,这种特换被称为隐性转换。但是,无法由SQLServer 自动转换的或者是SQLServer自动转换的结果不符合预期结果的,就需要使用转换函数做显 示转换。转换函数CVE灯和CAST允许用户把某种数据类型的表达式转换为另一种数据 型。C4ST和C①ET提供相似的功伦,如知表65所示
表 6.4 日期和时间函数 函数名 参数 说明 DATEADD (datepart,number, date) 以 datepart 指定的方式,给出 date 与 number 之和 DATEDIFF (datepart,date1,d ate2) 以 datepart 指定的方式,给出 date2 与 date1 之差 DATENAME (datepart,date) 给出 date 中 datepart 指定部分所对应的字 符串 DATEPART (datepart,date) 给出 date 中 datepart 指定部分所对应的整 数值 GETDATE () 给出系统当前的日期的时间 DAY (date) 从 date 日期和时间类型数据中提取天数 MONTH (date) 从 date 日期和时间类型数据中提取月份数 YEAR (date) 从 date 日期和时间类型数据中提取年份数 【例 6.8】从 GETDATE 函数返回的日期中提取月份数。 SELECTGETDATE()’CurrentDate’,DATEPART(month,GETDATE())AS’MonthNumber’ 在查询分析器中运行上述语句的结果如图 6-3 所示。 图 6-3 例 6.8 中语句的运行结果 【例 6.9】从指定日期 03/12/2005 中返回月份数、天数和年份数。 SELECTMONTH(’03/12/2005’),DAY(’03/12/2005’),YEAR(’03/12/2005’) 在查询分析器中运行上述语句的结果如图 6-4 所示。 图 6-4 例 6.9 语句中的运行结果 4.转换函数 SQLServer 能够自动处理某些数据类型的转换。例如,char 和 varchar、smallint 和 int,SQLServer 可以将它们自动转换,这种转换被称为隐性转换。但是,无法由 SQLServer 自动转换的或者是 SQLServer 自动转换的结果不符合预期结果的,就需要使用转换函数做显 示转换。转换函数 CONVERT 和 CAST 允许用户把某种数据类型的表达式转换为另一种数据类 型。CAST 和 CONVERT 提供相似的功能,如表 6.5 所示

表8.5转换两数 函数名 参数 说明 将表达式expression转换为指定的数是 CAST expressionASdata_type 类型ta【ype hte_tye为expression转换后的数据类 data_type[(length)].expre CONVERT ssion[.style] ength表示转换后的数据长度 Style(不带纪元和带纪元) 【例610】将数植型数据248.57转换为字符型后,又转换成为货币型数据。 DECLAREmyvaldecimal (5,2) 5ETa1-248.57 SELECTCAST(CAST (myvalASvarchar (20))ASmomey) 如果使用CMET,将提供和CAST相似的功能。 SELECTOONVERT (money.CONVERT(varchar (20).ayval)) 【例611】以PT/2弧度的角度赵网以度数的角度, SELECT'ThenunberofdegreesinPL/2radiansis:'+ CONVERT(varchar,DEGREES ((PI(/2))) 此例对以氨度为单位的角度P/2),将廷回相应的以度数为单位的角度(90)。 【例612】写一个SCT语句,取出所有学生的学号、姓名,出生日期和入学成绩, 出生日期必须是在186年10月3日之前的: USEstudent SELECTstud id.name,birthday.mark FRstud_info EREbirthday(-OaWT(datetine,”10/03/19B6”》 此例中HE距子句的搜索条件需要使用CVE函数,将用字符串表达的日期转换成日 明时阿型的。 5系统离数 表8.6所示的系统函数用于运国有关SqSv系饶,用户,数据库和数据库对象的信 息。它可以让用户在得到信息后,使用条件语句,根据运回的信息进行不同的操作。与其它
表 6.5 转换函数 函数名 参数 说明 CAST expressionASdata_type 将表达式 expression 转换为指定的数据 类型 data_type CONVERT data_type[(length)],expre ssion[,style] date_type为expression转换后的数据类 型 Length 表示转换后的数据长度 Style(不带纪元和带纪元) 【例 6.10】将数值型数据 248.57 转换为字符型后,又转换成为货币型数据。 DECLARE@myvaldecimal(5,2) SET@myval=248.57 SELECTCAST(CAST(@myvalASvarchar(20))ASmoney) 如果使用 CONVERT,将提供和 CAST 相似的功能。 SELECTCONVERT(money,CONVERT(varchar(20),@myval)) 【例 6.11】以 PI/2 弧度的角度返回以度数的角度。 SELECT’ThenumberofdegreesinPI/2radiansis:’+ CONVERT(varchar,DEGREES((PI()/2))) 此例对以弧度为单位的角度(PI/2),将返回相应的以度数为单位的角度(90)。 【例 6.12】写一个 SELECT 语句,取出所有学生的学号、姓名、出生日期和入学成绩, 出生日期必须是在 1986 年 10 月 3 日之前的。 USEstudent SELECTstud_id,name,birthday,mark FROMstud_info WHEREbirthday<=CONVERT(datetime,’10/03/1986’) 此例中 WHERE 子句的搜索条件需要使用 CONVERT 函数,将用字符串表达的日期转换成日 期时间型的。 5.系统函数 表 6.6 所示的系统函数用于返回有关 SQLServer 系统、用户、数据库和数据库对象的信 息。它可以让用户在得到信息后,使用条件语句,根据返回的信息进行不同的操作。与其它

函数一样,可以在SELECT语句的SECT和EE子句以及表达式中使用系统函数. 表66系统函数 函数名 参数 说明 获得指定数据库的D号 DB_ID,DB_NAVE 0B ID(name).DB NAVE(id) 或名称 OST_ID(name),HOST_NAME(id 铁得指定主机的D号成 OST ID.HOST NAME 名称 OBJECT_ID,OBJECT_XAM OBJECT_ID(name),OBJECT_NAM 获得指定对象的D号或 E(id) 名称 SUSER_ID (name),SUSER_NAVE( 铁得指定登录的1山号或 SUSER_ID,SUSER_NAME d) 名称 ISER_ID(nae),sERN4WE(id铁得指定用户的1D号或 SER_ID,USER_NUME 名称 获得表标识号table_id COL_NAME table_id,column_id 和列标识号colume_i 所对应的列名 获得指定表列的定义起 COL LENGTH table,colum 度 线得指定表、索列D和 INDEX_COL table,index_id,key_id 健D的素引列名移 铁得指定表达式占用的 DATALENGTH expression 字节数 【例613】查询stud_infe0表中学号为0401010811的address列的定义长度和数据长 度。 s.CTOa,LENT('stud_info','ddress')As定义长度. DATALENGTH(address)AS爱据长度 FRONstud info HEREstud_id=0401010811" 其中:O0.IENG国将获得指定表stud_info的address列定义长度,而不是列中存储
函数一样,可以在 SELECT 语句的 SELECT 和 WHERE 子句以及表达式中使用系统函数。 表 6.6 系统函数 函数名 参数 说明 DB_ID,DB_NAME DB_ID(name),DB_NAME(id) 获得指定数据库的 ID 号 或名称 HOST_ID,HOST_NAME HOST_ID(name),HOST_NAME(id ) 获得指定主机的 ID 号或 名称 OBJECT_ID,OBJECT_NAM E OBJECT_ID(name),OBJECT_NAM E(id) 获得指定对象的 ID 号或 名称 SUSER_ID,SUSER_NAME SUSER_ID(name),SUSER_NAME( id) 获得指定登录的 ID 号或 名称 USER_ID,USER_NAME USER_ID(name),USER_NAME(id ) 获得指定用户的 ID 号或 名称 COL_NAME table_id,column_id 获得表标识号 table_id 和列标识号 column_id 所对应的列名 COL_LENGTH table,column 获得指定表列的定义长 度 INDEX_COL table,index_id,key_id 获得指定表、索引 ID 和 键 ID 的索引列名称 DATALENGTH expression 获得指定表达式占用的 字节数 【例 6.13】查询 stud_info 表中学号为 0401010811 的 address 列的定义长度和数据长 度。 SELECTCOL_LENGTH(’stud_info’,’address’)AS 定义长度, DATALENGTH(address)AS 数据长度 FROMstud_info WHEREstud_id=’0401010811’ 其中:COL_LENGTH 将获得指定表 stud_info 的 address 列定义长度,而不是列中存储

的任何单个字符串的长度。用DATALE丽函数来确定特定值中的字符总数。 【例614】返回student数据库的stud_info表中的第二列的名称, SELECTOOL_NAVE (OBJECT_ID('stud_info')2) 在查询分析器中运行上述语句的结果为!na 6集合函数 集合函数可以针对整个成者几个列或者一个列进行数据汇总。它常用来计算SECT语 句查面结果集的统计值。例如,求一个结果集合的最大值、最小值、平均值和所有元素和等。 SQLServer提供的集合函数如表6.7所示, 表线7集合函数 函数 描述 函数 描述 AVG 十算一列值的平均值 W 计算一列值的总和 COUNT 统计一列中值的个数 MIN 求一列值中的最小值 MAX 求一列值中的最大值 【例615】求“JVA程序设计”课程的平均成镜。具体奇令如下。 SELECTAYG(grade)FROMstud_gradeWHEREcourse_id-'0401010102' 在查询分析卷中运行上述语句将可以在学生成绩表中查询到“JWA程序设计”误程(课 程号c0ure_1d为“0401010102”)的平均成绩。 集合函数是从SLCT语句中计算一个“返回列的数据”,其结果是所透数据列的计算结 果.例如:SELECTAVG(salary)FRONteacher_info语句将返回单一的结果,即teacher_info 表中所有s知1ay列数据的平均值。又如: SELECTAWG(salary)FROMteacher_infoWHEREtech_title='讲师'语句将返回teacher_info 表中所有tech_title列为“讲师”的平均工货.面语句SELECTcount(o)FROMteacher_info 中使用集合函数限上面的例子有点不同,因为没有一个具体的列核番定给T函数,这条 语句实际上将逐回teacher_info表的行数。 62 SELECT语句 使用SCT语句进行数据查询是数据库的核心操作,SQLServer提供了SCT语句较 完整的数据查询语句形式,该语句具有灵活的使用方式和丰富的功能, 62.1简单查面 简单查面的语句格式:
的任何单个字符串的长度。用 DATALENGTH 函数来确定特定值中的字符总数。 【例 6.14】返回 student 数据库的 stud_info 表中的第二列的名称。 SELECTCOL_NAME(OBJECT_ID(’stud_info’),2) 在查询分析器中运行上述语句的结果为:name 6.集合函数 集合函数可以针对整个或者几个列或者一个列进行数据汇总,它常用来计算 SELECT 语 句查询结果集的统计值。例如,求一个结果集合的最大值、最小值、平均值和所有元素和等。 SQLServer 提供的集合函数如表 6.7 所示。 表 6.7 集合函数 函数 描述 函数 描述 AVG 计算一列值的平均值 SUM 计算一列值的总和 COUNT 统计一列中值的个数 MIN 求一列值中的最小值 MAX 求一列值中的最大值 【例 6.15】求“JAVA 程序设计”课程的平均成绩,具体命令如下。 SELECTAVG(grade)FROMstud_gradeWHEREcourse_id=’0401010102’ 在查询分析器中运行上述语句将可以在学生成绩表中查询到“JAVA 程序设计”课程(课 程号 course_id 为“0401010102”)的平均成绩。 集合函数是从 SELECT 语句中计算一个“返回列的数据”,其结果是所选数据列的计算结 果。例如:SELECTAVG(salary)FROMteacher_info 语句将返回单一的结果,即 teacher_info 表中所有 salary 列数据的平均值。又如: SELECTAVG(salary)FROMteacher_infoWHEREtech_title=’讲师’语句将返回 teacher_info 表中所有 tech_title 列为“讲师”的平均工资。而语句 SELECTcount(*)FROMteacher_info 中使用集合函数跟上面的例子有点不同,因为没有一个具体的列被指定给 COUNT 函数,这条 语句实际上将返回 teacher_info 表的行数。 6.2SELECT 语句 使用 SELECT 语句进行数据查询是数据库的核心操作。SQLServer 提供了 SELECT 语句较 完整的数据查询语句形式,该语句具有灵活的使用方式和丰富的功能。 6.2.1 简单查询 简单查询的语句格式: