SQL刷题:行与行的比较

题目

在这里插入图片描述
有这样一张score表,要查询出课程号为02的成绩大于课程号01的成绩的学生学号。通过观察应该是学号为‘01’,学号‘03’因为是两个成绩相等都是80分所以不符合,而02和04的同学因为没有学01课程所以也不符合。

解法思路

行与行之间的比较可以考虑关联子查询,代码如下:

SELECT A.学号
  FROM score A
 WHERE A.课程号='02'
   AND A.成绩>(SELECT B.成绩
  				FROM score B
 			   WHERE B.学号=A.学号
   				 AND B.课程号='01')

如果不考虑行与行之间的比较的话,可以考虑join,将行与行的比较转换成列与列的比较,列与列的比较就简单许多,用where子句就行了。

SELECT T2.学号
  FROM (SELECT * FROM score A WHERE A.课程号='01') T1
  JOIN (SELECT * FROM score B WHERE B.课程号='02') T2
	ON T1.学号=T2.学号
 WHERE T1.成绩<T2.成绩  						  

其实这里我觉得应该用join会比较好,网上很多答案都是用left join,但是用left join其实也不会出错。虽然会出现类似于如下的空值(下表来源不同,只为说明理由举例),如06号学生并没有学02的课程,当执行06号的where子句时,相当于执行

WHERE T1.成绩<null

但是null是不能用比较谓词的,比如 <、>、<>这些都是无效的,返回值都是UNKNOW,既不是True,也不是False。这就是SQL的三值逻辑。即
True False Unknow,所以不会返回06号的同学学号。关于NULL可以讲解详细点的。

最后也可以考虑EXISTS子句:

SELECT A.学号
  FROM score A
 WHERE EXISTS(SELECT *
				FROM score B
			   WHERE A.学号=B.学号
				 AND A.课程号='01'
				 AND B.课程号='02'
				 AND A.成绩<B.成绩)

其实和关联子查询思想差不多。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以为您介绍一下 SQL Server 刷题的相关内容。SQL Server 是一种关系型数据库管理系统,用于存储和管理大量结构化数据。在刷题过程中,您可以通过解决一系列与 SQL Server 相关的问题来提高对其的理解和应用能力。 以下是一些常见的 SQL Server 刷题方向和相关问题: 1. SQL 基础知识: - 什么是 SQL Server?它有哪些特点和优势? - SQL Server 中的数据类型有哪些?它们分别用于存储什么类型的数据? - 如何创建数据库和表格? - 如何插入、更新和删除数据? - 如何使用 SELECT 语句查询数据? 2. 数据查询与筛 - 如何使用 WHERE 子句进行条件选? - 如何使用 ORDER BY 子句对查询结果进行排序? - 如何使用 GROUP BY 子句进行分组聚合操作? - 如何使用 HAVING 子句进行条件筛选(针对分组后的结果)? . 数据操作与修改: - 如何使用 UPDATE 语句修改表格中的数据? - 如何使用 DELETE 语句删除表格中的数据? - 如何使用 INSERT INTO 语句插入新的数据? 4. 数据连接与联结: - 如何使用 JOIN 连接多个表格? - 什么是内连接、外连接和交叉连接? - 如何使用子查询进行复杂的数据查询? 5. 数据聚合与统计: - 如何使用聚合函数(如 SUM、AVG、COUNT、MAX、MIN)进行数据统计? - 如何使用 GROUP BY 子句进行分组统计? - 如何使用 HAVING 子句进行条件筛选(针对分组后的统计结果)? 这些问题只是 SQL Server 刷题中的一部分,您可以根据自己的需求和水平选择适合的题目进行练习。同时,还可以参考 SQL Server 官方文档、教程和在线资源来深入学习和提高技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值