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

news/2024/12/24 9:29:37 标签: 数据库, 学习

目录

一,分支语句 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.niftyadmin.cn/n/5797647.html

相关文章

VLP-16 安装全流程

一 、驱动安装 1.安装ROS依赖 sudo apt install ros-noetic-velodyne 2.安装VLP驱动 mkdir -p catkin_velodyne/src cd catkin_velodyne/src git clone https://github.com/ros-drivers/velodyne.git 这里因为ros2问世很久了&#xff0c;所以它的master其实是ros2版&#…

stm32引脚模式GPIO

问题引入 stm32f103定时器的引脚GPIO_MODE_OUTPUT_PP和GPIO_MODE_AF_PP有什么区别&#xff1f; 在STM32F103微控制器中&#xff0c;使用定时器时涉及到的GPIO配置主要有两种模式&#xff1a;GPIO_MODE_OUTPUT_PP和GPIO_MODE_AF_PP。这两种模式的主要区别在于它们的用途和工作…

EKF异常状态自检

https://wenku.csdn.net/column/25p1jkf4vz https://www.zhihu.com/question/293038308/answers/updated https://zhuanlan.zhihu.com/p/12011086094 常用数据分析方法&#xff1a;方差分析及实现&#xff01;-腾讯云开发者社区-腾讯云 方差分析的七种类型_双因素方差分析 自变…

汽车IVI中控开发入门及进阶(46):FFmpeg

概述: FFmpeg 是领先的多媒体框架,能够解码、编码、 转码、复用、解复用、流、过滤和播放 几乎所有人类和机器创建的东西。它支持最模糊的古老格式,直到最前沿。无论它们是由某个标准委员会、社区还是公司设计的。它还具有高度的可移植性:FFmpeg 在各种构建环境、机器架构…

【Laravel】接口的访问频率限制器

Laravel 接口的访问频率&#xff0c;你可以在 Laravel 中使用速率限制器&#xff08;Rate Limiter&#xff09;。以下是一个详细的步骤&#xff0c;展示如何为这个特定的 API 路由设置速率限制&#xff1a; 1. 配置 RouteServiceProvider 首先&#xff0c;确保在 App\Provide…

Strip Map和Wafer Map的一些小科普

一、Strip Map和Wafer Map Strip Map和Wafer Map在半导体行业中都是重要的工具,它们各自有不同的应用和特点: 1. Strip Map: - Strip Map主要应用于半导体后道基板上的每个芯片的良率实时追溯。它从Die Bond贴芯片到Wire Bond、Marking为止的过程中实时处理及管理设备上传…

人工智能ACA(五)--深度学习基础

一、深度学习概述 1. 深度学习概念 1-1. 深度学习基本概念 深度学习是机器学习的一个分支基于人工神经网络&#xff08;模仿人脑结构&#xff09;通过多层网络自动学习特征能够处理复杂的模式识别问题 1-2. 深度学习的优点与缺点 优点 强大的特征学习能力可以处理复杂问题…

第四章补充:线性代数(B站:一高数)

视频1&#xff1a;行列式的入门 原视频&#xff1a;线性代数&#xff01;启动&#xff01;从零开始到精通|第一集_哔哩哔哩_bilibili 一、二阶与三阶行列式 小学我们就接触过鸡兔同笼&#xff0c;这个问题让我们第一次接触到了方程组的思想。我们可以将它抽象成一个二元一次…