數據庫基本原理(持續更新)

一.概述

1.什麼是數據庫

數據庫是數據的集合;是對現實中一個企業的建模;

2.數據庫管理系統

用來存儲和管理數據庫的一種系統軟件

3.爲什麼要用數據庫而不是文件

文件:文件是操作系統提供的最簡單的,最基本的存儲數據的機制,文件是沒有結構的,就是單純的字符流;

  • 數據庫可以通過DBMS直接進行很多操作,而文件的話只提供了簡單的操作,文件只能用文件系統提供的幾個函數,比如read,write
  • 當多個用戶併發訪問數據庫,文件要加鎖,而DBMS會幫你做
  • 文件不具有故障處理的能力,但是DBMS可以自動恢復
  • 訪問控制,文件只有可讀可寫可執行

4.一些基本術語

數據:是用來描述現實世界事物的符號
數據模型:用來描述數據的一種方法,可以理解爲數據結構
數據模式:用給定的數據模型來對特定企業進行描述;
這裏舉個例子:給定一個樹形結構,來對班級和學生進行描述;
在這裏插入圖片描述
這就是一種模式,它可以有很多實例:
在這裏插入圖片描述


關係 : 就是表
元組:表中的一行
屬性:表中的一列
三級模式:
在這裏插入圖片描述

  • 第一級:Physical Schema[物理模式]描述數據在磁盤上是怎麼存的,用的什麼索引,是按照哪個屬性的排序存儲的…
  • 第二級:Conceptal Schema [概念模式] 也叫作邏輯模式,描述數據的邏輯結構,在mysql中就是對錶的定義,比如用戶表裏面有姓名 varchar(10)這就是一種模式;
  • 第三極:外模式也是視圖層,一個數據庫可以有多個外模式,而這些外模式都是根據邏輯模式中的中的屬性算出來的; 外模式是保證數據庫安全性的一個有力措施。每個用戶只能看見和訪問所對應的外模式中的數據,數據庫中的其餘數據是不可見的。

兩級映射

  • 外模式/邏輯模式映像:一個DB只有一個模式,但可以有多個外模式。
    所以,對於每一個外模式,數據庫系統都有一個外模式/模式映像,它定義了這個外模式與模式的對應關係。外模式的描述中通常包含了這些映像的定義。
    當模式改變時(增加新的關係、新的屬性、改變屬性的數據類型等),由數據庫管理員對各個外模式/模式映像作相應的改變,可以使得外模式保持不變。而又由於應用程序應該是依據外模式編寫的,從而應用程序不必修改,這就保證了數據與程序的邏輯獨立性。

  • 邏輯模式/內模式映像:由上可知:一個DB只有一個模式,也只有一個內模式,所有模式/內模式映像是唯一的,它定義了數據全局邏輯結構與存儲結構之間的對應關係。
    當數據庫的存儲結構改變時(例如選用了另一個存儲結構),由數據庫管理員對模式/內模式映像作出相應的改變,可以使得模式保持不變,從而應用程序也不必改變。這就保證了數據和程序的物理獨立性。

二.數據模型

1.層次模型

在現實中很多事情都是有層次的,就是數據結構中的樹;
在數據庫中,層次模型用一種雙親子女關係來表示現實世界中,兩個不同記錄之間的一對多關係;
記錄:用來表達實體
:用來描述實體
在這裏插入圖片描述
但是現實中不是一個學生只選一門課的,往往會出現多對多映射;
層次結構引入一個虛記錄這裏我們假設上圖中的學生1選擇了課程1課程2;
在這裏插入圖片描述

2.層次模型

網狀模型的基本數據結構爲set【系】,一個set表達現實世界中兩個數據類型的一對多關係。其中一爲主記錄,多爲屬記錄。
在這裏插入圖片描述

在層次模型中怎麼描述一對多關係呢?

這裏是引入LINK記錄在這裏插入圖片描述

3.關係模型

關係模型的基本數據結構是表,即關係。將現實生活中實體和實體之間的聯繫全部用表來表示。將表看出多個元組【記錄】的集合,可以採用數學的研究方法進行研究。
特點:

  • 基於數學集合論,有更高的抽象級別
  • 屏蔽了所有的底層細節,易於理解
  • 可以建立新的代數系統----關係代數
  • 定義一個非過程化的查詢語言----SQL
    在這裏插入圖片描述
1.主鍵(primary key)
  1. 一個關係中任意兩個元祖的這組屬性的值都不一樣
  2. 這組屬性的任何一個子集都沒有這個特性

同時滿足1和2的叫做候補鍵;
滿足1不滿足2的叫做超鍵;
如果有多個候補鍵可以選擇一個成爲主鍵;
如果主鍵是由這個關係的所有屬性組成稱爲全鍵;

2.外鍵(foreign key)

一個關係中有一組屬性用它來引用另一關係裏的主鍵屬性,那麼這組屬性被稱爲外鍵;

3.完整性約束

域完整性約束:插入屬性的值是否符合值域
實體完整性約束:主鍵不能爲空

三.關係代數

是關係模型的理論基礎

  • 選擇操作σ 從一個表中把滿足條件的元組選出來
  • projection 投影操作π 將需要的屬性列出來
  • 笛卡爾乘積× 兩個關係的拼接
  • 集合差- 把屬於關係A不屬於關係B的元組找出來
  • 把兩個模式相同的元組並起來

併兼容:屬性的個數一樣,對應屬性的類型一樣;
滿足併兼容的關係纔可以做並,交,差操作;

這5種操作是關係代數的基本操作,剩下的操作都可以用這5種操作表示;

連接操作:笛卡爾積與選擇操作的組合;

  • 條件連接操作:

    • 由笛卡爾乘積和選擇操作的結合
    • 結果模式和迪卡爾乘積的模式相同
    • 連接操作的結果的元組數比笛卡爾乘積的結果元組要少
    • 也稱爲theta-join
  • 等值連接操作

    • 一種特殊的條件連接,連接條件只有等值的條件
    • 結果模式和笛卡爾乘積的模式類似,把等值的屬性去掉一列
  • 自然連接:

    • 兩張表在所有的公共屬性上做等值連接【應用開發最常用的】

除法操作:
先舉例
在這裏插入圖片描述
這種操作適合回答一種問題:
比如找到選擇了所有課程的學生;

計算思路:比如對於A/B來說,我們要找在關係A中跟關係B中所有c值都有聯繫的s值

  • 先在A中找不滿足除法條件的s
    • 先把A做一個投影,投影到s屬性
    • 將投影結果和關係B做一個笛卡爾乘積
    • 用笛卡爾乘積結果-A
    • 對上一步結果做一個投影,投影到s
    • 把關係A所有的s值減去所有不滿足條件的s值
    • 把關係A投影到s
  • 投影結果減去上一操作找到的所有不滿足條件的s值

外連接
解決情況:在自然連接中不滿足連接操作的元組想要保留下來。
分類
左外連接
把連接運算符的左邊的所有元組都要保留,找不到匹配的補空值
右外連接
把連接運算符的右邊的所有元組都保留下來,找不到匹配的補空值
全外連接
把連接運算符的左右兩邊的所有元組都保留下來,找不到匹配的補空值
在這裏插入圖片描述
外並操作:
有一些不滿足併兼容的關係要做並交差;(類比迪卡爾積,沒有的補空值)

四.SQL

  • 數據定義語言【DDL】數據庫定義 : 定義數據庫中Table的名稱、標題(內含的屬性名稱及對該屬性的值的要求)等
    • DBMS提供一套數據定義語言(DDL:Data Definition Language)給用戶
    • 用戶使用DDL描述其所要建立表的格式
    • DBMS依照用戶的定義,創建數據庫及其中的Table

在這裏插入圖片描述

  • 數據操縱語言【DML】數據庫操縱 : 向數據庫的Table中增加/刪除/更新數據及對數據進行查詢、檢索、統計等
    • DBMS提供一套數據操縱語言(DML:Data Manipulation Language)給用戶
    • 用戶使用DML描述其所要進行的增、刪、改、查等操作
    • DBMS依照用戶的操作描述,實際執行這些操作
      在這裏插入圖片描述
  • 數據控制語言【DCL】數據庫控制 : 控制數據庫中數據的使用—哪些用戶可以使用,哪些不可以
    • DBMS提供一套數據控制語言(DCL:Data Control Language)給用戶
    • 用戶使用DCL描述其對數據庫所要實施的控制
    • DBMS依照用戶的描述,實際進行控制在這裏插入圖片描述
  • 查詢語言【QL】:select語句

SELECT [DISTINCT] target-list
FROM relation-list
WHERE qualification

  • 關係列表 relation-list 【查詢設計的表】
  • 目標列表 target-list 【要查詢的東西】
  • 條件 qualification 【布爾表達式】
  • DISTINCT 可選字符,加了的話表明要求系統對查詢結果的重複元組要消除。

查詢語句執行的基本策略

  • 把FROM子句裏出現的表做笛卡爾乘積
  • 把笛卡爾乘積的覺果用qualification做篩選
  • 根據target-list 內的對上一步結果做投影
  • 如果有DISTINCT,將重複元組篩選

複雜的查詢:
在這裏插入圖片描述
找到A表中既在Class a裏又在Class b裏的id
select id from A where class = ‘a’ and class = ‘b’;
這種是錯的

正確的:
要對錶A做自連接(笛卡爾積)
select A1.id from A A1, A A2 where A1.id = A2.id and A1.class = 'a' and A2.class = 'b'
但是這種效率不高;
可以用集合的交來做,就不會產生多餘的數據:
select id from A where class = 'a' intersect select id from A where class = 'b';
mysql中要這樣寫
select id from A where class = 'a' and id in(select id from A where class = 'b');
這種叫做非關聯嵌套子查詢;

在這裏插入圖片描述

找到b班上人的姓名
select B.name From B where EXISTS (select *from A where A.class = 'b' and A.id = B.id);
這種叫做關聯嵌套子查詢
exists是存在的意思,也就是前面的id後面那個不令後面的查詢爲空,
可以看成一個二層循環;

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