维斯李

3T_SQL编程与高级查询

第3章 T-SQL编程与高级查询

3.1 T-SQL分类语句
   1、声明变量。T-SQL语句中可以使用两种类型的变量,局部变量和全局变量。
   2、数据定义语言(Data Definition Language,DDL),用来建立数据库及数据库对象,绝大部分以create开头,如:create table等。
   3、数据控制语言(Data Control Language,DCL),用来控制数据库组件的存取许可、权限等命令。
   4、数据操作语言(Data Manipulation Language,DML),用来操作数据库中数据的命令,如:select、update等。
   5、流程控制语言(Flow Control Language,FCL),用于控制应用程序流程的语句,如:if、case等。
3.2 T-SQL中的注释
   1、嵌入行内的注释语句
     使用两个连字符“--”创建嵌入行内的注释语句,该符号将注释语句与语句分开。
   2、块注释语句
     “/*....*/”
3.3 T-SQL中的批处理
    批处理语句示例:

 insert into cardInfo values('023-001','123456',50,'2009-06-06 12:00:00')
     select * from cardInfo
     go
    --go语句作为批处理语句的结束标志,当编译器读取到go语句时,会把go语句前的所有语句当作一个批处理,并将这些语句打包发送个服务器。
     insert into cardInfo values('023-001','123456',50,'2009-06-06 12:00:00')
     insert into cardInfo values('023-002','123456')
     insert into cardInfo values('023-003','123456',65,'2009-06-06 12:30:30')
     go

 

3.4 变量
  3.4.1 局部变量
    1、声明T-sql局部变量
       声明局部变量的语法如下:
        declare {@变量名 数据类型 [,...n]}
        declare @name nvarchar(20),@age int,@address nvarchar(50)--声明多个局部变量
        declare语句默认会将变量的值初始化为null。
    2、为T-sql局部变量赋值
        set语句为局部变量赋值语法:
         set@变量名=值
         语法中的“值”可以是一个常量、任何有效的表达式、一个返回单值的查询语句等。
        例:

/*声明三个局部变量:@name、@row_count、year*/
         declare @name nvarchar(20),@row_count int,@year int
         
         /*使用set语句为局部变量赋值*/
         --将一个常量赋值给@name
         set @name='张三'

         --将查询语句返回的值赋给@year
         set @year=YEAR(getdate())

         --@row_count变量自增1
         set @row_count=@row_count+1

         select语句为局部变量赋值语法:
         select @变量名=值
         例:
         --声明一个局部变量@cardId,用于存储临时的CardId
         declare @cardId int
         --查询cardInfo表,并未局部变量赋值
         select @cardId=CardId from cardInfo where CardNumber='023-002'
         --查询CardId为@cardId的会员卡在本网吧的本月(6月)上网记录
         select * from recordInfo
            where DATEDIFF(month,EndTime,GETDATE())=0 and CardId=@cardId
         go

3、局部变量的作用域
         变量的作用域就是可以引用该变量的T-sql语句的范围。变量的作用域从声明变量的地方开始到 声明变量的批处理或存储过程的结尾。
        下面是局部变量的作用域错误代码示例:

declare @money int
         set @money=50
         go
         select * from cardInfo where CardBlanace<@money
         go

 

 4、局部变量的应用
        1.作为计算器计算循环执行的次数或控制循环执行的次数。
        2.保存数据值以控制流语句测试
        3.保存存储过程返回的数据值或函数返回值
  3.4.2 全局变量
        1.全局变量不是由用户的程序定义的,它们是在服务器级定义的
        2.用户只能使用预先定义的全局变量
        3.引用全局变量时,必须以标记符“@@”开头
        示例代码:

 select * from cardInfo
        go
        select @@rowcount as '受影响的行数'
        go

 

 3.5 输出语句
       print语句的语法:
        print {字符串|变量|函数|字符串表达式}
       例:

print'SQL server版本'
       print'-----------------------------'
       print @@version
       print '服务器当前时间:'+convert(varchar,getdate())''
       go

 

使用select语句输出:
       select @@version as 'SQL server版本',getdate()'当前时间'
       go
3.6 T-SQL的流程控制
  3.6.1 if-else语句
       语法形式:
       if(条件表达式)
         语句或语句块
       else
         语句或语句块
      若要定义语句块,则要使用控制流关键字begin和end,begin和end相当于C语言中的大括号“{}”。
       if(条件表达式)
         begin
            ...语句
         end
       else
         begin
            ...语句
         end
      if-else语句可以嵌套使用,且嵌套层数没有限制。
  3.6.2 case语句
        1、简单case语句
       语法格式:
         case 测试表达式
           when 表达式 then 结果表达式1
             [...n]
           [else 结果表达式n]
         end
        示例:

 select PCId as '编号'case PCUse
                   when 0 then '空闲'
                   when 1 then '正在使用'
                   else
              end as '状态',PCNote as '备注' from PCInfo
           go

2、搜索case格式
         语法格式:
          case
            when 布尔表达式 then 结果表达式1
            [...n]
            [else 结果表达式n]
           end
         示例:

create table score
           (
              sno varchar(10) not null primary key,  --学号
              sname varchar(20)not null,   --姓名
              smark float   --成绩
           )
          go

T-Sql实现代码如下:

 select sno as'学号',sname as '姓名'case
               when smark>=90 then '优秀'
               when smark>=80 then '良好'
               when smark>=80 then '中等'                           
               when smark>=80 then '及格'
               when smark>=80 then '不及格'
             else'成绩等级'
          from score
         go

搜索case格式中,各结果表达式的数据类型必须相同或能进行隐式转换。                                   

3.6.3 while语句
       while语句通过布尔表达式来设置一个条件,当这个条件成立时,重复执行一个语句或语句块,重复执行的部分成为循环体。T-SQL中的while循环和C语言中的循环相似。在while循环中,可以使用break和continue关键字在循环内控制while循环中语句执行。

语法:

while 布尔表达式
       {语句或语句块}
         [break]
       {语句或语句块}
         [continue]
       {语句或语句块}

定义语句块时,也需要使用begin和end将语句括起来

3.7子查询

(1)使用比较运算符(=、<>、>、>=、<、!>、!<或<=)的子查询,使用这些运算符的子查询必须返回单个值。

(2)IN 和 NOT IN子查询:可以返回多个值

select * from cardInfo 
  where cardid in(

select cardid from recordInfo where begintime<'2009-06-17' and endtime>'2009-06-16') go

(3)EXISTS 和 NOT EXISTS子查询

select * from recordInfo
  where exists(

select * from cardInfo 
                where cardid=recordInfo.cardid and cardnumber='023-002')
go

①子查询出现在form关键字后

子查询出现在form关键字之后通常是将子查询的结果作为一张虚拟表,有点类似于视图

例如,我们将cardInfo和recordInfo的内容查询出一张虚拟的表:

select CardNumber,CardPassword,CardBalance,TransactTime,PCId,
    BegainTime,EndTime,Fee
        from recordInfo r
        inner join cardInfo c on c.CardId=r.CardId

②子查询出现在select关键字后

出现在select关键字后的子查询,一般将其查询结果看作一个列.

 

posted on 2013-06-12 18:05  WS李  阅读(317)  评论(0编辑  收藏  举报

导航