2013-12-09 75 views
2

下面的查詢的關係代數表達式是什麼?我無法找到「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; 

回答

10

這個任務需要一點創造力,而不是逐字翻譯。

查看此頁面發生了什麼?首先,我們離開了加入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的行,所以查詢只是說:「讓所有沒有借用任何書籍的人」。

措辭這樣的任務,寫的關係代數表達式很簡單:

  • 讓我們的讀者和book_borrow的自然連接,這必將帶來不必要的行,誰借過書的人的名字。
  • 然後只從這些人中減去這些人,結果就是那些沒有借書的人。

這是,釋放我的乳膠:

故事的道德:儘管作爲歐文指出,有最純粹的形式關係代數沒有空(因爲關係代數建立在一階邏輯之上),我們並不總是需要它來表達缺少的東西;基本操作員可以表示左連接;發明左連接以提高計算效率:您可以很容易地看到如何進行左連接和選擇空值更加實用。

+2

左連接不可能是關係代數(的最純粹形式)的一部分,因爲左連接按定義在其結果中引入(可能的)空值。 RA可以表達數據庫中某些其他屬性未知的事物(標識屬性),但這需要兩個不同的RA關係,並且不能很好地映射到每個SQL的單個表中。 –

+2

另外,如果你已經指出了SQL表中重複的列名'cardid'的問題,那將會更令人滿意。這是RA中不可能實現的另一個「特徵」。否則,+1爲「稍微」更有幫助的答案。 –

2

Null不是一個值。

Ergo它不是關係數據模型的一部分。

Ergo關係代數(如果它僞裝成真正的關係型)不能也沒有表達無效性的方法。