1. 程式人生 > 資料庫 >2021.1.5.- 外來鍵約束 - 資料庫與表之間的關係 - 三大正規化 - 多表查詢 - 事務 - DCL

2021.1.5.- 外來鍵約束 - 資料庫與表之間的關係 - 三大正規化 - 多表查詢 - 事務 - DCL

外來鍵約束
1.目的:限制表新增資訊的型別
2.新增外來鍵的語法:constrain 外來鍵約束名稱 foreign key(外來鍵的欄位名稱) reference 主表的表名(一般管關聯主鍵)
3.一般來說都是在從表中新增外來鍵,指定主表的主鍵,達到連線的目的
4.格式:alter table 從表表名 add constrain 外來鍵約束的名稱 foreign key(外來鍵的欄位名稱) reference 主表的表名(主鍵欄位名)
5.點選左上角表圖示,再點選右下角一個ER圖表,點開之後就能阿卡拿到哪些表之間有外來鍵約束
6.刪除外來鍵:alter table 從表表名 drop froeign key 外來鍵名稱;

7.注意:對於已經存在的表刪除外來鍵,必須先刪除相關聯標的非法資料
8.外來鍵約束程式碼

級聯操作:兩張表之間已經有啦主外來鍵關聯
1.概念:在修改或者刪除朱標的時候,同時他會更新或者刪除從表中的外來鍵值,這種操作稱為級聯
2.修改表中的資料,修改課程資訊,不能修改為非法資料
3.刪除主表的資料:如果刪除之後導致從表資料會非法,那麼就不能被刪除調
4.更新級聯:on update cascade 只能在建立表的時候建立級聯,當更新主表中的主鍵,從表中的外來鍵會同步更新
5.刪除級聯:on delete cascade 刪除主表中的主鍵的時候,從表中含有該欄位的記錄會同步刪除
6.級聯程式碼

約束總結:
1.主鍵約束 primary key 唯一不為空
2.預設約束 defalut 插入資料,欄位沒有賦值時候 系統,就會自動賦預設值
3.非空約束 not null 不為null
4.唯一約束 unique 該欄位在資料在整個表中只能出現一次
5.外來鍵約束 foreign key 從表中加外來鍵關聯主表的主鍵

表與表之間的關係
1.一對一關係:通常寫在一個表裡面
2.一對多關係:
3.多對多關係:

多對多建表:需要建立中間表

一對多建表:設計的時候先建立主表再建立從表


表與表之間的關係總結
1.一對一建表:
直接把兩個表合在一起,非要分開就是互為外來鍵約束
2.多對多建表:
需要建立中間表:中間表內部分別新增外來鍵約束關聯各對應的主鍵
3.一對多建表
在從表的那一方(多的那一方)建立外來鍵被主表的主鍵約束,先建立主表再建立從表

資料庫設計的正規化
1.概念:

  • 在設計資料庫的時候,需要遵從的規範要求,根據這些規範要求設計出合理的資料庫,致謝桂芳就成為正規化,主要是針對於關係型資料庫,目前來說
  • 目前關係型資料庫的正規化有六種:第一,二,三,四,五正規化和巴斯-科德正規化,第五正規化成為完美正規化
  • 各種正規化是呈遞次規範:也就是後面的正規化是在前面的正規化滿足的情況下,才會有後面的正規化.越高正規化的資料庫冗餘度就越來越低

2.前三種正規化的介紹

  • 第一正規化:1NF:預設遵從的,資料庫創建出來就符合
    資料庫中的每一列不可分割的原子資料項,就是說每一項都是最小的,如果學生資訊項=學號+學生姓名 那麼學生資訊就是可以分割的,那麼學生資訊項就可以分割,所以不算是第一正規化
  • 第二正規化:2NF:在第一正規化的基礎之上,非碼屬性必須完全依賴於碼,在第一正規化基礎上消除非主屬性對主屬性的部分函式對碼依賴,就比如說:一張表主屬性學號就可以確定學生了,後面的主屬性課程只是後面確定成績會用到,對學生的確定無關,所以就造成了冗餘,把課程和成績從原表中分離出去,剩下的才符合第二正規化.分離出去的必須要學號和課程聯合才能確定成績,所以說分離出去的需要關聯學號

    概念:
  1. 函式依賴:A--->B 如果通過A屬性的值,可以確定唯一的B屬性值,可以稱B依賴於A,,,,,就相當於通過學號可以找到學生-->學生就依賴於學號.
  2. 完全函式依賴:A--->B 如果A是一個屬性組,則B屬性值的確定需要依賴於A屬性組中所有的屬性值,就相當於學號-->課程---->每個課程的成績,就會成績的的確定需要依賴於學號中所有的課程才能得到
  3. 部分函式依賴:A--->B B屬性的確定需要依賴於,A數學組中一個或者部分的資料才能得到
  4. 傳遞函式依賴: A--->B ,B--->C如果通過A屬性組的值可以唯一確定B屬性組屬性的值,再通過B屬性的值可以唯一確定C屬性的值,這時候就可以稱C傳遞函式依賴於A.
  5. 碼:如果在一張表中,一個屬性或者屬性組,被其他所有屬性鎖完全依賴,則稱這個屬性為該表的碼.
    主屬性:碼屬性組中的所有屬性
    非主屬性:除了主屬性之外的其他屬性.

第三正規化:3NF :如上圖所示,還是有很多冗餘,比如一個學號對應姓名多次,就沒有得到優化,到了第三正規化基本上都是單獨的表在表決心單獨的刪除和增加並不會說影響其他表的資料,就大大避免了操作失誤.任何非主屬性不依賴於其他的非主屬性(消除傳遞函式依賴)

三種正規化總結:

  • 第一正規化(1NF):表中每一列不可分割(一件事最小狀態)
  • 第二正規化(2NF):消除部分函式依賴:一張表只做一件事學生表就描述學生資訊,不要再去說成績
  • 第三正規化(3NF):消除傳遞函式依賴,表中每一列都直接依賴於碼(主鍵),非主鍵和非主鍵之間沒有聯絡.,中間不需要傳遞,直接找主鍵

多表連線查詢
分類:內連線(顯示內連線和隱式內連線)和外連線(左外連線和右外連線).

  • 笛卡爾現象:

    • 左表中的每條記錄和右表中的每條資料都會產生關聯,這種效果就稱之為笛卡爾集合
  • 消除笛卡爾先行

    • 使用條件過濾,where語句達到過濾目的
  • 內連線::inner join(可以不寫)

    • 隱式內連線:就是省略了內連線關鍵字 inner join
      語法:select 欄位列表 from 表名1,表名2 where 條件語句 --->不寫where就會出現笛卡爾現象
    • 顯示內連線:
      語法: select 欄位列表 from 表名1 inner join 表名2 on 條件語句
    • 總結:
      內連線是運用所有的笛卡爾把所有的都連線起來,所以要在後面加上where條件才能輸出準確的資料
      1. 確定查詢哪些表
      2. 確定表關聯的條件
      3. 使用連線的方式(內還是外)
      4. 確定查詢的欄位資訊 儘量少用
  • 外連線

    • 左外連線:使用 left [outer] join......on 條件語句 -----> outer(可以省略)
      • select 欄位列表 from 左表(以左表為主) left join 右表(輔助的表) on 條件語句(關聯語句)
      • 注意事項 :是用左表中的記錄資料去匹配右表中的記錄資料,如果符合條件則顯示不符合的就插入null,用來保證左表中的資料全部顯示.
    • 右外連線:使用 right join
      • select 欄位列表 from 右表(以左表為主) right join 左表(輔助的表) on 條件語句(關聯語句)
      • 注意事項 :是用右表中的記錄資料去匹配左表中的記錄資料,如果符合條件則顯示不符合的就插入null,用來保證右表中的資料全部顯示
  • 子查詢

    • 一個查詢的結果是另一個查詢的條件,形成查詢巢狀,裡面被巢狀的查詢稱之為子查詢
    • 子查詢三種情況
      • 子查詢的結果可以是單行單列(一個值)
      • 也可以是多行單列,一個欄位,這個欄位有多個值
      • 也可以是多行多列,結果值有多個欄位,多個值
      • 操作:
        • 單行單列查詢結果
          • select 查詢欄位列表 from 表名 where 欄位 比較運算子 (子查詢)
        • 多行多列:一般能情況下,作為一張虛擬表,進行關聯二次查詢,一般需要給這個虛擬表一個別名來實現
          • 語法:select 查詢欄位列表 from 表名,(子查詢) as 新表名 where 條件語句;
          • 特徵:多行多列不能再使用in運算子或者比較運算子,而是需要繼續多表關聯,給查詢出來的多行多列起別名.
      • 總結:
        • 單行多列:只有一個值,where後面可以使用比較運算子作為條件
        • 多行單列:是一個集合值或者陣列值,在where後面使用in運算子作為條件
        • 多行多列:大多數多列結果值是放在from後面的,作為多表關聯的,可以進行二次條件過濾

事務
.概念

  • ​ 一個業務操作中,要麼操作成功,要麼被撤銷,這個業務操作是一個整體操作不是一個單獨的操作.在這個整體中,所有的sql語句要麼全部執行成功,要麼回滾,回滾就意味著業務執行失敗,
  • ​ 操作:張三給李四轉錢10000 兩步:1.張三減少10000 2.李四增加10000

開啟事物: satrt transaction ;開啟事物,那麼後面的sql操作就會不會修改資料庫中的資料
提交事物:commit;提交提交事務使得它能改變資料庫中的資料
回滾事務:rollbank;在sql語句有錯誤的時候就不會提交事務,會回滾事務,把資料還原

事務的四大特性:

  • 原子性:事務是一個整體,在整體中是不可分割的,就是許多sql語句不可以分開,必須同時指向,意思就是要麼完全成功要麼完全失敗.
  • 一致性:事務在執行前和執行後,資料庫中的資料狀態是一致的.轉賬前是40000,那麼到最後總的錢就是40000,是不會改變的
  • 隔離性:一個事務的執行不能被其他事務干擾。
  • 持續性/永久性:一個事務一旦提交,它對資料庫中資料的改變就應該是永久性的。

事務的隔離級別:

  • 讀未提交-->read uncommited

  • 讀已提交:-->read commited

  • 可重複讀---->repeatable read

  • 竄行話--->serialzable0 鎖表(一般不用,安全性最高,效能最低).

  • 由事務隔離級別引發併發事務操作問題:髒讀,不可重複讀,幻讀