1、If-Else条件结构
2、While循环结构
3、Case-End多分支结构
4、批处理语句
5、(=)子查询
6、(In、Not In)子查询
7、(EXISTS、Not EXISTS)子查询
//定义局部变量
declare @name varchar(8)
declare @seat int
//编写T-SQL查找李文才的左右同桌 ?
//局部变量使用(赋值)
set @name='admin'
select @seat=id from stu
where stuname=@name
select * from stu
where (id=@seat-1) or (id=@seat+1)
go
//全局变量都使用 @@(两个)标志作为前缀
print '版本号'+@@version
print '服务器'+@@servername
insert into stu(stuname,stupwd,email)values('ces','ces','[email protected]')
print '错误号'+convert(varchar(5),@@error)
print '最后ID'+convert(varchar(5),@@identity)
update stu set email='a' where id=@@identity
print '错误:'+convert(varchar(5),@@error)
go
//SQL中的IF-ELSE语句
declare @myavg int
select @myavg=avg(score1) from stuscore
print '平均分:'+convert(varchar(5),@myavg)
if (@myavg>90)
begin
print '成绩优秀'
select top 3 * from stuscore order by score1 desc
end
else
begin
print '成绩不好'
select top 3 * from stuscore order by score1
end
go
//SQL中的WHILE语句
declare @n int
while(1=1)
begin
select @n=count(*) from stuscore where score1<60
if(@n>0)
update stuscore set score1=score1+2
else
break
end
print '加分以后的成绩:'
select * from stuscore
go
//SQL中的CASE-END多分支
select uid as 学号,score1 as 笔试,score2 as 面试,(score1+score2)/2 as 平均分,
等级=case
when (score1+score2)/2 <60 then '不及格'
when (score1+score2)/2 between 60 and 69 then '及格'
when (score1+score2)/2 between 70 and 79 then '一般'
when (score1+score2)/2 between 80 and 89 then '良好'
when (score1+score2)/2 between 90 and 100 then '优秀'
end
from stuscore
go
//则根据如下规则对机试成绩进行反复加分,直到平均分超过85分为止。请编写T-SQL语句实现。
90分以上: 不加分
80-89分: 加1分
70-79分: 加2分
60-69分: 加3分
60分以下: 加5分
declare @myavg int
while(1=1)
begin
select @myavg=avg(score1) from stuscore
if(@myavg<75)
begin
update stuscore set score1=
case
when score1<60 then score1+5
when score1 between 60 and 69 then score1+3
when score1 between 70 and 79 then score1+2
when score1 between 80 and 89 then score1+1
else
score1
end
end
else
break
end
select * from stuscore
go
//批处理语句
GO是批处理的标志,表示SQL Server将这些T-SQL语句编译为一个执行单元,提高执行效率
一般是将一些逻辑相关的业务操作语句,放置在同一批中,这完全由业务需求和代码编写者决定
SQLServer规定:如果是建库、建表语句、以及我们后面学习的存储过程和视图等,则必须在语句末尾添加 GO 批处理标志
//子查询
select * from stu where id>(select id from stu where stuname='admin')
select * from stu where id=(select uid from stuscore where score1=80)
select * from stu where id in (select uid from stuscore where score1>70)
select * from stu where id not in (select uid from stuscore)
//子查询-问题1
问题:
编写T-SQL语句,查看年龄比“李斯文”大的学员,要求显示这些学员的信息 ?
分析:
第一步:求出“李斯文”的年龄;
第二步:利用WHERE语句,筛选年龄比“李斯文”大的学员;
方法一
DECLARE @age INT --定义变量,存放李斯文的年龄
SELECT @age=stuAge FROM stuInfo
WHERE stuName=‘李斯文’ --求出李斯文的年龄
--筛选比李斯文年龄大的学员
SELECT * FROM stuInfo WHERE stuAge>@age
GO
方法二
SELECT * FROM stuInfo
WHERE stuAge>( SELECT stuAge FROM
stuInfo where stuName='李斯文')
GO
子查询在WHERE语句中的一般用法:
SELECT … FROM 表1 WHERE 字段1 >(子查询)
外面的查询称为父查询,括号中嵌入的查询称为子查询
UPDATE、INSERT、DELETE一起使用,语法类似于SELECT语句
将子查询和比较运算符联合使用,必须保证子查询返回的值不能多于一个
//子查询-问题2
问题:查询笔试刚好通过(60分)的学员。
方法一(联结)
SELECT stuName FROM stuInfo
INNER JOIN stuMarks
ON stuInfo.stuNo=stuMarks.stuNo
WHERE writtenExam=60
GO
方法二(子查询)
SELECT stuName FROM stuInfo
WHERE stuNo=(SELECT stuNo FROM
stuMarks WHERE writtenExam=60)
GO
//EXISTS-问题
问题:
检查本次考试,本班如果有人笔试成绩达到80分以上,则每人提2分;否则,每人允许提5分
分析:
是否有人笔试成绩达到80分以上,可以采用EXISTS检测
答案:
/*--采用EXISTS子查询,进行酌情加分--*/
IF EXISTS (SELECT * FROM stuMarks WHERE writtenExam>80)
BEGIN
print '本班有人笔试成绩高于80分,每人加2分,加分后的成绩为:'
UPDATE stuMarks SET writtenExam=writtenExam+2
SELECT * FROM stumarks
END
ELSE
BEGIN
print '本班无人笔试成绩高于80分,每人可以加5分,加分后的成绩:'
UPDATE stuMarks SET writtenExam=writtenExam+5
SELECT * FROM stumarks
END
GO