当前位置: 首页 > article >正文

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

目录

一,分支语句 IF...ELSE

二,多路分支函数 CASE

1,简单CASE函数

2,CASE搜索函数

三,循环语句 WHILE

 四,检测语句 IF...EXISTS


 

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

  1. 分支语句 IF...ELSE
  2. 循环语句 WHILE
  3. 多路分支函数 CASE
  4. 检测语句 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的成绩转换为等级制成绩。

  1. A:90分以上
  2. B:80分以上
  3. C:70分以上
  4. D:60分以上
  5. 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的成绩转换为等级制成绩。

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

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

三,循环语句 WHILE

语法如下:

WHILE 条件表达式
{SQL语句 | 语句块}

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

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

  1. BREAK:强制结束循环,即使循环条件为TRUE。
  2. 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 '没选课'

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


http://www.kler.cn/a/452708.html

相关文章:

  • Java旅程(五)Spring 框架与微服务架构 了解 JVM 内部原理和调优
  • c++ 类似与c# 线程 AutoResetEvent 和 ManualResetEvent的实现
  • Cesium材质——Material
  • AIGC:生成图像动力学
  • mongodb和Cassandra
  • linux下各文件类型与作用
  • 常用的 JVM 调优的参数
  • 【C++多重类循环依赖问题】基于class前向声明与类定义和实现分离的解决方案与分析
  • 解决 Docker 中 DataLoader 多进程错误:共享内存不足
  • ES 集群 A 和 ES 集群 B 数据流通
  • 【数据分析】似然和极大似然估计
  • SQLSERVER、MYSQL LIKE查询特殊字符和转义字符相同与不同
  • 用Python开发高级游戏:实现3D迷宫游戏
  • 【Ubuntu】如何轻松设置80和443端口的防火墙
  • 如何使用Windows快捷键在多显示器间移动窗口
  • Git 代理配置——克隆仓库时遇到 OpenSSL SSL_ERROR_SYSCALL 的解决方案
  • 详解Ollama api (Windows环境)
  • 【QT开发自制小工具】PDF/图片转excel---调用百度OCR API接口
  • 【问题实录】服务器ping不通win11笔记本
  • 【每日学点鸿蒙知识】挖空样式、解密库性能问题、按钮下拉列表弹窗、Scroll组件回调事件问题、判断当前时间之后方法
  • wordpress网站用token登入开发过程
  • Idean 处理一个项目引用另外一个项目jar 但jar版本低的问题
  • 3D几何建模引擎Parasolid功能解析
  • dify的ChatFlow自定义上传图片并通过HTTP请求到SpringBoot后端
  • STM32F407 | Embedded IDE01 - vscode搭建Embedded IDE开发环境(支持JLINK、STLINK、DAPLINK)
  • DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(1)