5.逻辑运算符 ALL、ANY、 BETWEEN、 EXISTS、IN、LIKE、NOT、AND、OR 6.运算符的优先级 高|括号运算符() 求反~、+(正号)、-(负号) +、、+(连接)、& 比较运算符 异或^、 NOT 低|AND OR、ALL、ANY、 BETWEEN、IN、LIKE 二、 Transact-SQL变量 SQL标识符:标识符用于表示服务器名、数据库名、数据库对象名 常量、变量和存储过程名等 标识符的命名规则 标识符的长度范围为1-30个字符。不区分大小写。 标识符的第一个字符必须为字母、下划线、@或#。以@为 首的标识符表示一个局部变量:以一个#为首的标识符表示 一个局部临时对象:两个#表示全局临时对象。 ■标识符第一个字符后面可以是字母、数字、#、@、$或 不区分大小写。 ■默认情况下,标识符中不允许出现空格:不允许用关键字 作标识符:可以以引号来定义特殊标识符(此时可包含空 格、关键字等)
16 5.逻辑运算符 ALL、ANY、BETWEEN、EXISTS、IN、LIKE、NOT、AND、OR.。 6.运算符的优先级 高 低 括号运算符() 求反~、+(正号)、-(负号) * 、/、 % + 、-、 +(连接)、& 比较运算符 异或^、| NOT AND OR、ALL、ANY、BETWEEN、IN、LIKE 二、Transact-SQL 变量 SQL 标识符:标识符用于表示服务器名、数据库名、数据库对象名、 常量、变量和存储过程名等。 标识符的命名规则: ◼ 标识符的长度范围为 1—30 个字符。不区分大小写。 ◼ 标识符的第一个字符必须为字母、下划线、@或#。以@为 首的标识符表示一个局部变量;以一个#为首的标识符表示 一个局部临时对象;两个##表示全局临时对象。 ◼ 标识符第一个字符后面可以是字母、数字、#、@、$或_。 ◼ 不区分大小写。 ◼ 默认情况下,标识符中不允许出现空格;不允许用关键字 作标识符;可以以引号来定义特殊标识符(此时可包含空 格、关键字等)
在中文版中,汉字也可以作为标识符。 例:CAT、Cat、xYZ、 SMALL、@from、#proc、#func、 ax sun、" select”、"as”、x#yz等均合法。而fom、From、 select等 不合法。 变量在使用之前必须定义(即说明数据类型)。变量分为:局部变量、 全局变量(由系统定义和维护)。 1.局部变量 在使用之前以 DECLARE语句定义(不能同时赋值)。 局部变量的生存期:生存于声明所在的批处理、存储过程或触 发器中,生存期结束后,变量消失。 可以通过PRNT或 SELECT语句(效果不同; print一次只能 显示一个值)将变量的值显示给用户,存储过程能够返回变量 的值 注意:使用 DECLARE语句时:必须超供变量名和数据类型变量 前必须有一个符号,同时定义多个变量时中间用逗号分隔。 2.局部变量的赋值(通过set、 select、 update进行,但若想从表中提取 数据则必须用 select或 update SELECT@变量名=表达式[…] [FROM<表名斗 WHERE<条件> 或 SET@变量名=表达式 次只能给一个变量赋值 例 declare ( @aaa Char(9),@bbb real select@aa=姓名from学生表 where学号=200203001 看不到显示! set(abbb=12.3456
17 ◼ 在中文版中,汉字也可以作为标识符。 例 : CAT 、 Cat 、 xYZ 、 _SMALL 、 @from 、 #proc 、 ##func 、 @x_sum、”select”、 ”a ss”、x#yz 等均合法。而 from、From、select 等 不合法。 变量在使用之前必须定义(即说明数据类型)。变量分为:局部变量、 全局变量(由系统定义和维护)。 1.局部变量 ⚫ 在使用之前以 DECLARE 语句定义(不能同时赋值)。 ⚫ 局部变量的生存期:生存于声明所在的批处理、存储过程或触 发器中,生存期结束后,变量消失。 ⚫ 可以通过 PRINT 或 SELECT 语句(效果不同;print 一次只能 显示一个值)将变量的值显示给用户,存储过程能够返回变量 的值。 注意:使用 DECLARE 语句时:必须提供变量名和数据类型;变量 前必须有一个@符号;同时定义多个变量时中间用逗号分隔。 2.局部变量的赋值(通过 set、select、update 进行,但若想从表中提取 数据则必须用 select 或 update) SELECT @变量名=表达式[,…] [FROM<表名>] [WHERE<条件>] 或 SET @变量名=表达式 --一次只能给一个变量赋值 例 1: declare @aaa CHAR(9),@bbb real select @aaa=姓名 from 学生表 where 学号='200203001' --看不到显示! set @bbb=12.3456
print @aaa@bbb-此句应成2个 print书写,因pint后只能跟一个 变量 select xm=@aaa, @bbb select(@aaa as xm, abbb select @aaa xm, abbb ■当变量未赋值时,其值为NULL 使用 SELECT由表对变量赋值时,变量的值由表中最后 行确定 例2:将学生表中字段的值赋值到变量中并显示 declare @aaa CHAR(9) select@a=姓名fom学生表注意返回的只是最后一条记录 的值 select @aaa 可以通过表的主键或统计函数唯一确定变量的值 select@a=max(年龄)fom学生表 select @aaa 变量可应用在 SELECT中 declare @aaa varchar(3) set@a=李% select*from学生表 where姓名like@ ■给变量赋值不能与数据检索结合在同一条 SELECT中使用。 declare @aaa CHAR(9) let@aa=姓名,学号from学生表 3.利用 UPDATE为局部变量赋值 例
18 print @aaa,@bbb --此句应成 2 个 print 书写,因 print 后只能跟一个 变量。 select 'xm' =@aaa,@bbb select @aaa as xm,@bbb select @aaa xm,@bbb ◼ 当变量未赋值时,其值为 NULL。 ◼ 使用 SELECT 由表对变量赋值时,变量的值由表中最后一 行确定。 例 2:将学生表中字段的值赋值到变量中并显示。 declare @aaa CHAR(9) select @aaa=姓名 from 学生表 --注意返回的只是最后一条记录 的值。 select @aaa ◼ 可以通过表的主键或统计函数唯一确定变量的值。 declare @aaa int select @aaa=max(年龄) from 学生表 - select @aaa ◼ 变量可应用在 SELECT 中。 declare @aaa varchar(3) set @aaa='李%' select * from 学生表 where 姓名 like @aaa ◼ 给变量赋值不能与数据检索结合在同一条SELECT中使用。 declare @aaa CHAR(9) select @aaa=姓名,学号 from 学生表 3.利用 UPDATE 为局部变量赋值 例 1:
declare @x int, @y int update学生表set@x=5,@ay=4 select @x, @y 例2: select*from学生表 declare @x int date学生表 set@x=年龄 哪一个记录的? lect(ax 例3: declare@x int update学生表 stax=( select avg(年龄)from学生表) 例4:错误。因为 SELECT子句返回了多个值。 declare(@x int update学生表 set@x=( select年龄fom学生表) elect(ax 4.全局变量 全局变量用于跟踪服务器范围内和特定会话期间的信息,不能显式 被声明或赋值。 全局变量不能由程序员定义 全局变量提供了用户当前的会话信息 全局变量是不可赋值的,且在所有程序中都可直接使用 在某时刻,各用户的值是各不相同的
19 declare @x int,@y int update 学生表 set @x=5,@y=4 select @x,@y 例 2: select * from 学生表 declare @x int update 学生表 set @x=年龄 --哪一个记录的? select @x 例 3: declare @x int update 学生表 set @x=(select avg(年龄) from 学生表) select @x 例 4:错误。因为 SELECT 子句返回了多个值。 declare @x int update 学生表 set @x=(select 年龄 from 学生表) select @x 4.全局变量 全局变量用于跟踪服务器范围内和特定会话期间的信息,不能显式 被声明或赋值。 ⚫ 全局变量不能由程序员定义 ⚫ 全局变量提供了用户当前的会话信息 ⚫ 全局变量是不可赋值的,且在所有程序中都可直接使用 ⚫ 在某时刻,各用户的值是各不相同的
全局变量 含义 ggrowcount 前一条SQL语句处理的记录条数 oNerror 前一条SQL语句执行后的错误号 @@trancount 当前连接的活动事务数 @@transtate 当前事务的状态 @atranchained 当前事务的模式 @@servername 本地服务器的名称 @@version 服务器和操作系统的版本信息 @@spid 当前进程的ID @@identity 上次操作中使用的 identity值 e0fetch status 存储上一条 fetch next语句的状态 @@nestlevel 当前存储过程、触发器中的嵌套层次 (1@@rowcount 除了 DECLARE外,其它任何语句都可以自动改变@ @rowcount的 值。因此,如果需要重复使用该变量的值,则需要另外定义局部变量来 保存它的值。如 select*from学生表 declare(@x int select @x=@c arowcount select @@rowcount as rowwcountl, @x 结果:1,7 select*from学生表 where性别=女 select@ @rowcount rowcountl,@x--结果:4,7 当程序从触发器中退出运行时,@@ Drowcount被恢复成进入 触发器之前的值
20 ⚫ 全局变量 含义 @@rowcount 前一条 SQL 语句处理的记录条数 @@error 前一条 SQL 语句执行后的错误号 @@trancount 当前连接的活动事务数 @@transtate 当前事务的状态 @@tranchained 当前事务的模式 @@servername 本地服务器的名称 @@version 服务器和操作系统的版本信息 @@spid 当前进程的 ID @@identity 上次操作中使用的 identity 值 @@fetch_status 存储上一条 fetch next 语句的状态 @@nestlevel 当前存储过程、触发器中的嵌套层次 (1)@@rowcount 除了 DECLARE 外,其它任何语句都可以自动改变@@rowcount 的 值。因此,如果需要重复使用该变量的值,则需要另外定义局部变量来 保存它的值。如: select * from 学生表 declare @x int select @x=@@rowcount select @@rowcount as rowwcount1,@x -------------------------------------结果:1,7 select * from 学生表 where 性别='女' select @@rowcount rowcount1,@x ---结果:4,7 ◼ 当程序从触发器中退出运行时,@@rowcount 被恢复成进入 触发器之前的值