SQL server学习10-数据库编程(中)

目录

[一,分支语句 IF...ELSE](#一,分支语句 IF...ELSE)

[二,多路分支函数 CASE](#二,多路分支函数 CASE)

1,简单CASE函数

2,CASE搜索函数

[三,循环语句 WHILE](#三,循环语句 WHILE)

[四,检测语句 IF...EXISTS](#四,检测语句 IF...EXISTS)


T-SQL语言中提供了丰富的流程控制语句或函数,主要包含

  1. 分支语句 IF...ELSE
  2. 循环语句 WHILE
  3. 多路分支函数 CASE
  4. 检测语句 IF EXISTS

接下来先学习分支语句。

一,分支语句 IF...ELSE

语法如下:

sql 复制代码
IF 条件表达式
{T-SQL 语句 | 语句块}
|ELSE
{T-SQL 语句 | 语句块}

其中,IF或ELSE后面有多条语句时,则要使用BEGIN 和END语句将多个T-SQL语句组合为一个语句块,BEGIN和END的作用相当于C,C#等高级语言中的{...}。

任务1:如果课程号为1的平均成绩及格,则打印"平均分及格",并且打印此门功课的最高分数和最低分数,否则打印平均成绩和"我们还需要加倍努力"。

sql 复制代码
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的成绩转换为等级制成绩。

  1. A:90分以上
  2. B:80分以上
  3. C:70分以上
  4. D:60分以上
  5. E:60分以下
sql 复制代码
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函数

语法如下:

sql 复制代码
CASE 变量名
WHEN 变量值1 THEN 结果1
WHEN 变量值2 THEN 结果2
[...n]
[ELSE 默认结果]
END

任务:输入数字1~7:1表示星期天,2表示星期一...,之后输出对应的星期。

sql 复制代码
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搜索函数

语法如下:

sql 复制代码
CASE 
WHEN 表达式1 THEN 结果1
WHEN 表达式2 THEN 结果2
[...n]
[ELSE 默认结果]
END

使用简单CASE函数完成任务2,将学号为1的同学所选课程号为1的成绩转换为等级制成绩。

  1. A:90分以上
  2. B:80分以上
  3. C:70分以上
  4. D:60分以上
  5. E:60分以下

上面的任务只是查找一个学生的成绩,查找多个学生的成绩也是一样的写法,只是用声明变量,及用WHERE关键字。

三,循环语句 WHILE

语法如下:

sql 复制代码
WHILE 条件表达式
{SQL语句 | 语句块}

如果WHILE语句后的条件表达式为TRUE,则重复执行SQL语句或语句块。

可以使用BREAK和CONTINUE关键字,在循环内部控制WHILE循环中语句的执行。

  1. BREAK:强制结束循环,即使循环条件为TRUE。
  2. CONTINUE:结束本次循环,进入下一次循环。

任务:本次计算机组成原理 Principle of Computer Organization 考试成绩较差

sql 复制代码
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%以上

sql 复制代码
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(如果和查询语句一起使用,查询语句的选择列表用*就行)

sql 复制代码
USE StuScore
IF EXISTS (
SELECT * FROM score sc,students st WHERE sc.sno=st.sno AND sne='songjiang')
 PRINT '有选课'
ELSE
 PRINT '没选课'

有问题请在评论区留言或者说私信我,回复时间不超过一天。

相关推荐
joke_xiaoli6 分钟前
如何重置 MySQL root 用户的登录密码?
数据库·mysql
鹏说大数据36 分钟前
MySQL连接较慢原因分析及解决措施
数据库·mysql
极限实验室2 小时前
使用 INFINI Gateway 保护 Elasticsearch 集群之修改查询不合理参数(二)
数据库
竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。2 小时前
etcd客户化工具
数据库·etcd
OKay_J2 小时前
使用VSCode开发STM32补充(Debug调试)
ide·经验分享·笔记·vscode·stm32·学习·编辑器
肥肠可耐的西西公主2 小时前
前端(vue)学习笔记(CLASS 4):组件组成部分与通信
前端·vue.js·学习
谷晓光2 小时前
python中print函数的flush如何使用
linux·服务器·数据库
OceanBase数据库官方博客3 小时前
自然语言秒转SQL—— 免费体验 OB Cloud Text2SQL 数据查询
数据库·sql·ai·oceanbase·分布式数据库·向量·text2sql
Stark、3 小时前
【MySQL】多表查询(笛卡尔积现象,联合查询、内连接、左外连接、右外连接、子查询)-通过练习快速掌握法
数据库·后端·sql·mysql
yqcoder3 小时前
Redis 的应用场景
数据库·redis·缓存