下面的查詢的關係代數表達式是什麼?我無法找到「Is Null」的表達方式。「is null」的關係代數表達式
SELECT reader.name
FROM reader LEFT JOIN book_borrow ON reader.cardid = book_borrow.cardid
WHERE book_borrow.cardid Is Null;
下面的查詢的關係代數表達式是什麼?我無法找到「Is Null」的表達方式。「is null」的關係代數表達式
SELECT reader.name
FROM reader LEFT JOIN book_borrow ON reader.cardid = book_borrow.cardid
WHERE book_borrow.cardid Is Null;
這個任務需要一點創造力,而不是逐字翻譯。
查看此頁面發生了什麼?首先,我們離開了加入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),鮑勃借來一個(ID 5),因爲他已經借了查理又在他的book_borrow領域NULL沒有。查詢然後繼續只提取book_borrow.cardid爲NULL的行,所以查詢只是說:「讓所有沒有借用任何書籍的人」。
措辭這樣的任務,寫的關係代數表達式很簡單:
這是,釋放我的乳膠:
故事的道德:儘管作爲歐文指出,有最純粹的形式關係代數沒有空(因爲關係代數建立在一階邏輯之上),我們並不總是需要它來表達缺少的東西;基本操作員可以表示左連接;發明左連接以提高計算效率:您可以很容易地看到如何進行左連接和選擇空值更加實用。
Null不是一個值。
Ergo它不是關係數據模型的一部分。
Ergo關係代數(如果它僞裝成真正的關係型)不能也沒有表達無效性的方法。
左連接不可能是關係代數(的最純粹形式)的一部分,因爲左連接按定義在其結果中引入(可能的)空值。 RA可以表達數據庫中某些其他屬性未知的事物(標識屬性),但這需要兩個不同的RA關係,並且不能很好地映射到每個SQL的單個表中。 –
另外,如果你已經指出了SQL表中重複的列名'cardid'的問題,那將會更令人滿意。這是RA中不可能實現的另一個「特徵」。否則,+1爲「稍微」更有幫助的答案。 –