【数据库和SQL学习笔记】9.(T-SQL语言)定义变量、高级查询、流程控制(条件、循环等)

工具:SQL Server 2019 Express
操作系统:Windows 10


用到的数据库备份: teaching.bak

回顾一下表结构:

t_student (S#, Sname, Sex, Age, Major)
t_teacher (T#, Tname, Age, Title)
t_course (C#, Cname, T#)
t_student_course (S#, C#, Score)

关于T-SQL

T-SQL,即 Transact-SQL,是SQL Server对标准SQL语言的扩充。
我们在SQL Server上使用的SQL语言可以理解为强化版本的sql,不仅支持所有标准SQL语言操作,同时又有许多功能上的扩展(包括变量和流程控制语句)。

定义变量

变量分全局变量和局部变量。
全局变量由系统预置好了,均以@@开头,如@@error,可用select @@变量名直接调用,不详述。

局部变量以@开头,通过 DECLARE 关键字定义:

DECLARE @变量名 数据类型

定义完后,通过SELECTSET关键字给变量赋值:

SET(SELECT) @变量名 = ...

例1:

declare @CurrentDateTime char(30)
set @CurrentDateTime = GETDATE()
select @CurrentDateTime as '当前的日期和时间'
go

上面的 go 是批处理的结束符,表示上面三句语句打包一起发送给处理器(服务器)进行处理。
注意:变量只在定义它的批处理中有效。如果上面三句话依次单独执行,执行到第二句set的时候就会报错提示没有@CurrentDateTime这个变量。

上例结果:
在这里插入图片描述


例2(带流程控制):

declare @Exp1 int, @Exp2 int
set @Exp1 = 30
set @Exp2 = 50
if @Exp1>@Exp2
	select @Exp2 as 较小数
else
	select @Exp1 as 较小数

结果:
在这里插入图片描述


例3(字符串相加 “+”):

declare @ResultStr char(60)
select @ResultStr='hello'+'world'
select @ResultStr as 字符串连接结果

结果:
在这里插入图片描述

T-SQL中的查询

我们在使用T-SQL的查询时,一般先用 USE 关键字选择当前的数据库,后接GO,语法:

USE 数据库名
GO
SELECT...

下面讲几个常用的高级查询的方法。


返回前几项(TOP)

例①:浏览 t_student 表前3项

use TeachingDB_new
go
select top 3 *
from t_student

在这里插入图片描述


例②:浏览 t_student 表50%的项

use TeachingDB_new
go
select top 50 percent *
from t_student

在这里插入图片描述

汇总统计(WITH CUBE)

我们之前学过 group by 用于将数据分组,然后对每个分组进行统计。
在T-SQL中,group by可以于 WITH CUBE、WITH ROLLUP 联合使用,实现更多的统计功能。

例:
我们已有一个对成绩表进行统计的结果:
在这里插入图片描述
我们加上 WITH CUBE,进行汇总统计:

select C#, avg(Score) as 平均成绩, count(S#) as 选修人数
from t_student_course
group by C#
with cube

在这里插入图片描述
with cube 在除各分组的统计行之外,还提供了一个汇总行。
当group by分组的依据是单个属性时,with cube 对查询结果增加一个汇总行,汇总行在分组属性上取值显示为“NULL”,并且对所有记录在不分组的情况下进行统计

流程控制

SET

SET:为局部变量赋值,如前所述

语句块(BEGIN…END)

BEGIN…END将多个T-SQL语句组合成语句块,并将它们视为一个单元处理。
语法:

BEGIN
	T-SQL语句
	T-SQL语句
	......
END

条件分支(IF…ELSE)

"定义变量"的例2中已展示。语法:

IF 条件表达式
	T-SQL语句(或BEGIN...END语句块)
ELSE
	T-SQL语句(或BEGIN...END语句块)

其中,条件表达式的值是逻辑值。
条件表达式中可以含有select语句,需要用括号()括起来。
if…else可嵌套。

例:

if exists(select * from t_student_course where S#='2012001')
	select avg(Score) from t_student_course where S#='2012001'
else
	print '无该学生选课记录'

在这里插入图片描述

多分支(CASE)

case与end相接。
在case语句中,对case后的表达式进行计算,由上至下找到取值匹配的第一个when子句,获取then后面的相应值。
case表达式是一种查找型表达式的范例,它本身可用来按条件赋值。

例1、Major列分成大类:

select S#, Sname,
	case Major
		when '软件工程' then '工科专业'
		when '机械电子' then '工科专业'
		else '文科专业'
	end as '专业类别'
from t_student

在这里插入图片描述


例2、新建一列,判断成绩级别:

select S#, C#,
	case
		when Score>=90 then 'A'
		when Score>=80 then 'B'
		when Score>=70 then 'C'
		else 'D'
	end as 成绩级别
from t_student_course

在这里插入图片描述

重复执行(WHILE)

while:重复执行某一个语句(块),语法:

WHILE 条件表达式
	T-SQL语句(或BEGIN...END语句块)

在循环中,使用 BREAK 跳出循环,也可以用 CONTINUE 继续下一循环。
while循环可以嵌套。

例:累加,到大于1000显示结果:

declare @i int, @a int
set @i=1
set @a=0
while @i <= 100
	begin
		set @a = @a + @i
		if @a >= 1000 break
		set @i = @i + 1
	end
select @a as 'a', @i as 'i'

在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值