数据库除法的讲解和 sql 语句 not exist 实现

本文通过实例解析如何使用数据库除法解决查询选修了所有2学分课程的学生姓名问题。首先介绍了问题背景,然后详细探讨了代数和SQL语句两种解决方案,重点放在利用NOT EXISTS子句的SQL实现上。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

前天看到群里有人问了一个关于数据库查询的问题,问题大概如下:

基本表是s(学生表),c(课程表),sc(学生选课表),怎么查询选修了所有2学分课程的学生姓名。

问题解决

代数解决

此类问题应该用除法解决,用sc表取除以所有2学分的课程表,得到选修了所有2学分的学生学号,然后根据学生学号查询学生姓名。
表达式为:name(sc ÷ϭcredit=2(c)S)
该表达式有选择、除法、投影和连接操作。其中最主要的就是除法运算,这里就说说我对除法运算的理解。
设关系R除以关系S的结果为关系T,则T包含所有在R但不在S中的属性及其值,且T的元祖与S的元祖的所有组合都在R中,这里的除法可以变相理解为整除。只有被除数含有除数的全部,才可以纳进结果集中。如图所示,只有修了数学和语文才可以被整除,然后得出选修了所有课程的学生。

所以解答问题的思路,就是要先查询出课程号为2的所有课程,然后用课程表除以该结果,就得出了选修所有2学分课程的学号,然后与学生表连接,最后按姓名投影即可。

SQL语句解决

我这里采用了not exist 方法来解决,注意该子查询不返回任何结果集,只返回true.false. 
思路是上述问题可以转述为查询出没有不选择全部2学分课程的学生。
select name 
from s
where not exist(
     select *
     from c
    where credit = 2  and not exist (
           select * 
           from sc
          where sc.cno=c.cno and sc.sno=s.sno
)
)


### 回答1: 'NOT IN''NOT EXIST'是SQL语句中的两种条件操作符,用于查询符合某个条件的记录并检查其是否存在于另一个表中。其中,'NOT IN'用于从一个表中选出不匹配另一个表的记录,而'NOT EXIST'则用于查询一个表中不存在于另一个表中的记录。 ### 回答2: SQL语句NOT INNOT EXISTS是两种常用的条件查询方法,它们都用于在查询数据时过滤掉不必要的结果,但是它们又有一些区别。 首先,NOT IN操作符用于在WHERE子句中排除一个子查询所返回的结果集中的值,它的语法如下: SELECT column_name(s) FROM table_name WHERE column_name NOT IN (SELECT column_name FROM table_name WHERE condition); 这个语句检索出所有列出的列,除了在子查询中返回的值。其中,NOT IN操作符要求子查询返回一个结果集,否则运行时会出现错误。此外,NOT IN通常性能不是很高,因为在执行查询之前,它需要将子查询的结果集全部提取出来,然后再将主查询的结果集与其进行比较。 相比之下,NOT EXISTS用于过滤掉那些在子查询结果集中无法找到对应记录的行。NOT EXISTS的语法如下: SELECT column_name(s) FROM table_name WHERE NOT EXISTS (SELECT column_name FROM table_name WHERE condition); 这个语句检索出与子查询不匹配的行,因为当子查询返回空结果集时,NOT EXISTS将返回TRUE,表示指定的条件不存在,因此,它的运行效率比NOT IN要高一些。此外,NOT EXISTS在处理外连接时更加灵活,因为它不会使用外连接将数据组合在一起,因此,它更容易处理复杂的查询条件。 综上所述,NOT INNOT EXISTS都是用于过滤结果集的SQL操作符,但是在使用时需要根据具体情况来选择合适的操作符。当需要排除一个子查询返回的结果集中的值时,可以使用NOT IN,而当需要检查是否不存在与子查询匹配的行时,则应使用NOT EXISTS。 ### 回答3: SQL语句中的NOT INNOT EXISTS是用来比较查询结果指定值或结果集之间的差异。尽管它们的作用相似,但它们实际上是被用于不同的场景中。 在SQL查询语句中,NOT IN是一个比较运算符,用于指定一个查询结果集,其结果集包含查询条件指定的任何一个值。这种比较方式特别适用于已知在大数据集中排除特定值或一组值的情况。比如,我们需要查询在一个表中没有出现的某些值,则可以使用NOT IN语句。 另一方面,NOT EXISTS指令是一个布尔运算符,用于确定查询结果集如果为空时返回的逻辑真值。也就是说,如果指定的查询结果集为空,则NOT EXISTS将返回TRUTH值,否则,将返回FLASE值。这个命令通常用于过滤查询结果集中不存在满足特定查询条件的情况。例如,我们要查询不存在一本图书的作者,则可以使用NOT EXISTS语句。 因此,NOT INNOT EXISTS确实有相似的用途,它们都提供了一种简单的方式来限制结果集,来只包含需要的值。这就要求我们在实际应用中根据不同的查询场景,灵活地选择使用其中的一种方式。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值