數據庫關係運算

前言

前面已經說了數據系統的概述了,關係模型是目前用得最多的數據模型,其中一個優勢就是:有嚴格的數學理論根據。本文就是來說解數據庫中的各類關係運算的!本文不作數學概念的深刻,只要理解相關的概念便可!sql

爲何咱們要學習數據庫關係運算?

學習和理解關係運算的機理,對於理解關係數據庫中的數據查詢機制有十分重要的意義。數據庫

咱們可能知道多表查詢的時候要消除重複多餘的數據,那重複多餘的數據怎麼產生的呢??WHERE字句又是怎麼篩選數據的呢??這些問題咱們在關係運算中能夠找到答案的。markdown

學習數據庫的關係運算,會讓咱們明白SQL語句是怎麼執行的,是經過什麼手段讓咱們獲得想要的結果。性能


學習大綱

這裏寫圖片描述

笛卡爾積

什麼是笛卡爾積?

笛卡爾積簡單來講就是兩個集合相乘的結果學習

爲何查詢數據庫會出現笛卡爾積

前面的博文已經說了,關係模型是關係模式的集合spa

數據庫中的兩張表就至關於兩個集合,當咱們使用SELECT語句查詢數據的時候,DBMS內部就是以集合相乘的運算得出結果code

笛卡爾積的產生過程

咱們發現:笛卡爾積的基數是每一個集合的元組相乘
這裏寫圖片描述圖片

得出來的數據內容是難以符合現實中的實際狀況的數學

這裏寫圖片描述

例子

爲了更好地看見效果,我都會以實際的SQL語句來看效果,而後說明問題的。it

emp表的記錄有14條:

這裏寫圖片描述

dept表有4條記錄:

這裏寫圖片描述

咱們來看看SMITH,在emp表中,他只在20部門。

這裏寫圖片描述

但在兩張表查詢後,十、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列爲相同【這就是天然鏈接】

相關文章
相關標籤/搜索