關係型數據庫面試知識點彙總

本文目錄結構

數據庫基礎知識

什麼是SQL?

什麼是數據庫?

什麼是DBMS?

爲什麼要使用數據庫?

數據庫的分類

主流關係型數據庫簡介

什麼是數據庫的三大範式?

什麼是數據庫的五大約束?(主鍵、默認、唯一、檢查、外鍵)

MySQL與權限相關的表有哪些?(user,db,host,表,列)

MySQL的binLog有幾種格式,分別有什麼區別?(statement,row和mixed)

MySQL有哪些數據類型?(整型、實型、字符串、枚舉、日期)

事務

什麼是數據庫事務?

事物的四大特性(ACID)?(原子、一致、持久、隔離)

什麼是髒讀?幻讀?不可重複讀?

什麼是事務的隔離級別?MySQL的默認隔離級別是什麼?


數據庫基礎知識

什麼是SQL?

結構化查詢語言(Structured Query Language),簡稱SQL,是一種數據庫查詢語言。

作用:用於存取數據、查詢、更新和管理關係數據庫系統。

什麼是數據庫?

DB的全稱是data base,即數據庫的意思。數據庫實際上就是一個文件集合,是一個存儲數據的倉庫,本質就是一個文件系統,數據庫是按照特定的格式把數據存儲起來,用戶可以對存儲的數據進行增刪改查操作;

什麼是DBMS?

DBMS的全稱是Database Management System,即數據庫管理系統的意思,是一個軟件,用來管理數據庫文件的軟件,用戶可以訪問DBMS對數據進行增刪改查操作,常見DBMS有: MySQL、oracle、DB2、sqlite、sqlserver等

爲什麼要使用數據庫?

  數據保存在內存 數據保存在文件
優點 存取速度快 數據永久保存
缺點 數據不能永久保存

1)速度比內存操作慢,頻繁的IO操作。

2)查詢數據不方便

數據保存在數據庫

1)數據永久保存

2)使用SQL語句,查詢方便效率高。

3)管理數據方便

數據庫的分類

  • 關係型數據庫: 經過數學理論驗證可以保存現實生活中的各種關係數據, 數據庫中存儲數據以二維表爲單位進行存儲;
  • 非關係型數據庫:通常用來解決某些特定的需求如:數據緩存,高併發,高性能。 存儲數據的形式有多種,比如:Redis數據庫通過鍵值對的形式存儲數據;Neo4j是圖數據庫;

主流關係型數據庫簡介

  • MySQL: 08年被sun公司收購09年sun被oracle收購,開源免費,到oracle發佈了5.0版本(使用了oracle核心技術 性能提高30%),因爲Oracle數據庫地位受到威脅,計劃把mysql閉源,原mysql作者們不幹了,原程序員出去單幹,發佈了MariaDB數據庫、名字是因爲作者女兒叫Maria ,市場排名第一;
  • Oracle:閉源、最貴、性能最高,市場排名第二;
  • SQLServer:微軟公司的產品,市場排名第三,主要應用在.net(C#)開發的網站中;
  • DB2:IBM公司有做網站的完整解決方案(操作系統,we服務器(如tomcat),數據庫等)主要應用在銀行等國有大型企業中;
  • sqlite:輕量級數據庫,只有幾十k,一般應用在嵌入式和移動設備中。

什麼是數據庫的三大範式?

第一範式:每個列都不可以再拆分;即每一列都是不可再分的原子數據項

第二範式:在第一範式的基礎上,非主鍵列完全依賴於主鍵,而不能是依賴於主鍵的一部分;即非主鍵字段必須依賴主鍵字段。

第三範式:在第二範式的基礎上,非主鍵列只依賴於主鍵,不依賴於其他非主鍵;即任何非主鍵列直接依賴主鍵列,不能是通過其他非主鍵列傳遞依賴主鍵列。

在設計數據庫結構的時候,要儘量遵守三範式,如果不遵守,必須有足夠的理由。比如性能。事實上我們經常會爲了性能而妥協數據庫的設計。

什麼是數據庫的五大約束?(主鍵、默認、唯一、檢查、外鍵)

主鍵約束--唯一性,非空性

唯一約束--唯一性,可以空,但只能有一個

檢查約束--對該列數據的類型、範圍進行限制,如非空約束

默認約束--數據的默認值

外鍵約束--引用主表的列與另外的表建立關係

MySQL與權限相關的表有哪些?(user,db,host,表,列)

MySQL的binLog有幾種格式,分別有什麼區別?(statement,row和mixed)

MySQL有哪些數據類型?(整型、實型、字符串、枚舉、日期)

事務

什麼是數據庫事務?

事務是一個不可分割的數據庫操作序列,也是數據庫併發控制的基本單位,其執行的結果必須使數據庫從一種一致性狀態變到另一種一致性狀態。事務是邏輯上的一組操作,要麼都執行,要麼都不執行。

例子【轉賬】:

假如小明要給小紅轉賬1000元,這個轉賬會涉及到兩個關鍵操作就是:將小明的餘額減少1000元,將小紅的餘額增加1000元。萬一在這兩個操作之間突然出現錯誤比如銀行系統崩潰,導致小明餘額減少而小紅的餘額沒有增加,這樣就不對了。事務就是保證這兩個關鍵操作要麼都成功,要麼都要失敗。

事物的四大特性(ACID)?(原子、一致、持久、隔離)

  • 原子性指的是事務不可再分的工作單位。
  • 一致性指的是事務確保數據庫從一個一致狀態轉變爲另一個一致狀態。一致狀態表示數據庫中數據滿足完整性約束。
  • 隔離性指的是多個事務之間的操作相互獨立。
  • 持久性指的是事務一旦提交,其結果就是永久性的。

什麼是髒讀?幻讀?不可重複讀?

  • 髒讀(Drity Read):某個事務已更新一份數據,另一個事務在此時讀取了同一份數據,由於某些原因,前一個RollBack了操作,則後一個事務所讀取的數據就會是不正確的。
  • 不可重複讀(Non-repeatable read):在一個事務的兩次查詢之中數據不一致,這可能是兩次查詢過程中間插入了一個事務更新的原有的數據。
  • 幻讀(Phantom Read):在一個事務的兩次查詢中數據筆數不一致,例如有一個事務查詢了幾列(Row)數據,而另一個事務卻在此時插入了新的幾列數據,先前的事務在接下來的查詢中,就會發現有幾列數據是它先前所沒有的。

什麼是事務的隔離級別?MySQL的默認隔離級別是什麼?

爲了達到事務的四大特性,數據庫定義了4種不同的事務隔離級別,由低到高依次爲Read uncommitted、Read committed、Repeatable read、Serializable,這四個級別可以逐個解決髒讀、不可重複讀、幻讀這幾類問題。

隔離級別 髒讀 不可重複讀 幻影讀
READ-UNCOMMITTED
READ-COMMITTED ×
REPEATABLE-READ × ×
SERIALIZABLE × × ×

SQL 標準定義的四個隔離級別:

  • READ-UNCOMMITTED(讀取未提交): 最低的隔離級別,允許讀取尚未提交的數據變更,可能會導致髒讀、幻讀或不可重複讀。
  • READ-COMMITTED(讀取已提交): 允許讀取併發事務已經提交的數據,可以阻止髒讀,但是幻讀或不可重複讀仍有可能發生。
  • REPEATABLE-READ(可重複讀): 對同一字段的多次讀取結果都是一致的,除非數據是被本身事務自己所修改,可以阻止髒讀和不可重複讀,但幻讀仍有可能發生。
  • SERIALIZABLE(可串行化): 最高的隔離級別,完全服從ACID的隔離級別。所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止髒讀、不可重複讀以及幻讀。

這裏需要注意的是:Mysql 默認採用的 REPEATABLE_READ隔離級別 Oracle 默認採用的 READ_COMMITTED隔離級別。事務隔離機制的實現基於鎖機制和併發調度。其中併發調度使用的是MVVC(多版本併發控制),通過保存修改的舊版本信息來支持併發一致性讀和回滾等特性。因爲隔離級別越低,事務請求的鎖越少,所以大部分數據庫系統的隔離級別都是READ-COMMITTED(讀取提交內容):,但是你要知道的是InnoDB 存儲引擎默認使用 **REPEATABLE-READ(可重讀)**並不會有任何性能損失。InnoDB 存儲引擎在 分佈式事務 的情況下一般會用到**SERIALIZABLE(可串行化)**隔離級別。
 

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