MSSQL变量与赋值

本文深入探讨SQL中变量的定义与使用技巧,包括不同方法声明变量存储学生数量,计算年龄的最大值、最小值和平均值,以及如何处理NULL值。同时,展示了如何筛选特定年龄段的学生信息,并对比SET与SELECT在变量赋值上的差异。

----定义一个变量 @stuNumber,用来存储学生的数量
--方法01 :使用 Set

Declare @stuNumber int 
Set @stuNumber=(Select Count(*) from LibraryDB.dbo.student)
Select @stuNumber As '学生数量'

go  ---一个批处理的结束和另一个批处理的开始, 在批处理中变量名称不能重复

--方法02 :使用 Select
Declare @stuNumber int 
Select @stuNumber=Count(*) from LibraryDb.dbo.Student
Select @stuNumber As '学生数量'

go
--方法03 
Declare @stuNumber int = (Select Count(*) from LibraryDB.dbo.student)
Print '学生数量:'+ CAST(@stuNumber AS char(5))

---声明多个变量
Declare @num01 int,@num02 int,@num03 int
Select @num01

--任何值和Null运算结果都是Null


--------打印年龄最大值,最小值、平均值 
--Set 

Declare @max int,@min int,@avg int
Set @max =(Select Max(Sage) from LibraryDB.dbo.Student)
Set @min =(Select Min(Sage) from LibraryDB.dbo.Student)
Set @avg =(Select AVG(Sage) from LibraryDB.dbo.Student)

Print '最大值:'+ Cast(@max As char(4)) + char(13) +
      '最小值:'+ Cast(@min As char(4)) + char(13) +
      '平均值:'+ Cast(@avg As char(4)) 
go
--Select 
Declare @max int,@min int,@avg int 
Select @max=max(sage), @min=min(sage),@avg=avg(sage)
from LibraryDB.dbo.Student
Print '最大值:'+ Cast(@max As char(4)) + char(13) +
      '最小值:'+ Cast(@min As char(4)) + char(13) +
      '平均值:'+ Cast(@avg As char(4)) 
go


--------Select 和 Set区别 
Declare @num02 int 
Select @num02 =IsNull(sage,0)  from LibraryDB.dbo.Student Order by SAGE 

Print @num02
Select @num02

go

--打印出年龄介于20-30岁之间的所有学生姓名
Declare @stuName varchar(200) ='',@stuNumber int 
Select @stuName=@stuName+SName+'  ' from LibraryDB.dbo.Student Where Sage Between 20 And 30
Set @stuNumber=(Select count(*) from LibraryDb.dbo.Student Where Sage Between 20 And 30)
Print '年龄介于20-30岁之间的所有学生姓名:'+char(13)+@stuName+char(13)+ '共计:'+CAST(@stuNumber As varchar(3))+'人'
go

----Set /Select 
Declare  @num01 int=100 ,@num02 int = 200
Set @num01=(Select SAge from LibraryDB.dbo.Student Where 1=0)
Select @num02=Sage from LibraryDB.dbo.Student Where 1=0
Select @num01
Select @num02
----如果变量有初始值,如果使用Set赋值,无论赋值的结果时什么,都会把这个结果强行给这个变量;如果用Select进行赋值,只有值不等于null才能完成赋值
go


Declare @Outer int =100
Begin 
    Declare @inner int =200
    Select @outer,@inner
End
Select @outer,@inner
----变量的有效期时通过 go来分割的
go

------Varchar  / char
declare @str01 char(100)
set @str01 = 'Steven'
Set @str01 +='wang'
print @str01


declare @str02 varchar(100)
set @str02 = 'Steven'
Set @str02 +='wang'
print @str02
--varchar支持字符串的拼接,而char不可以

### 实现 MySQL 变量递归赋值 在 MySQL 中,虽然直接通过 SQL 语句实现复杂的递归逻辑并不被推荐[^1],但是可以利用 `WITH RECURSIVE` 结构来创建递归公用表表达式(CTE),从而间接完成某些形式的递归操作。对于变量的递归赋值,则更多依赖于存储过程中的编程控制流。 #### 使用 WITH RECURSIVE 进行简单数值累加示例 下面是一个简单的例子,展示如何使用 `WITH RECURSIVE` 来模拟一个整数序列的生成以及相应的累积求和: ```sql WITH RECURSIVE numbers AS ( SELECT 1 as num, CAST(1 AS CHAR) as sum_str UNION ALL SELECT num + 1, CONCAT(sum_str, ',', (num + 1)) FROM numbers WHERE num < 5 ) SELECT GROUP_CONCAT(num), sum_str FROM numbers; ``` 此查询会构建一个从1到5的数字列表及其对应的字符串表示形式,并最终返回这两个字段的内容作为结果集的一部分[^2]。 #### 存储过程中实现更复杂的递归逻辑 当涉及到更加复杂的业务场景时,建议采用存储过程的方式来处理递归问题。例如,在 MySQL 8 版本之后引入了对递归存储过程的支持,这允许开发者编写能够自我调用的过程体来进行深层次的数据遍历或计算[^3]。 这里给出一段伪代码样例用于说明如何在一个存储过程中执行带有条件判断的递归赋值: ```sql DELIMITER $$ CREATE PROCEDURE RecursiveAssignment(IN start INT, OUT result TEXT) BEGIN DECLARE current_value INT DEFAULT start; IF current_value <= 0 THEN SET result = 'Base case reached'; ELSE CALL RecursiveAssignment(current_value - 1, @temp_result); -- 假设我们希望将每次递归的结果拼接成逗号分隔的形式保存至result参数中 SET result = CONCAT(@temp_result, ',', current_value); END IF; END$$ DELIMITER ; ``` 上述代码片段展示了如何定义并调用一个名为 `RecursiveAssignment` 的存储过程,该过程接受两个输入/输出参数:一个是起始值 (`start`) ,另一个是用来接收最终结果(`result`) 。在这个过程中实现了基于给定初始值得减法运算直到达到基础情况为止,并在此期间不断更新输出参数 `result` 的内容。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值