SQL server学习10-数据库编程(中)
目录
一,分支语句 IF...ELSE
二,多路分支函数 CASE
1,简单CASE函数
2,CASE搜索函数
三,循环语句 WHILE
四,检测语句 IF...EXISTS
T-SQL语言中提供了丰富的流程控制语句或函数,主要包含
- 分支语句 IF...ELSE
- 循环语句 WHILE
- 多路分支函数 CASE
- 检测语句 IF EXISTS
接下来先学习分支语句。
一,分支语句 IF...ELSE
语法如下:
IF 条件表达式
{T-SQL 语句 | 语句块}
|ELSE
{T-SQL 语句 | 语句块}
其中,IF或ELSE后面有多条语句时,则要使用BEGIN 和END语句将多个T-SQL语句组合为一个语句块,BEGIN和END的作用相当于C,C#等高级语言中的{...}。
任务1:如果课程号为1的平均成绩及格,则打印“平均分及格”,并且打印此门功课的最高分数和最低分数,否则打印平均成绩和“我们还需要加倍努力”。
USE StuScore
DECLARE @av int,@ma int,@mi int
SELECT @av=ROUND(AVG(gets),0),@ma=MAX(gets),@mi=MIN(gets) FROM score WHERE cno='1'
IF @av>=60
BEGIN
PRINT '平均分及格'+CHAR(10)+'最高分: '+STR(@ma,3)+CHAR(10)+'最低分: '+STR(@mi,3)
END
ELSE
BEGIN
PRINT '平均成绩: '+STR(@av,3)+CHAR(10)+'我们还需要加倍努力'
END
由IF和ELSE语句块里面只有一条语句,因此,BEGIN和END关键字可以省略。
任务2:将学号为1的同学所选课程号为1的成绩转换为等级制成绩。
- A:90分以上
- B:80分以上
- C:70分以上
- D:60分以上
- E:60分以下
USE StuScore
DECLARE @a int,@l char(1)
SELECT @a=gets FROM score WHERE sno='1' AND cno='1'
PRINT '成绩(百分制):'+STR(@a,3)
IF @a>=90
SET @l='A'
ELSE IF @a>=80
SET @l='B'
ELSE IF @a>=70
SET @l='C'
ELSE IF @a>=60
SET @l='D'
ELSE
SET @l='E'
PRINT '成绩(等级制): '+@l
二,多路分支函数 CASE
上面的任务2除了使用IF语句嵌套实现多路分支,还可以使用CASE函数实现多路分支。
CASE函数有两种写法,分别为简单CASE函数和CASE搜索函数。
1,简单CASE函数
语法如下:
CASE 变量名
WHEN 变量值1 THEN 结果1
WHEN 变量值2 THEN 结果2
[...n]
[ELSE 默认结果]
END
任务:输入数字1~7:1表示星期天,2表示星期一...,之后输出对应的星期。
DECLARE @a CHAR(1)=2,@b VARCHAR(20)
SET @b=
CASE @a
WHEN 1 THEN '星期天'
WHEN 2 THEN '星期一'
WHEN 3 THEN '星期二'
WHEN 4 THEN '星期三'
WHEN 5 THEN '星期四'
WHEN 6 THEN '星期五'
WHEN 7 THEN '星期六'
ELSE 'NONE'
END
PRINT @b
2,CASE搜索函数
语法如下:
CASE
WHEN 表达式1 THEN 结果1
WHEN 表达式2 THEN 结果2
[...n]
[ELSE 默认结果]
END
使用简单CASE函数完成任务2,将学号为1的同学所选课程号为1的成绩转换为等级制成绩。
- A:90分以上
- B:80分以上
- C:70分以上
- D:60分以上
- E:60分以下
上面的任务只是查找一个学生的成绩,查找多个学生的成绩也是一样的写法,只是用声明变量,及用WHERE关键字。
三,循环语句 WHILE
语法如下:
WHILE 条件表达式
{SQL语句 | 语句块}
如果WHILE语句后的条件表达式为TRUE,则重复执行SQL语句或语句块。
可以使用BREAK和CONTINUE关键字,在循环内部控制WHILE循环中语句的执行。
- BREAK:强制结束循环,即使循环条件为TRUE。
- CONTINUE:结束本次循环,进入下一次循环。
任务:本次计算机组成原理 Principle of Computer Organization 考试成绩较差
SELECT st.sno AS 学号,sne AS 姓名,cne AS 课程名,gets AS 成绩 FROM students AS st
JOIN score AS sc ON sc.sno=st.sno
JOIN courses AS co ON co.cno=sc.cno
WHERE cne='Principle of Computer Organization'
假设要提分,保证及格率达到80%以上,提分规则:先给每人加2分,看是否达到要求,如果没有,继续加2分,直到及格率达到80%以上。注意,个人成绩不能超过100分。
首先计算出及格率,如下:
接下来开始加分,让及格率达到80%以上
USE StuScore
DECLARE @p decimal(5,2),@s decimal(5,2),@r decimal(10,2)=0 --@p存储及格人数,@s存储总人数,@r存储及格率
SELECT @p=count(sc.cno) FROM score AS sc
JOIN courses AS co ON co.cno=sc.cno
WHERE cne='Principle of Computer Organization '
AND gets>=60
SELECT @s=count(sc.cno) FROM score AS sc
JOIN courses AS co ON co.cno=sc.cno
WHERE cne='Principle of Computer Organization '
WHILE @p/@s*100<=80
BEGIN
UPDATE score SET gets=gets+2 WHERE
cno=(SELECT cno FROM courses WHERE cne='Principle of Computer Organization') AND gets<=98 --保证成绩不超过100
SELECT @p=COUNT(cno) FROM score WHERE
cno=(SELECT cno FROM courses WHERE cne='Principle of Computer Organization') AND gets>=60
END
PRINT '及格率:'+CONVERT(VARCHAR(100),@p/@s*100)
四,检测语句 IF...EXISTS
检测语句用于检测数据是否存在,只返回TRUE或FALSE(如果和查询语句一起使用,查询语句的选择列表用*就行)
USE StuScore
IF EXISTS (
SELECT * FROM score sc,students st WHERE sc.sno=st.sno AND sne='songjiang')
PRINT '有选课'
ELSE
PRINT '没选课'
有问题请在评论区留言或者说私信我,回复时间不超过一天。