当前位置:网站首页>【数据库和SQL学习笔记】9.(T-SQL语言)定义变量、高级查询、流程控制(条件、循环等)
【数据库和SQL学习笔记】9.(T-SQL语言)定义变量、高级查询、流程控制(条件、循环等)
2022-08-05 05:15:00 【takedachia】
工具: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 @变量名 数据类型
定义完后,通过SELECT
或SET
关键字给变量赋值:
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'
边栏推荐
- day12函数进阶作业
- Lecture 3 Gradient Tutorial Gradient Descent and Stochastic Gradient Descent
- 02.01-----The role of parameter reference "&"
- Convert the paper official seal in the form of a photo into an electronic official seal (no need to download ps)
- 【过一下11】随机森林和特征工程
- 浅谈Servlet生命周期
- In Opencv, imag=cv2.cvtColor(imag,cv2.COLOR_BGR2GRAY) error: error:!_src.empty() in function 'cv::cvtColor'
- 02.01-----参数的引用的作用“ & ”
- 通过Flink-Sql将Kafka数据写入HDFS
- Flink accumulator Counter 累加器 和 计数器
猜你喜欢
随机推荐
ES6基础语法
redis persistence
基于Flink CDC实现实时数据采集(三)-Function接口实现
DOM and its applications
【零基础开发NFT智能合约】如何使用工具自动生成NFT智能合约带白名单可Mint无需写代码
如何编写一个优雅的Shell脚本(二)
【过一下14】自习室的一天
Flink Oracle CDC写入到HDFS
【过一下15】学习 lstm的一周
vscode要安装的插件
【过一下12】整整一星期没记录
BFC详解(Block Formmating Context)
NodeJs接收上传文件并自定义保存路径
flink部署操作-flink on yarn集群安装部署
BroadCast Receiver(广播)详解
数据库期末考试,选择、判断、填空题汇总
flink项目开发-flink的scala shell命令行交互模式开发
怎样在Disciples门徒获得收益?
day12函数进阶作业
第5讲 使用pytorch实现线性回归