关系代数表达式为“is null”

时间:2013-12-09 21:39:16

标签: null relational-algebra

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

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

2 个答案:

答案 0 :(得分:13)

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

此查询中发生了什么?首先,我们将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

我们可以看到爱丽丝已经借了两本书(ids 1和5),鲍勃借了一本书(身份证5),查理在他的book_borrow字段中得到了NULL,因为他没有借用。然后查询继续只获取book_borrow.cardid为NULL的行,因此查询只是说:“让所有没有借过任何书籍的人”。

像这样描述任务,编写关系代数表达式很简单:

  • 让我们自然地加入读者和book_borrow,这将产生不必要的行,借用任何书籍的人的名字。
  • 然后从所有人的集合中减去这些人,结果就是那些没有借书的人。

在这里,释放我的乳胶:

π(name){ π(name, carddid){Reader} - π(name, cardid){Reader join Book_borrow} }

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

答案 1 :(得分:3)

Null不是值。

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

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