• MS SQL高级——逻辑语句与子查询+定义参数


    逻辑语句与子查询

    变量的分类

    局部变量:(仅在过程中使用)

    • 局部变量必须以标记@作为前缀,如@age。局部变量的使用也是先声明(使用declare),再赋值。

    全局变量:(任何时候均可以使用)

    • 全局变量必须以标记@@作为前缀,如@@version。全局变量由系统定义和维护,我们只能读取,不能修改全局变量值。

    局部变量定义与赋值(定义参数)

    局部变量的定义语法

    DECLARE @变量名 数据类型

    赋值方法

    • SET @变量名=值
    • SELECT @变量名=值

    使用Select赋值确保筛选出的记录只有1条

    问题:编写T-SQL查询李铭及其学号相邻的学员?

    局部变量的使用

    代码编写:

     示例:

     1 use StudentManageDB
     2 go
     3 --声明学号变量
     4 declare @stuid int,@stuname varchar(20)
     5 
     6 --查询李铭的信息
     7 set @stuname='李铭'
     8 select StudentId,StudentName,Gender,StudentIdNo from Students
     9 where StudentName=@stuname
    10 
    11 --查询李铭的学号
    12 select @stuId=StudentId from Students where StudentName=@stuname
    13 
    14 --查询与李铭学号相邻的学员
    15 select StudentId,StudentName,Gender,StudentIdNo from Students
    16 where StudentId=(@stuId+1) or StudentId=(@stuId-1)
    View Code

    set与select比较

     

    示例:

    1 declare @stuAddress nvarchar(100) , @stuName nvarchar(100)
    2 --set @stuAddress='天津', @stuName='张三'                            --不允许这样赋值
    3 select @stuaddress='天津', @stuName='王小虎'             --允许
    4 
    5     --set @stuAddress = (select StudentAddress from Students)  --不允许
    6     select @stuAddress = StudentAddress from Students    --得到最后一个
    7     set @stuAddress = (select StudentAddress from Students where 1<0) --NULL值
    8     select @stuAddress =  StudentAddress from Students where 1<0        --保持原值
    View Code

    全局变量示例

    全局变量都使用两个@标志作为前缀

    变量 含义
    @@ERROR 最后一个T-SAQL错误的错误号
    @@IDENTITY 最后一次插入的标识值
    @@LANGUAGE 当前使用的语言的名称
    @@MAX_CONNECTIONS 可以创建的同时连接的最大数目
    @@ROWCOUNT 受上一个SQL语句影响的行数
    @@SERVERNAME 本地服务器的名称
    @@TRANSCOUNT 当前连接打开的事务数
    @@VERSIONSQL  Server的版本信息
    1 PRINT  '服务器的名称: ' + @@SERVERNAME  
    2 PRINT 'SQL Server的版本' + @@VERSION 
    3   
    4 SELECT  @@SERVERNAME  AS  '服务器名称'
    5 SELECT  @@VERSION  AS  'SQL Server的版本' 
    View Code
    1 use StudentManageDB
    2 go
    3 --插入学员信息
    4 insert into Students (StudentName,Gender,Age,Birthday,StudentIdNo,PhoneNumber,StudentAddress,ClassId)
    5 values('王小欣','',28,'1988-08-07',120223198808071111,'022-22222222','天津市南开区',10)
    6 
    7 
    8 --获取最后一条SQL语句的执行错误号
    9 print @@error
    View Code

    T-SQL数据类型转换

    常用的两种转换方法

    • CONVERT(数据类型,表达式,样式第三个参数可以省略,它一般用于日期类型数据转换为字符类型,或浮点类型数据转换为字符类型,不同的样式使转换后字符数据的显示格式不同
    • CAST(表达式AS数据类型)

    CONVERT()与CAST()的不同点是:可以指定转换的样式

     1 use StudentManageDB
     2 go
     3 --定义变量并查询
     4 declare @sumScore int
     5 select @sumScore=(CSharp+SQLServerDB) from ScoreList
     6 where StudentId=100003
     7 --输出
     8 --print '学号=100003总成绩:'+@sumScore
     9 
    10 print '学号=100003总成绩:'+convert(varchar(20),@sumScore)
    View Code

    两种不同类型的转换比较

    1 use StudentManageDB
    2 go
    3 --使用CAST转换
    4 select  StudentName + '的出生日期是:' + CAST(Birthday as varchar(50)) AS '学生信息'
    5 from Students where StudentId=100005
    6 --使用CONVERT转换
    7 select  StudentName + '的出生日期是:' + CONVERT(varchar(50),Birthday,102) AS '学生信息'
    8 from Students where StudentId=100005
    View Code

    T-SQL中的其他函数

    问题:查询学号等于100002的学员年龄?

     1 use StudentManageDB
     2 go
     3 --定义变量
     4 declare @birthday datetime,@days int,@age int
     5 --查询出生日期
     6 select @birthday=Birthday from Students where StudentId=100002
     7 --计算出生天数
     8 set @days=datediff(dayofyear,@birthday,getdate())
     9 --计算年龄
    10 set @age=floor(@days/365)
    11 --输出信息
    12 print '100002学员年龄:'+convert(varchar(20),@age)
    13 
    14 --直接查询
    15 select FLOOR(DATEDIFF(dy, Birthday, GETDATE())/365) 年龄
    16 from Students where StudentId=100002
    View Code

    逻辑控制语句

    分支结构

    • IF-ELSE语句
    • CASE-END语句

    循环结构

    • WHILE语句

    IF-ELSE语句示例

     1 use StudentManageDB
     2 go
     3 --查询成绩
     4 declare @cAvg int
     5 select @cAvg=avg(CSharp) from ScoreList 
     6 inner join Students on ScoreList.StudentId=Students.StudentId where ClassId=1
     7 print 'C#平均成绩:'+convert(varchar(20),@cAvg)
     8 --判断成绩
     9 if(@cAvg>=80)  
    10     print '软件一班成绩优秀!'  
    11 else
    12     print '软件一班成绩一般!'
    View Code

    WHILE语句示例

    问题:将所有C#成绩不及格的学员加分到60

     1 use StudentManageDB
     2 go
     3 print '加分之前的C#成绩:'
     4 select StudentId,CSharp from ScoreList 
     5 declare @CSharp int,@StuId int
     6 while(1=1)
     7     begin
     8         select top 1 @CSharp=CSharp,@StuId=StudentId 
     9                  from ScoreList where CSharp<60
    10        if (@CSharp<60) 
    11           update ScoreList set CSharp=CSharp+1 
    12                 where StudentId=@StuId
    13        if((select count(*) from ScoreList where CSharp<60)=0)
    14          break
    15    end
    16 print '加分之后的C#成绩:'
    17 select StudentId,CSharp from ScoreList 
    View Code

    CASE-END语句示例

    • ELSE表示CASE中所有WHEN条件均不为TRUE时返回的结果
    • 如果省略ELSE且WHEN条件都为FALSE时,CASE语句返回NULL

    问题:学员成绩进行评比,90以上为A;80-89为B;70-79为C;60-69:为D;60以下为:不及格

     1 use StudentManageDB
     2 go
     3 select 学号=StudentId,
     4 总评=CASE
     5     when (CSharp+SQLServerDB)/2>=90 then  'A'  
     6     when (CSharp+SQLServerDB)/2 between 80 and 89 then  'B'  
     7     when (CSharp+SQLServerDB)/2 between 70 and 79 then  'C'  
     8     when (CSharp+SQLServerDB)/2 between 60 and 69 then  'D' 
     9     else '不及格' 
    10           end
    11 from ScoreList
    View Code

     EXISTS子查询

    回顾:如何用SQL语句检测数据库或数据表是否已经创建?

    语法规范

    IF EXISTS(子查询)
        语句

    用法总结果

    • 子查询的结果非空,即记录条数1条以上,则EXISTS(子查询)将返回真(true),否则返回假(false)。
    • EXISTS也可以作为WHERE语句的子查询,但一般都能用IN子查询替换。

    END

  • 相关阅读:
    java8特性 Optional 工具类
    SpringBoot 配置支付宝接口
    Redis宕机 快速恢复
    flowable流程引擎通过模型ID部署流程
    java OA系统 自定义表单 流程审批 电子印章 手写文字识别 电子签名 即时通讯
    Mybatis 动态执行SQL语句
    idea 访问 jsp 404问题
    变量名的命名
    CSS设计 Search窗口
    jQuery实现Ajax功能示例
  • 原文地址:https://www.cnblogs.com/zeon/p/16323940.html
Copyright © 2020-2023  润新知