前言
前面已經說了數據系統的概述了,關系模型是目前用得最多的數據模型,其中一個優點就是:有嚴格的數學理論根據。本文就是來講解數據庫中的各種關系運算的!本文不做數學概念的深入,只要理解相關的概念即可!
為什么我們要學習數據庫關系運算?
學習和理解關系運算的機理,對於理解關系數據庫中的數據查詢機制有十分重要的意義。
我們可能知道多表查詢的時候要消除重復多余的數據,那重復多余的數據怎么產生的呢??WHERE字句又是怎么篩選數據的呢??這些問題我們在關系運算中可以找到答案的。
學習數據庫的關系運算,會讓我們明白SQL語句是怎么執行的,是通過什么手段讓我們得到想要的結果。
學習大綱
笛卡爾積
什么是笛卡爾積?
笛卡爾積簡單來說就是兩個集合相乘的結果。
為什么查詢數據庫會出現笛卡爾積
前面的博文已經說了,關系模型是關系模式的集合。
數據庫中的兩張表就相當於兩個集合,當我們使用SELECT語句查詢數據的時候,DBMS內部就是以集合相乘的運算得出結果
笛卡爾積的產生過程
我們發現:笛卡爾積的基數是每個集合的元組相乘!
得出來的數據內容是難以符合現實中的實際情況的
例子
為了更好地看見效果,我都會以實際的SQL語句來看效果,然后說明問題的。
emp表的記錄有14條:
dept表有4條記錄:
我們來看看SMITH,在emp表中,他只在20部門。
但在兩張表查詢后,10、20、30、40部門他都在了!!我們再觀察56條數據,發現每個人都有4個部門,這樣的數據是不合理的!!
再回到初衷,我們查詢兩張表的目的是什么??在查詢員工信息的同時,也能知道員工的部門名稱是什么!!!所以,我們查詢的記錄數是不應該有56條這么多的。。我們查詢的記錄數應該是員工表的記錄數,也就是14條而已!
我們再來分析:emp表中有deptno字段,dept表中也有deptno字段!而且發現,emp表中的deptno字段的取值范圍是由dept表中deptno字段來決定的!!!
所以,我們可以使用等值連接(emp.deptno=dept.deptno)來消除笛卡爾積,這樣就達到我們的目的了!
基於傳統集合理論的關系運算
在Oracle上,操作集合的語法提供了4個關鍵字:
- UNION(並集,重復的元組不顯示)
- UNION ALL(並集,重復的元組也會顯示)
- MINUS(差集)
- INTERSECT(交集)
並
顯示查詢結果的全部信息,消除重復的元組
例子
查詢所有辦事員和經理的信息
SELECT * FROM emp WHERE job = 'MANAGER' UNION SELECT * FROM emp WHERE job = 'CLERK';
注意:使用UNION並操作,比使用關鍵字OR的性能要好!
交
返回查詢結果相同的部分
例子
查詢10部門的信息
SELECT * FROM dept INTERSECT SELECT * FROM dept WHERE deptno = 10;
(全部部門和部門10只有部門10是相同的,所以最后返回的是部門10的結果)
差
返回的查詢結果是
例子
SELECT * FROM dept MINUS SELECT * FROM dept WHERE deptno = 10;
關系代數特有的關系運算
投影
投影的運算過程:
首先按照j1,j2,…,jk的順序,從關系R 中取出列序號為j1,j2,…,jk(或屬性名序列為Aj1,Aj2,…,Ajk )的k 列,然后除去結果中的重復元組,構成一個以Aj1,Aj2,…,Ajk為屬性順序的k 目關系。
簡單來說:取出一個查詢結果中某某列,並消除重復的數據,這就是投影!
- 投影是從列的角度進行的運算
- 投影的下標可是列序號,也可是列屬性名
例子
查詢出所有部門的編號
SELECT deptno FROM dept;
查詢時的過程:先查詢得出dept表的所有結果,再通過投影運算只提取”deptno”的列數據,如果 SELECT 后邊跟的是”*”,那么就是投影全部數據!
選擇
使用比較運算符、邏輯運算符,挑出滿足條件的元組,運算出結果!
例子
查詢出工資大於2000的員工的姓名
SELECT ename FROM emp WHERE sal > 2000;
過程:首先查詢出emp表的所有結果,使用選擇運算篩選得出工資大於2000的結果,最后使用投影運算得出工資大於2000員工的名字!
除運算
除運算的實際應用我還沒想明白~~~如果有朋友知道除運算能夠用在數據庫的哪處,請告訴我一聲哈。。
我們也了解一下除運算的過程吧:關系R有ABCD,關系S有CD,首先投影出AB(因為S有CD),再用投影出來AB的結果和關系S做笛卡爾積運算。如果做的笛卡爾積運算記錄在R關系中找到相對應的記錄,那么投影的AB就是結果了!
連接運算
連接運算其實就在笛卡爾積運算的基礎上限定了條件(某列大於、小於、等於某列),只匹配和條件相符合的,從而得出結果!
自然連接
自然連接就是一種特殊的連接運算,它限定的條件是【某列等於某列】。自然連接我們經常使用到。消除笛卡爾積其實就是自然連接了!
例子
SELECT * FROM emp, dept WHERE dept.deptno = emp.deptno;
設定將dept表的deptno列和emp的deptno列為相同【這就是自然連接】