SQL Server 数据库设计和实现(五)

时间:2022-02-25 04:41:30
第三章 T-SQL编程
3.1 使用变量
T-SQL中的变量分为:
一、局部变量:先声明再赋值
二、全局变量:由系统进行定义,不能自定义

3.1.1 局部变量
一、声明:
(一)格式:DECLARE @变量名 变量数据类型
(二)示例:
      declare @number int -- 一个名为number的int型变量
      declare @string varchar(8) -- 一个名为string的varchar类型变量

二、赋值:
(一)使用SET进行赋值:只能赋值一个变量
      格式:SET @变量名 = 变量值
(二)使用SELECT进行赋值:可以同时赋值多个变量
      格式:SELECT @变量名1 = 变量值1, @变量名2 = 变量值2, ...
(三)示例:
      set @number = 10
      select @numer = 10, @string = 'abc'

三、在查询中使用变量:
    在数据表stuInfo中,查询一个名为“李文才”的学员信息及其同桌的信息,其中字段stuName,stuSeat代表“学员姓名”和“学员座位编号”,注意局部变量的作用域为一个批处理语句块,即下例中的整个GO部份
      /*查找李文才的信息*/
      declare @name varchar(8)
      set @name = '李文才'
      select * from stuInfo where stuName = @name

      /*查找李文才的左右同桌*/       declare @seat int
      select @seat = stuSeat from stuInfo where stuName = @name
      select * from stuInfo where stuSeat = @seat + 1 or stuSeat = @seat - 1
      go

3.1.2 全局变量
一、在SQL SERVER 中的全局变量都使用两个“@”标志作为前缀
二、常用的全局变量:全局变量可在“联机丛书”中通过关键字“全局”进行查询
    @@error:最后一个T-SQL错误的错误号
    @@identity:最后一次插入的标识值
    @@language:当前使用的语言的名称
    @@max_connections:可以创建的同时连接的最大数目
    @@rowcount:受上一个SQL语句影响的行数
    @@servername:本地服务器的名称
    @@servicename:该计算机上的SQL服务的名称
    @@timeticks:当前计算机上每刻度的微秒数
    @@transcount:当前连接打的事务数
    @@version:SQL SERVER的版本信息

3.2 输出语句
一、格式:
(一)print 局部变量(字符型类型)或字符串
(二)select 局部变量 as 自定义列名

二、示例:
      print '服务器的名称:' + @@servername
      select @@servername as '服务器的名称:'
      print '错误编号为:' + convert(varchar(4),@@error) --因为@@error返回的是一个数字,所以要用convert()函数进行转换

3.3 逻辑控制语句
3.3.1 IF-ELSE条件语句
一、格式:当IF或ELSE部份只包括一条语句时,可将BEGIN和END省略
      IF (条件)
        BEGIN
          语句或语句块
        END
      ELSE
        BEGIN
          语句或语句块
      END

二、示例:
    在stuMarks学员成绩表中,统计并显示本班笔试平均分,如果在70以上,显示“成绩优秀”,并显示前3名学员的考试成绩。如果在70以下,显示“本班成绩较差”,并显示后3名学员的考试信息,其中WrittenExam字段为笔试成绩
     declare @myavg float
     select @myavg = avg(WrittenExam) from stuMarks
     print '本班的平均分为:' + convert(varchar(5),@myavg)
     if (@myavg >= 70)
       begin
         print '本班成绩优秀'
         select top 3 * from stuMarks order by WrittenExam
       end
     else
       begin
         print '本班成绩较差'
         select top 3 * from stuMarks order by WrittenExam desc
       end
     go

3.3.2 WHILE循环语句
一、格式:BREAK用于跳出循环体
     WHILE(条件)
       BEGIN
         语句或语句块
         [BREAK]
       END

二、示例:
    本次考试成绩较差,假定要提分,确保每人笔试都通过。提分规则很简单,先每人都加2分,看是否都通过,如果没有全部通过,每人再加2分,再看是否都通过,如此反复提分,直到所有人都通过为止
     declare @n int
     while (1=1)
       begin
         select @n = count(*) from stuMarks where WrittenExam < 60
         if (@n > 0)
           update stuMarks set WrittenExam = WrittenExam + 2
         else            break
       end
     go

3.3.3 CASE多分支语句
一、格式:
     CASE
       WHEN 条件1 THEN 结果1
       WHEN 条件2 THEN 结果2
       ... ...
       [ELSE] 其它结果
     END

二、示例:
    采用美国的ABCDE五级打分制显示笔试成绩      print 'ABCDE五级显示成绩如下:'
     select stuNo, 成绩 = case
         when writtenExam >= 90 then 'A'
         when writtenExam between 80 and 89 then 'B'
         when writtenExam between 70 and 79 then 'C'
         when writtenExam between 60 and 69 then 'D'
         else 'E'
       end
     from stuMarks
     go

3.4 批处理语句
    批处理语句是指以一条命令的方式来处理一组命令的过程,它以"GO"作为标志,一次性处理一条或多条SQL语句,其好处就是以能够简化数据库的管理,在T-SQL中,建库,建表以及建存储过程或视图等命令要以"GO"结束