以下查询的关系代数表达式是什么?我找不到“Is Null”的表达。
SELECT reader.name
FROM reader LEFT JOIN book_borrow ON reader.cardid = book_borrow.cardid
WHERE book_borrow.cardid Is Null;
答案 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的行,因此查询只是说:“让所有没有借过任何书籍的人”。
像这样描述任务,编写关系代数表达式很简单:
在这里,释放我的乳胶:
故事的道德:尽管如Erwin所指出的那样,在最纯粹的关系代数形式中没有空(因为关系代数建立在一阶逻辑上),我们并不总是需要它来表达缺乏东西;左连接可以由基本运算符表示;左连接是为了提高计算效率而发明的:你可以很容易地看到采用左连接和选择空值是多么实用。
答案 1 :(得分:3)
Null不是值。
因此,它不是数据关系模型的一部分。
Ergo关系代数(如果它假装是真正的关系代数)不能也不会有表达Null-ness的方法。