一、批处理:
<span style="font-size:12px;">SELECT * FROM Students
SELECT * FROM Student_course
UPDATE Student_course
SET Student_grade=Student_grade+2
GO
</span>
GO是批处理的标志,表示SQL Server将这些T-SQL语句编译为一个执行单元,提高执行效率
一般是将一些逻辑相关的业务操作语句,放置在同一批中,这完全由业务需求和代码编写者决定
SQLServer规定:如果是建库、建表语句、以及我们后面学习的存储过程和视图等,则必须在语句末尾添加 GO 批处理标志
二、变量:
局部变量:
局部变量必须以标记@作为前缀,如@age
局部变量的使用也是先声明,再赋值
全局变量:
全局变量必须以标记@ @作为前缀,如@@version
全局变量由系统定义和维护,我们只能读取,不能修改全局变量的值
声明局部变量
DECLARE @变量名 数据类型
例如:
DECLARE @name varchar(8)
DECLARE @seat int
赋值
SET @变量名 =值
SELECT @变量名 = 值
例如:
SET @name=‘张三’
SELECT @name=stuName FROM stuInfo
WHERE stuNo=‘s25302’
全局变量都使用两个@标志作为前缀
变量 | 含义 |
@@ERROR | 最后一个T-SQL错误的错误号 |
@@IDENTITY | 最后一次插入的标识值 |
@@LANGUAGE | 当前使用的语言的名称 |
@@MAX_CONNECTIONS | 可以创建的同时连接的最大数目 |
@@ROWCOUNT | 受上一个SQL语句影响的行数 |
@@SERVERNAME | 本地服务器的名称 |
@@TRANSCOUNT | 当前连接打开的事务数 |
@@VERSION | SQL Server的版本信息 |
参考语句
<span style="font-size:12px;">print 'SQL Server的版本'+@@VERSION
print '服务器的名称: '+@@SERVERNAME
INSERT INTO Students(Student_id,Student_name,Student_sex,Student_classid)
VALUES(‘11003’,‘张三’,'男',‘2005022')
--如果大于0表示上一条语句执行有错误
print '当前错误号'+convert(varchar(5),@@ERROR)
GO
</span>
三、BEGIN…END语句
BEGIN
语句1
语句2
……
END
BEGIN…END
语句相当于其他语言中的复合语句,如JAVA语言中的{ }。它用于将多条T-SQL语句封装为一个整体的语句块,即将BEGIN…END内的所有T-SQL语句视为一个单元执行。
四、IF-ELSE语句
IF (条件)
BEGIN
语句1
语句2
……
END
ELSE
BEGIN
语句1
语句2
……
END -- ELSE是可选部分
--如果有多条语句,才需要BEGIN-END语句块
表一
问题:
统计并显示Course_id为‘1001’的课程的平均分,如果平均分在70以上,显示“成绩优秀“,并显示前三个最高的成绩;如果在70以下,显示“成绩较差“,并显示后三个最低的成绩。
分析:
第一步,统计平均成绩存入临时变量;
第二步,用IF-ELSE判断;
USE Student
GO
DECLARE @myavg float
SELECT @myavg=AVG (Student_grade)
FROM Student_course
WHERE Course_id='1001'
PRINT ‘本课程的平均成绩' +convert(varchar,@myavg)
IF (@myavg>70)
BEGIN
PRINT ‘本课程成绩优秀,前三个最高的成绩为:'
SELECT TOP 3 * FROM Student_course
WHERE Course_id='1001' ORDER BY Student_grade DESC
END
ELSE
BEGIN
PRINT ‘本课程成绩较差,后三个最低的成绩为:'
SELECT TOP 3 * FROM Student_course
WHERE Course_id='1001' ORDER BY Student_grade
END
GO
五、WHILE循环语句
WHILE (条件)
BEGIN
语句1
语句2
……
BREAK
END --BREAK表示退出循环如果有多条语句,才需要BEGIN-END语句块
问题:
表一中假定要给考试成绩提分。提分规则很简单,给没达到85分的学生每人都加2分,看是否都达到85分以上,如果没有全部达到85分以上,每人再加2分,再看是否都达到85分以上,如此反复提分,直到所有人都达到85分以上为止。
分析:
第一步,统计没达到85分的人数;
第二步,如果有人没达到,加分;
第三步,循环判断。
DECLARE @n int
WHILE(1=1) --条件永远成立
BEGIN
SELECT @n=COUNT(*) FROM Student_course
WHERE Student_grade<85 --统计没达到85分的人数
IF (@n>0)
UPDATE Student_course --每人加2分
SET Student_grade=Student_grade+2
WHERE Student_grade<85
ELSE
BREAK --退出循环
END
print '加分后的成绩如下:'
SELECT * FROM Student_course
六、 CASE-END多分支语句
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
……
ELSE 其他结果
END
问题:
根据表一采用美国的ABCDE五级打分制来显示笔试成绩。
A级: 90分以上
B级: 80-89分
C级: 70-79分
D级: 60-69分
E级: 60分以下
print 'ABCDE五级显示成绩如下:'
SELECT Student_id,
成绩= CASE
WHEN Student_grade<60 THEN 'E'
WHEN Student_grade BETWEEN 60 AND 69 THEN 'D'
WHEN Student_grade BETWEEN 70 AND 79 THEN 'C'
WHEN Student_grade BETWEEN 80 AND 89 THEN 'B'
ElSE 'A'
END
FROM Student_course
练习:
则根据如下规则对学生成绩进行反复加分,直到平均分超过85分为止。请编写T-SQL语句实现。
90分以上: 不加分
80-89分: 加1分
70-79分: 加2分
60-69分: 加3分
60分以下: 加5分
SELECT * FROM Student_course --原始成绩
SELECT AVG(Student_grade) FROM Student_course --原始平均成绩
DECLARE @avg INT
WHILE(1=1)
BEGIN
UPDATE Student_course
SET Student_grade=
CASE
WHEN Student_grade<60 THEN Student_grade+5
WHEN Student_grade between 60 AND 69 THEN Student_grade+3
WHEN Student_grade between 70 AND 79 THEN Student_grade+2
WHEN Student_grade between 80 AND 89 THEN Student_grade+1
ELSE Student_grade
END
SELECT @avg=AVG(Student_grade) FROM Student_course
IF @avg>=85
BREAK
END
SELECT * FROM Student_course --加分后的成绩
SELECT AVG(Student_grade) FROM Student_course --加分后平均成绩
总结
变量的赋值有两种方式:使用SET语句或SELECT语句。
输出结果也有两种方式:print语句和SELECT语句。
控制流语句提供了条件操作所需的顺序和逻辑。
语句块使用BEGIN…END。
批处理可以提高语句执行的效率,批处理结束的标志是“GO”。