zoukankan      html  css  js  c++  java
  • 第三章 T-SQL 编程

    3.1 使用变量

      变量是可以存储数据值的对象。可以使用局部变量向SQL语句传递数据。在T-SQL中执行一批SQL语句时,可以声明许多变量以便临时使用。声明变量以后,可以在批处理中用一条T-SQL语句设置该变量的值。该批处理中的下一条语句可以从该变量中检索数值,并给出结果。

      T-SQL中的变量分为局部变量和全局变量。局部变量的使用也是先声明,再赋值。而全局变量右系统定义和维护,我们可以直接使用,但一般不自定义全局变量。

    3.1.1 局部变量

      局部变量的名称必须以标记@作为前缀。

      声明局部变量的语句如下:

      Declare @variable_name DataType

      其中, variable_name 为局部变量的名称,DataType为数据类型。

      例如:

      Declare @name varchar(8)     --- 声明一个存放学员姓名的变量name,最多可以存储8个字符

      Declare @seat int         --- 声明一个存放学员座位号的变量seat

      局部变量的赋值有两种方法:使用SET 语句或 Select 语句。

      语法:

      Set @variable_name = value

      或

      Select @variable_name = value

      假定使用insert语句,已向表stuInfo中插入了如下几条测试数据。

    stuName stuNo stuSex stuAge stuSeat stuAddress
    张秋丽 s25301 18 1 北京海淀
    李文才 s25302 31 3 地址不详
    李斯问 s25303 22 2 河南洛阳
    欧阳俊雄 s25304 28 4 新疆

      示例1

      /*-- 查找'李文才'的信息 --*/

      Declare @name varchar(8)  ---学员姓名

      set @name = '李文才'     ---使用set赋值

      select * from stuInfo where stuName = @name

      /*-- 查找'李文才'的左右同桌 --*/

      Declare @seat int   --- 座位号

      Select @seat = stuSeat from stuInfo where stuName = @name   --- 使用Select赋值

      Select * from stuInfo where (stuSeat = @seat + 1) or (stuSeat = @seat - 1)

      从示例1可以看出,局部变量可用于在上下语句中传递数据(如本例的座位号@seat)。

      set 赋值语句一般用于赋给变量指定的数据常量,如本例“李文才”。

      Select 赋值语句一般用于从表中查询数据,然后再赋给变量。需要注意的是,Select 语句需要确保筛选的记录不多于一条。如果查询的记录多于一条,将把最后一条记录的值赋给变量。

    3.1.2 全局变量

      SQL Server 中的所有全局变量都使用两个@标志作为前缀。

      常用的全局变量见下图。

    变量 含义
    @@ERROR 最后一个T-SQL错误的错误号
    @@IDENTITY 最后一次插入的标识值
    @@LANGUAGE 当前使用的语言的名称
    @@MAX_CONNECTIONS 可以创建的同时连接的最大数目
    @@ROWCOUNT 受上一个SQL语句影响的行数
    @@SERVERNAME 本地服务器的名称
    @@SERVICENAME 该计算机上的SQL服务的名称
    @@TIMETICKS 当前计算机上每刻度的微妙数
    @@TRANSCOUNT 当前连接打开的事务数
    @@VERSION SQL SERVER的版本信息

    3.2 输出语句

      T-SQL中支持的输出语句,用于输出显示处理的数据结果。

      常用的输出语句用两种,它们的语法分别如下。

      pint 局部变量或字符串

      select 局部变量 AS 自定义列名

      其中,第二种方法就是查询语句的特殊应用。

      示例2

      pint '服务器的名称:' + @@SERVERNAME

      select @@SERVERNAME AS '服务器名称'

      用print 语句输出的结果将在消息窗口中以文本方式显示,用Select 语句输出的结果将在结果窗口中以表格方式显示。

      由于使用print语句要求以单个局部变量或字符串表达式作为参数,所以如果我们这样编写SQL语句将会出错。

      print '当前错误号' + @@ERROR

      因为全局变量@@ERROR返回的是整型数值。那么如何解决呢?(转换函数,把数值转换成字符串)

      print '当前错误号' + convert(varchar(5) , @@ERROR)

      理解了输出语句后,我们再看看有关全局变量的示例。

      示例3

      insert into stuInfo( stuName, stuNo, stuSex, stuAge) values ('梅超风', 's25318', '女', '23')

      print '当前错误号' + convert(varchar(5), @ERROR)   ---如果大于0,表示上一条语句执行有错误

      print '刚才报名的学员,座位号为:' + convert(varchar(5), @@IDENTITY)

      Update stuInfo set stuAge = 85 where stuName = '李文才'

      print '当前错误号:' + convert(varchar(5), @@ERROR)

      print 'SQL Server 的版本' + @@VERSION

      GO

      @@ERROR 用于表示最近一条SQL语句是否有错误,如果有错误,将返回非零的值。第一次“insert”语句没错,所以为0。第二次“Update”语句违反年龄15~40的检查约束,所以错误号不为零。

      @@IDENTITY可用来查询最后插入的标识值(自动编号值)。例如,本例stuInfo表的stuSeat(座位号)字段,我们前面已定义为标识列(自动标号列),该列的值将自动生成,所以在插入时不用跳鞋座位号的数据。一旦插入数据后,我们可以通过查询@@IDENTITY全局变量,来查看目前的自动编号值,即“梅超风”的座位号。

    3.3 逻辑控制语句

    3.3.1 IF-ELSE 条件语句

      语法

      IF (条件)

        语句或语句块

      ELSE

        语句或语句块

      同java语言一样,ELSE为可选。

      如果有多条语句,需要使用语句块,语句块使用BEGIN···END表示,其作用类似java语言的“{}”符合。

      IF(条件)

        BEGIN

          语句1

          语句2

          ···

        END

      ELSE

        ···

      假定我们已向学员成绩表stuMarks中添加以下测试数据。

    ExamNo stuNo writtenExam LabExam
    s271811 s25303 80 58
    s271813 s25302 50 90
    s271815 s25302 65 0
    s271816 s25301 77 82

      示例4

      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 DESC

        End

      Else

        Begin

        print '本班笔试成绩较差,后三名的成绩为:'

        Select top 3 * from stuMarks order by writtenExam

        End

      为了把输出的表格数据和文本消息显示在同一个窗口中,需要做如下设置。

      单击Microsoft SQL Server Management Studio 的菜单中“工具”-->“选项”命令,选择“查询结果”选项,将“显示结果的默认方式”设置为“以文本格式显示结果”。

    3.3.2 WHILE 循环语句

      While 循环语句可以根据某些条件重复执行一条SQL语句或一个语句块。通过使用While关键字,可以确保只要指定的条件为true,就会重复执行语句。可以在While循环中使用Coutinue 和 Break 关键字来控制语句的执行。

      语法

      While (条件)

        语句或语句块

        [Break]

      使用 break 关键字从最内层的while 循环中退出。

      示例5

      Insert into stuMarks (examNo, stuNo, writtenExam, LabExam)

        values ('s271819', 's25318', 56, 48)

      Select * from stuMarks

      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

      Print '加分后的成绩如下:'

      Select * from stuMarks

    3.3.3 Case 多分支语句

      语法

      Case

        When 条件1 Then 结果1

        When 条件2 Then 结果2

        [Else 其他结果]

      End

      Case 语句表示如果'条件1'成立,则执行'结果1',其余类推。

      示例6

      Select * from stuMarks

      Print 'ABCDE 五级显示成绩如下:'

      Select stuNo , 成绩 = Case

            When writtenExam < 60 Then 'E'

            When writtenExam between 60 and 69 Then 'D'

            When writtenExam between 70 and 79 Then 'C'

            When writtenExam between 80 and 89 Then 'B'

            Else 'A'

          End

      From stuMarks

    3.4 批处理语句

      批处理语句我们并不陌生,前面已用过的“GO”就是批处理的标志。它是一条或多条SQL语句的集合,SQL Server 将批处理语句编译成一个可执行单元,此单元成为执行计划。每个批处理可以编译成单个执行计划,从而提高执行效率。如果批处理包含多条SQL语句,则执行这些语句所需的所有优化的步骤将编译在单个执行计划中。

      在多用户环境下,用户可能同时访问数据库,这将增加网络流量。在单用户环境中,用户可能需要对数据库执行多个任务,如更新表以及对Select查询语句的结果进行计算等,这需要向数据库发送一系列命令。

      以一个包含员工详细信息及其工作详细信息的数据库为例。该数据库的一个用户想要根据基本薪水的详细信息、工作的总天数以及休假的总天数来计算每个员工的纯收入。

      为了重复执行该任务(以便计算每个员工的收入),将这些命令存储在一个文件中,并作为单个执行计划向数据库发送所有命令,将会更容易。以一条命令的方式来处理一组命令的过程成为批处理。

      批处理的主要好处是能够简化数据库的管理。例如,如果需要更改存储在用户计算机上的现有查询语句,可能需要在所有用户的计算机上进行更改。但是,如果将该查询语句集中存储在服务器上,不管是作为文件还是做作为存储过程,我们只需在服务器端更改一次即可。这样可以节省大量的时间和精力。

      批处理示例如下:

      Use Master

      Go

      Go关键字标志着批处理的结束。

      另一个示例如下:

      Select * from stuInfo

      Select * from stuMarks

      Update stuMarks set writtenExam = writtenExam + 2

      GO

      此时,把这3条语句组成一个执行计划,然后再执行。

      一般是将一些逻辑相关的业务操作语句,放置在同一批中,这完全由代码编写者决定。但是,SQL Server 规定:如果是创建库、创建表语句,以及我们后面学习的存储过程和视图等,则必须在语句末尾添加“GO”批处理标志,所以前面我们创建表的语句格式如下。

      Create Table stuInfo (···)  GO

  • 相关阅读:
    CSP2019 Day2T3 树的重心
    51nod1835 完全图
    [HNOI2015]亚瑟王
    [六省联考2017]分手是祝愿
    洛谷P4550 收集邮票
    06_手工负载分担(数通华为)
    05_配置交换机SSH服务(数通华为)
    04_配置交换机Telnet服务(数通华为)
    03_vlan & access & trunk 口(数通华为)
    02_搭建HTTP客户端与服务器(数通华为)
  • 原文地址:https://www.cnblogs.com/jiazengtao/p/3157623.html
Copyright © 2011-2022 走看看