【问题标题】:relational algebra expression for "is null""is null" 的关系代数表达式
【发布时间】:2013-12-09 21:39:15
【问题描述】:

下面查询的关系代数表达式是什么?我找不到“Is Null”的表达方式。

SELECT reader.name
FROM reader LEFT JOIN book_borrow ON reader.cardid = book_borrow.cardid
WHERE book_borrow.cardid Is Null;

【问题讨论】:

  • 什么版本的 RA?它是否有 null,它的运营商如何对待它?用 RA“of”或“for”SQL 准确解释您和您的班级/参考的含义——关系不是表格。

标签: null relational-algebra


【解决方案1】:

这项任务需要一点创造力,而不是逐字翻译。

在这个查询中发生了什么?首先,我们在阅读器上离开了加入 book_borrow。记住definition:即使 ON 子句不匹配最右侧表中的任何行,连接仍将返回单行,这样它在右侧表的字段中包含 NULL。我们的表格如下所示:

reader.name | reader.cardid | book_borrow.cardid | book_borrow.book_id
Alice       | 1             | 1                  | 1
Alice       | 1             | 1                  | 5
Bob         | 2             | 2                  | 5
Charlie     | 3             | NULL               | NULL

我们可以看到 Alice 借了两本书(id 为 1 和 5),Bob 借了一本(id 5),而 Charlie 在他的 book_borrow 字段中得到了 NULL,因为他没有借任何书。然后查询继续仅获取 book_borrow.cardid 为 NULL 的行,因此查询只是说:“获取所有没有借过书的人”。

像这样表达任务,写关系代数表达式很容易:

  • 让我们自然地连接 reader 和 book_borrow,这将产生不需要的行,即借书人的姓名。
  • 然后从所有人的集合中减去这些人,结果就是没有借书的人集合。

在这里,释放我的乳胶:

故事的寓意:尽管正如 Erwin 所指出的,在最纯粹的关系代数形式中没有 null(因为关系代数建立在一阶逻辑之上),但我们并不总是需要它来表达缺乏某物;左连接可以用基本运算符表示;左连接是为了提高计算效率而发明的:您可以很容易地看到使用左连接和选择空值是多么实用。

【讨论】:

  • 左连接不可能是关系代数(最纯粹的形式)的一部分,因为左连接根据定义会在其结果中引入(可能的)空值。 RA 可以表达(识别属性)在数据库中某个其他属性未知的事物,但这需要两个不同的 RA 关系,并且不能很好地映射到 SQL 中的单个空表。
  • 另外,如果您指出SQL表中重复列名'cardid'的问题会更令人愉快。这是 RA 中不可能的另一个“功能”。否则,+1 以获得“稍微”更有帮助的答案。
  • 我可以澄清一下关系代数,为什么两个投影都是name, cardid?不是应该是project reader.cardid(READER) - project book_borrow.cardid(READER join BOOK_BORROW)吗?
  • @datanewbie96 最后我们要输出名称,所以我们需要在操作时保留名称。投影以便它像您一样只保留 cardid 可以完美地工作,但会丢失信息。
【解决方案2】:

Null 不是值。

因此它不是数据关系模型的一部分。

Ergo 关系代数(如果它假装是真正的关系)不能也没有表达 Null-ness 的方法。

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    相关资源
    最近更新 更多