關係代數 與數據庫有什麼關係, 來變個魔術

偶然間看到一句話,關係代數明白了,就沒有不會寫的SQL。讓我對曾經學過但早就不知道交給誰的“知識”,又重新燃起了興趣。下面以一個題切入

上面的公式,基於下面的圖的結果是什麼, R S 的左外,右外,全外連接的圖是什麼樣的。

乍看起來和數據庫有什麼關係,但這些其實是寫出複雜邏輯關係的SQL 的基礎。估計現在就已經有人在,Turn your nose up ,打個賭,看完或許會改變看法呢

首先我們先要確定的一個事情是 SQL 是具有關係代數,和關係演算的雙重特點的語言。關係代數,元祖關係演算,和域關係演算三種語言在表達能力上是等價的。其中會帶出來三個完整性,其中兩個完整性是必須的,實體完整性和參照完整性,這兩個可以理解爲我們平時的 主外鍵關係中的,帶有主鍵的表和帶有外鍵的表的“文雅的叫法”。

估計說到這裏有人不耐煩了,馬上上操作符

1 根據上面圖中 R S ,我們可以分析出 R(X.Y) S(Y,Z)爲什麼因爲R和S 主鍵有同類和異類,所以同類用Y 表示 不一樣的分別爲 X 和 Z

這可以通過對應我們的類似下面的查詢語句來表示

select A.X,A.Y,B.Y,B.Z

from A 

inner join B on A.Y=B.Y 

OK 先來一個魔術

上面這張圖等於

select  R.A3

 from R 

 inner join S on R.A1A2 = S.A1A2 and  S.A1 < 3  

上面這個語句的select 結果是 4 

是這樣的嗎  我們來逐一拆解這個圖裏面的公式

1 下圖的意思,僅僅是對S 集合的數據的過濾  1< 3 的意思是 S 表的第一列的值要小於3  那我們就先對S 進行了一個WHERE 的條件操作  選中的數據

({1,9,1},{2,1,8})並且投影的S的字段是 A1A2

2 剩下的除法,在關係代數的意思就是找到兩個集合中除號前面集合中與除號後面集合中不同的列,這裏就是 RA3, 所以上面的 select R.A3 就是我們最後要輸出的結果。並且前面的括號裏面要求投影的S字段是 A1A2

select  R.A3

 from R 

 inner join S on R.A1A2 = S.A1A2 and  S.A1 < 3  

這就是上面那個公式轉換下來的SQL 語句,上邊的公式所表達的也叫關係代數。

另外在數據庫中,不是所有的數據庫都支持所有的連接方式

內連接 inner join  外連接  left join  right join  或者叫left outer join  right outer join 基本上都是支持的,而full outer join的方式某些數據庫是不支持的。

那不支持FULL OUTER JOIN 的數據庫怎麼來處理

SELECT * FROM R
LEFT JOIN S ON R.A1A2 = S.A1A2 
UNION 
SELECT * FROM R
RIGHT JOIN S ON R.A1A2 = S.A1A2 

就可以達到上面圖中的效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章