數據庫原理

什麼是數據庫?

數據庫是一個以某種有組織的方式存儲的數據集合。也就是:保存有組織數據的容器(一個文件或一組文件)sql

爲何咱們須要數據庫?

毫無疑問,數據庫是用來存儲數據的。咱們對excel確定不會陌生,excel也是用來存儲數據。那既然有excel這樣很是好用的軟件了,爲何須要數據庫呢??數據庫

  • excel存儲的數據量太少了。因爲咱們網絡發展,excel的存儲量遠遠不能支撐咱們的需求。
  • excel數據沒法多人共享。excel只是一個單一的文件,只能是當前的用戶使用並修改。
  • 數據安全性。對excle數據的修改是很隨意的。

數據庫就解決了上面的問題,而且數據庫以特殊的機制管理數據文件,對數據有極高的讀寫速度,大大超過了操做系統對常規文件的讀寫速度。數組

數據庫系統的組成

數據庫系統由三個層次組成:安全

  • 數據庫(dataBase)微信

    • 存放數據的倉庫,按照必定的格式(有組織的方式)進行儲存
  • 數據庫管理系統(dataBase Manager System)網絡

    • 創建、管理、維護數據庫的系統軟件
  • 數據庫應用系統(dataBase Application System)數據結構

    • 使用到數據庫技術的應用軟件

這裏寫圖片描述


數據描述與數據模型

理解數據描述

咱們在現實生活中描述一個事物是很是簡單的,看到「一棵樹」,就說是「一棵樹」性能

但怎麼把「一棵樹「在計算機描述起來呢??計算機只識別0和1」一棵樹「是不能直接存儲到計算機上的學習

因而乎,咱們就把」一棵樹「抽象出來,造成信息世界的概念模型。而後將概念模型的形式化成是DBMS支持的數據模型,存儲在計算機中編碼

簡單來講:數據描述就是將現實世界中的實物抽象出來,造成概念模型。把概念模型的形式轉換成是DBMS支持的類型,而後存儲到計算機中!


理解數據模型

數據模型主要用來描述數據!上邊已經說了,當咱們想在計算機上存儲現實事物的數據時,須要先抽象成概念模型。將概念模型轉換成DBMS支持的數據模型,就能夠把事物存儲到計算機中!

數據模型通常由三個部分組成:

  • 數據結構(對象與對象之間的關係)
  • 數據操做(增刪改查)
  • 完整性約束(限定數據是有必定規則的,好比:年齡不能爲負數)

數據模型也經歷了一個發展階段:

①:層次模型,是一種樹型(層次)結構來組織數據的數據模型。

這裏寫圖片描述

優勢:

  • 結構清晰,容易理解
  • 節點之間聯繫能夠經過指針來實現,查詢效率高

缺點:

  • 對於非層次結構的數據,表示起來很是麻煩,不直觀!

②:網狀模型, 是用有向圖結構來組織數據的數據模型

這裏寫圖片描述

優勢:

  • 很是靈活,更能直接地描述現實世界的事物

缺點:

  • 結構複雜,很是難維護

③:關係模型,是一種用二維表格結構表示數據及數據之間聯繫的數據模型。

關係模型是咱們如今用得最多的數據模型。

優勢:

  • 數據結構簡單、清晰。不管實體仍是實體集,都用相對應的二維表來表示!
  • 有嚴格的數學理論根據。各類關係運算(後面會講到)

缺點:

  • 查詢效率比非關係模型查,尤爲是多表查詢的時候!

術語(基本概念)

咱們對照着課程關係表來說解吧:

實體(Entity)

客觀存在並可相互區別的事物稱之爲實體。能夠當作是Java類

例子:(課程關係表)就是一個實體。


屬性(Attribute)

實體所具備的某一特性稱之爲屬性。能夠當作是Java類的成員變量。屬性在數據庫中又稱爲字段(或者是列)

例子:(課程名),(課程號)、(學時)就是屬性名。


元組

除含有屬性名所在的行以外的其餘行稱之爲元組。

下面的每一行數據都稱之爲元組
(C401001 數據結構 70)
(C401002 操做系統 80)
(C402001 計算機原理 60)


碼(Key)

碼也被稱做是關鍵字。它能夠惟一標識一個實體

候選碼和主碼:

  • 候選碼:若是一組屬性集能惟一地標識一個關係中的元組而又不含有多餘的屬性,則稱該屬性集爲該關係的候選碼 。(候選碼可能不止有一個
  • 主碼:用戶選定的那個候選鍵稱爲主鍵

例子:郵寄地址(城市名,街道名,郵政編碼,單位名,收件人)

它有兩個候選鍵:{城市名,街道名} 和 {街道名,郵政編碼}

若是我選取{城市名,街道名}做爲惟一標識實體的屬性,那麼{城市名,街道名} 就是主碼


關係模式

關係名和其屬性集合的組合稱之爲關係模式

關係模式例子:課程關係表(課程號,課程名,學時)

提示:關係模型就是關係模式組成的集合


關係模型要求元組的每個份量都是原子性的,也就是說,它必須屬於某種元素類型,如Integer、String等等,不能是列,集合,記錄,數組!

域就表明着該元組中每一個份量的類型,從上面的圖咱們能夠看出,它的域是這樣的:課程號:string,課程名:string,學時:int


數據庫體系內部結構

數據庫的體系內部結構咱們能夠分爲三層:

  • 外模式
  • 邏輯模式
  • 內模式

三級模式的位置:

這裏寫圖片描述

三級模式的做用:

這裏寫圖片描述

邏輯模式

邏輯模式是對數據庫所有數據的總體邏輯結構的描述

例子:如今我有一個數據庫,操做權限、角色、用戶之間的關係

因而有了如下的關係模式

  • 權限關係(權限編號,權限名稱,權限描述)
  • 角色關係(角色編號,角色名稱,角色描述)
  • 用戶關係(用戶編號,用戶名稱,用戶密碼)

在數據庫中全部關係模式的集合就組成了邏輯模式!


外模式

外模式是對數據庫用戶能看見和使用的局部數據邏輯結構的描述,是與某一應用有關的數據的邏輯表示

外模式是能夠有多個的,外模式是用戶和DBAS的接口,是對局部邏輯結構的描述!

當用戶應用程序只須要顯示用戶名稱和密碼時:

  • 用戶關係(用戶名稱,用戶密碼)

在數據庫中操做局部邏輯結構就稱做爲外模式


內模式

內模式是對數據庫表物理存儲結構的描述。它定義了數據的內部記錄類型、記錄尋址技術、索引和文件的組織方式及數據控制方面的內容

這裏寫圖片描述


DB內部體系結構的兩級映像

兩級映像分別是:

  • 外模式和邏輯模式的映像
  • 邏輯模式和內模式的映像

這裏寫圖片描述

提出兩級映射的概念有什麼用呢?爲何須要有這兩級映像呢??

  • 當數據庫的邏輯模式結構因某種緣由修改時,只要沒有改變邏輯模式中與外模式定義有關的屬性及與其關係模式名的隸屬關係,就可以使外模式保持不變,從而不需修改應用程序
  • 當數據庫的內模式因爲某種緣由要修改時,可經過對邏輯模式與內模式之間的映象的修改,使邏輯模式儘量地保持不變,實現內模式的改變儘量地不修改應用程序。

也就說:在改變內部結構的時候,只要不會觸及外部的數據時,外部的數據並不須要作改變。兩級映像概念的提出也就是程序中耦合的問題!


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

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

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

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


學習大綱

這裏寫圖片描述

笛卡爾積

什麼是笛卡爾積?

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

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

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

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

笛卡爾積的產生過程

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

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

這裏寫圖片描述

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

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列爲相同【這就是天然鏈接】


若是文章有錯的地方歡迎指正,你們互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同窗,能夠 關注微信公衆號:Java3y
相關文章
相關標籤/搜索