zoukankan      html  css  js  c++  java
  • MSSQLSERVER数据库 变量和批处理

            当作学习总结吧!以下的内容很早以前就有人写过。但我还是要再写一下,一是练一下自己写这方面文章的能力,二是对知识点的学习有一下重温和加深。
            SQL语言也跟其他编程语言一样,拥有变量、分支、循环等控制语句。之前我不清楚应该把这些归到哪个名词上,直到前晚我看到有篇文章是在讲SQL语句批处理,所有我就把SQL里的变量、分支、循环等控制语句归到批处理来。在SQL语言里面把变量分为局部变量和全局变量,全局变量又称系统变量。
     
    先来看一下局部变量:
            局部变量使用declare关键字给变量声明,语法非常简单:declare @<变量名> <变量类型> [,@<变量名> <变量类型> [.. ]]
            从上面的[,@<变量名> <变量类型> [.. ]]这里我们可以看出他能一次声明多个变量,变量声明后但未赋值前,其值为NULL。对变量的赋值可以使用set关键字,使用set关键字时对变量的赋值一次只能赋值一个。
             来看一个实例:
    declare @name nvarchar(50),@age int
    print @name;
    print @age;
    print '----------------';
    set @name='Jack'
    set @age=18
    print @name;
    print @age;
    print '----------------';
     
    --结果显示:
     
    ----------------
    Jack
    18
    ---------------- 
    

      可以看到在没有赋值前,他输出的是NULL。使用set关键字对变量的赋值一次只能赋值一个,那么怎么对多个变量进行赋值?这时可以使用select关键字

    declare @name nvarchar(50),@age int
    select @name='Jack',@age=18
    print @name;
    print @age;
    print '----------------'; 
    

          我们也可以在查询语句里面对这个变量进行赋值例如: select @name=sName from student where sid=1;

    再来看一下全局变量

            SQL Server有30多个全局系统变量,但有几个是常用到的,如下SQL语句

    select @@VERSION --查看版本号
    select @@IDENTITY; --返回最后插入的标识值--例如
    USE MySchool
    create table ideTest
    (
        id int identity(1,1) primary key,
        idename nvarchar(50),
    )
    insert into ideTest(idename) values('test1');
    insert into ideTest(idename) values('test2');
    insert into ideTest(idename) values('test3');
    insert into ideTest(idename) values('test4');
    insert into ideTest(idename) values('test5');
    insert into ideTest(idename) values('test6') select @@IDENTITY; 
    select @@error --返回错误编号,当上一条SQL语句的错误,我猜想当他的值大于时候,表示有错误。没有错误那么用表示
    select @@LANGUAGE; --返回版本的语言
    select @@SERVERNAME --返回服务器的名称
    select @@ROWCOUNT --返回上一个语句所受影响的行数
    --例如结果显示
    delete ideTest where id<=3 select @@ROWCOUNT 
    

    SQL语句里的脚本

      脚本提供了变量、分支、循环等控制语句,可以用来实现一些复杂的任务,SQL语句里的流程控制语句包括:

    • IF…ELSE 
    • GOTO 
    • WHILE 
    • WAITFOR 
    • TRY/CATCH
    • CASE

      1、我们先来看一下IF...ELSE语句,语法的格式如下:

    IF<Boolean Expression><SQL statement>|

    BEGIN<code series>

    END[ELSE<SQL statement> |

    BEGIN <code series>

    END]

    注意,使用代码行时,别忘了BEGIN与END,这里的BENGIN...END 相当于C语言里的{ } 另外,对于IF判断有一个陷阱,就是 if @var = NULL.这样子写法是不对的,因为NULL不等于任何东西,甚至也不等于NULL,应该写成: if @var IS NULL。我们来看一下具体的实例:

    USE MySchool
    CREATE TABLE Score
    (
        id int identity(1,1) primary key,
        sname nvarchar(50),
        english int,
        math int,
        computer int
    )
    insert into Score(sname, english, math, computer) values('Jack',50,60,90);
    insert into Score(sname, english, math, computer) values('Lou',70,80,100);
    insert into Score(sname, english, math, computer) values('Andy',72,77,66);
    insert into Score(sname, english, math, computer) values('Am',42,60,55);
    insert into Score(sname, english, math, computer) values('Jobs',34,61,44);
    insert into Score(sname, english, math, computer) values('Bill',54,32,76);
    insert into Score(sname, english, math, computer) values('Afs',47,43,72);
    --查看英语成绩,当英语的平均成绩小于分时最低的三个人的成绩,当成绩大于分取高的三个人的成绩
    declare @avg float
    select @avg=avg(english) from Score
    IF (@avg<60)
        begin
        select top 3 * from Score order by english asc
        end
    ELSE
        begin
        select top 3 * from Score order by english desc
        end
    

    在SQL里是没有if...elseif...else的,那么该怎么实现类型于if...elseif...else的作用呢? 可以下面这个例子

    USE MySchool
    CREATE TABLE Score
    (
        id int identity(1,1) primary key,
        sname nvarchar(50),
        english int,
        math int,
        computer int
    )
    insert into Score(sname, english, math, computer) values('Jack',60,60,90);
    insert into Score(sname, english, math, computer) values('Lou',70,80,100);
    insert into Score(sname, english, math, computer) values('Andy',72,77,66);
    insert into Score(sname, english, math, computer) values('Am',82,60,55);
    insert into Score(sname, english, math, computer) values('Jobs',64,61,44);
    insert into Score(sname, english, math, computer) values('Bill',74,32,76);
    insert into Score(sname, english, math, computer) values('Afs',67,43,72);
        
    declare @avg float
    select @avg=english from Score
    IF (@avg<60)
        begin
            select top 3 * from Score order by english asc
        end
    else
        begin
        if(@avg>60 and @avg<70)
            begin
            select * from Score where english>60 order by english 
            end
        else
            begin
            select top 3 * from Score order by english desc
            end    
        end 
    

     2、While语句

        看一下下面这个例子:

    declare @i int
    set @i=0
    WHILE(@i<1000)
        begin
        set @i=@i+1
        insert into Score(sname,english,math,computer) values('test' + CONVERT(nvarchar(10),@i),@i%60,@i%60,@i%60)
        end 
     
     
    做一个练习,如果不及格的人数超过半数,则给每个人增加2分。
     
     
        select @count = count(*) from score
        select @failCount = count(*) from score where english < 60
        while(@failCount > @count/2)
            begin
                update score set english = english + 2
                --为了跳出循环,加了一次后,再过行检测看人数是否还达到超过一半了
                --set @failCount=-1
                select @failCount=count(*) from score where english < 60
            end
    

     3.CASE...END

       case...end的语法格式如下:

          CASE EXPRESSION

          WHEN VALUE1 THEN RETURNVALUE1
          WHEN VALUE2 THEN RETURNVALUE2
         ELSE DEFAULTRETURN VALUE
       END
      我们通过一下SQL代码例子来加深一下加CASE...END的理解:
    --查找STUDENT表,当年龄是19岁时显示青年,18岁显示小伙,其他年龄显示少年
        SELECT SAGE,
            CASE SAGE 
                WHEN '19' THEN '青年'
                WHEN '18' THEN '小伙'
                ELSE '少年'
            END
        FROM student
    
    --CASE..END的用处很多,我们可以使用他在客户等级,管理员级别的时候用到。例如当客户等级值为1表示普通用户,当客户等级用2表示VIP用户 
    --其中一个CASE可以产生一个列,多个CASE就会产生多个列
     
    --举一个踪合列子,显示员工姓名/年龄/工资 
    --工资级别在1-5K 那么初级,工资级别在5-10K 那么中级,工级级别在10K以上 那么是高级。
        select fname,fage,
            (
            case fsalary
                WHEN fsalary>1000 and fsalary<=5000 then '初级'
                WHEN fsalary>5000 and fsalary<=10000 then '中级'
                WHEN fsalary>10000 then '高级'
                else '未分级'
            ) as '工资级别'
        from table
    
    --有两张表如下,如何用SQL语句实现第二张表来显示第一张表的内容 
    --第一张表:
        name   subject  result
           张三   语文     80
           张三   数学     90
           张三   英语     100
           李四   语文     77
           李四   数学     88
           李四   英语     99
    --第二张表:
     
          name    语文   数学    英语
          李四     77     88      99    
            张三     80     90      100
     --SQL语句如下
         select [name]
                sum(case subject
                when '语文' then result
                end) as '语文'
                sum(case subject
                when '数学' then result
                end) as '数学'
                sum(case subject
                when '英语' then result
                end) as '英语'
            group by [name] 
    

      

    WAITFOR语句 WAITFOR语句表示时间等待,语法如下: WAITFOR DELAY <’time’> | TIME <’time’>
    DELAY参数指定等待的时间量,不能指定天数,只能指定小时,分钟,秒。最大的延迟时间是24小时,
    例如:
    WAITFORDELAY '00:01'
    select * from Score

    TIME参数指定等到一天中某个特定时刻。同样也只能用24小时制: WAITFOR TIME ‘01:00’; 等到今天01:00时刻执行下面的语句

    最后推荐两篇参考博文:

    http://www.cnblogs.com/30ErLi/archive/2010/09/17/1829274.html

    这篇文章有些是从这里COPY过来的。还有一篇在批处理上用到的关于SQLCMD的文章:

    http://blog.163.com/llsh2010@126/blog/static/1691895692011615113838734/

  • 相关阅读:
    算法学习:二分法从入门到精通
    TypeScript筑基笔记一:Visual Studio Code 创建Typescript文件和实时监控
    LeetCode 92. 反转链表 II
    LeetCode 1525. 字符串的好分割数目
    字节跳动-people后台一面面经
    LeetCode 117. 填充每个节点的下一个右侧节点指针 II
    LeetCode 1529. 灯泡开关 IV
    LeetCode 165. 比较版本号
    LeetCode 312. 戳气球
    LeetCode 605. 种花问题
  • 原文地址:https://www.cnblogs.com/cxeye/p/2630154.html
Copyright © 2011-2022 走看看