使用“不存在”与空关系测试混淆

Posted

技术标签:

【中文标题】使用“不存在”与空关系测试混淆【英文标题】:confusion with empty relations test using 'not exitst' 【发布时间】:2017-02-12 03:16:54 【问题描述】:

我正在阅读 Hank Korth 的数据库系统概念。这本书指出以下列出了所有参加过所有课程的学生 在生物系。

select distinct S.ID, S.name
from student as S
where not exists (
        (
            select course id
            from course
            where dept name = 'Biology'
            )           
        except          
        (
            select T.course id
            from takes as T
            where S.ID = T.ID
            )
        );

student(ID, name, dept name, tot cred)
course(course id, title, dept name, credits)
takes(ID, course id, sec id, semester, year, grade)

但是,据我了解,最后一个子查询会找到所有至少上一门课程的学生,并且通过从第一个子查询中减去,我们会减去学生当前上的所有生物学课程,所以我们将剩下没有任何学生参加的生物学课程(如果有的话)。然后,当我们的所有学生证“不存在”时,我们正在寻找没有参加那些找到的生物学课程的学生证,而且他们可以参加除生物学。但这并没有给出正在参加生物学系所有课程的学生名单。有人可以解释一下吗? 请注意:如果“不存在”来自this,我确实了解其用途 网站,但我没有得到书的例子。

【问题讨论】:

请编辑您的帖子并删除标签(mysqloracle)不适用于您的问题。您真正使用什么数据库系统? 【参考方案1】:

我认为您缺少的是 NOT EXISTS 子查询独立执行,对于外部查询返回的 每个 行。

注意它是一个 correlated 子查询。有来自外部查询S.ID 的列的引用。

每次执行子查询时都会传入一个 S.ID 值。因此,如果学生正在学习生物系的所有课程,则子查询中的EXCEPT 操作将导致一个空集。 NOT EXISTS 将评估为 TRUE。但是如果子查询返回一行,那么至少有一个学生没有参加的生物学课程。

【讨论】:

以上是关于使用“不存在”与空关系测试混淆的主要内容,如果未能解决你的问题,请参考以下文章

(null) <null> 与空 及其字符串的判断

与嵌套选择混淆性能增益 * 不存在

PG undefinedtable 错误关系用户不存在

Rails 3.0.3 黄瓜测试中不存在关系“delayed_jobs”

核心数据测试关系的存在

从 [x=1.0][y=1.0] 到 [x=3.0][y=3.0] 的关系的时间值不存在