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

posted @ 2022-05-29 17:42  云谷の风  阅读(138)  评论(0编辑  收藏  举报