【问题标题】:How to represent "not exists" in relational algebra?如何在关系代数中表示“不存在”?
【发布时间】:2010-09-17 18:47:17
【问题描述】:

如何在关系代数中表示 SQL“不存在”子句?

【问题讨论】:

  • “代表”是什么意思? NOT EXISTS 表达式(不是子句)是布尔表达式,但 RA 表达式是关系值的。使用足够多的单词、句子和对部分示例的引用来清楚完整地表达你的意思。
  • 有很多 RA(关系代数)。它们在运算符甚至关系是什么方面都不同。给你的定义和参考。例如教科书名称、版本和页码。嵌套的 RA 调用形成了一种编程语言。因此,即使您实际上并没有运行代码,也要尽可能多地提供minimal reproducible example。但是——谷歌“在线运行关系代数”。请展示你能做的部分。请参阅How to Ask、其他help center 链接、点击谷歌搜索“stackexchange 作业”和投票箭头鼠标悬停文本。 PS 在 SQL 中用 JOIN 替换 WHERE EXISTS 是一个常见问题。
  • 这能回答你的问题吗? Relational algebra for banking scenario

标签: sql relational-algebra relational


【解决方案1】:

SQL NOT EXISTS 构造可以在关系代数中由反连接 表示。

两个关系LR 的反连接L ▹ R 选择不与R 中的任何元组连接的L 元组。可以用集差和左半连接来定义如下:

L ▹ R = L - (L ⋉ R).

【讨论】:

  • 这并没有解释你的表达式与 SQL 表达式有什么关系,或者你在什么意义上“表示不存在”。这个问题本身很糟糕,因为它没有解释“代表”。特别是 NOT EXISTS 表达式(不是子句)是布尔表达式,但 RA 表达式是关系值。
【解决方案2】:

我认为您正在寻找 existential quantifier (∃),然后您可以否定 (~∃)。

对评论的回应:我不记得我的大部分关系代数了,但如果我要尝试一下,我会猜测以下内容:σ∃ σ(Y)(S)。或者可能是 π∃π(Y)(S);我不太记得你是否想要选择或投影。

【讨论】:

  • 如果有 select * from S where exists(select * from Y);我怎么能用关系代数写出来
  • @sudh:评论区无法准确显示我的回复,请看我回复的附录。
  • 我 99% 确定存在量词不是关系代数的一部分......它没有出现在 RA 维基百科页面上的任何地方,我也没有在我的教科书中看到它,或在讲座中。
  • 存在量词,是关系代数的一部分。它在我的教科书中: Ramez Elmasri 的数据库系统(全球版,第 6 版,第 173 页)。但是,我认为重写查询以完全摆脱 EXISTS 操作会更容易。 (请参阅我的答案)。
  • 这是关系微积分而不是关系代数。
【解决方案3】:

就我而言,我通过重写查询解决了这个问题,

SELECT *
FROM contactperson
WHERE EXISTS(
   SELECT *
   FROM person
   WHERE contactperson.personId = person.id)

到:

SELECT *
FROM contactperson
WHERE personId = (
   SELECT id
   FROM person
   WHERE contactperson.personId = person.id)

它返回相同的结果,并且使用连接更容易重写为关系代数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多