1. 程式人生 > >常見面試題整理--資料庫篇(每位開發者必備)

常見面試題整理--資料庫篇(每位開發者必備)

 

轉載自:https://zhuanlan.zhihu.com/p/23713529        知乎專欄

繼續前面有關於的Python面試的兩篇內容:Python程式碼篇 、Python概念篇 今天說一說資料庫。不管你是Java開發者還是Python開發者還是其他語言開發者,基本上面試的時候都會被問到資料庫相關的知識點。所以掌握一些經常被問的資料庫知識是十分重要的。

如果你對資料庫不熟悉,想學習的話,學習專欄有一篇MySQL學習資料

那麼常見的資料庫面試題有哪些呢?(非DBA向)

(一)什麼是儲存過程?有哪些優缺點?

儲存過程是一些預編譯的SQL語句。

更加直白的理解:儲存過程可以說是一個記錄集,它是由一些T-SQL語句組成的程式碼塊,這些T-SQL語句程式碼像一個方法一樣實現一些功能(對單表或多表的增刪改查),然後再給這個程式碼塊取一個名字,在用到這個功能的時候呼叫他就行了。

  • 儲存過程是一個預編譯的程式碼塊,執行效率比較高
  • 一個儲存過程替代大量T_SQL語句 ,可以降低網路通訊量,提高通訊速率
  • 可以一定程度上確保資料安全

如果你對儲存過程不熟悉,建議閱讀:儲存過程詳解-部落格園

(二)索引是什麼?有什麼作用以及優缺點?

索引是對資料庫表中一或多個列的值進行排序的結構,是幫助MySQL高效獲取資料的資料結構

你也可以這樣理解:索引就是加快檢索表中資料的方法。資料庫的索引類似於書籍的索引。在書籍中,索引允許使用者不必翻閱完整個書就能迅速地找到所需要的資訊。在資料庫中,索引也允許資料庫程式迅速地找到表中的資料,而不必掃描整個資料庫。

MySQL資料庫幾個基本的索引型別:普通索引、唯一索引、主鍵索引、全文索引

  • 索引加快資料庫的檢索速度
  • 索引降低了插入、刪除、修改等維護任務的速度
  • 唯一索引可以確保每一行資料的唯一性
  • 通過使用索引,可以在查詢的過程中使用優化隱藏器,提高系統的效能
  • 索引需要佔物理和資料空間 

如果你對索引還不太熟悉,建議閱讀:漫談資料庫索引

(三)什麼是事務?

事務(Transaction)是併發控制的基本單位。所謂的事務,它是一個操作序列,這些操作要麼都執行,要麼都不執行,它是一個不可分割的工作單位。事務是資料庫維護資料一致性的單位,在每個事務結束時,都能保持資料一致性。

如果你對索引還不太熟悉,建議閱讀:資料庫事務 - Mr. David 專欄

(四)資料庫的樂觀鎖和悲觀鎖是什麼?

資料庫管理系統(DBMS)中的併發控制的任務是確保在多個事務同時存取資料庫中同一資料時不破壞事務的隔離性和統一性以及資料庫的統一性。

樂觀併發控制(樂觀鎖)和悲觀併發控制(悲觀鎖)是併發控制主要採用的技術手段。

  • 悲觀鎖:假定會發生併發衝突,遮蔽一切可能違反資料完整性的操作
  • 樂觀鎖:假設不會發生併發衝突,只在提交操作時檢查是否違反資料完整性。

如果你對兩種鎖還不太熟悉,建議閱讀:深入理解樂觀鎖與悲觀鎖

(五) 使用索引查詢一定能提高查詢的效能嗎?為什麼

通常,通過索引查詢資料比全表掃描要快.但是我們也必須注意到它的代價.

索引需要空間來儲存,也需要定期維護, 每當有記錄在表中增減或索引列被修改時,索引本身也會被修改. 這意味著每條記錄的INSERT,DELETE,UPDATE將為此多付出4,5 次的磁碟I/O. 因為索引需要額外的儲存空間和處理,那些不必要的索引反而會使查詢反應時間變慢.使用索引查詢不一定能提高查詢效能,索引範圍查詢(INDEX RANGE SCAN)適用於兩種情況:

  • 基於一個範圍的檢索,一般查詢返回結果集小於表中記錄數的30%
  • 基於非唯一性索引的檢索

(六)簡單說一說drop、delete與truncate的區別

SQL中的drop、delete、truncate都表示刪除,但是三者有一些差別

  • delete和truncate只刪除表的資料不刪除表的結構
  • 速度,一般來說: drop> truncate >delete 
  • delete語句是dml,這個操作會放到rollback segement中,事務提交之後才生效;
    如果有相應的trigger,執行的時候將被觸發. truncate,drop是ddl, 操作立即生效,原資料不放到rollback segment中,不能回滾. 操作不觸發trigger. 

如果你對這三者的用法還不太熟悉,建議閱讀: drop、truncate和delete的區別

(七)drop、delete與truncate分別在什麼場景之下使用?

  • 不再需要一張表的時候,用drop
  • 想刪除部分資料行時候,用delete,並且帶上where子句
  • 保留表而刪除所有資料的時候用truncate

(八) 超鍵、候選鍵、主鍵、外來鍵分別是什麼?

超鍵:在關係中能唯一標識元組的屬性集稱為關係模式的超鍵。一個屬性可以為作為一個超鍵,多個屬性組合在一起也可以作為一個超鍵。超鍵包含候選鍵和主鍵。

候選鍵:是最小超鍵,即沒有冗餘元素的超鍵。

主鍵:資料庫表中對儲存資料物件予以唯一和完整標識的資料列或屬性的組合。一個數據列只能有一個主鍵,且主鍵的取值不能缺失,即不能為空值(Null)。

外來鍵:在一個表中存在的另一個表的主鍵稱此表的外來鍵。

(九)什麼是檢視?以及檢視的使用場景有哪些?

檢視是一種虛擬的表,具有和物理表相同的功能。可以對檢視進行增,改,查,操作,試圖通常是有一個表或者多個表的行或列的子集。對檢視的修改不影響基本表。它使得我們獲取資料更容易,相比多表查詢。

  • 只暴露部分欄位給訪問者,所以就建一個虛表,就是檢視。
  • 查詢的資料來源於不同的表,而查詢者希望以統一的方式查詢,這樣也可以建立一個檢視,把多個表查詢結果聯合起來,查詢者只需要直接從檢視中獲取資料,不必考慮資料來源於不同表所帶來的差異

(十)說一說三個正規化。

第一正規化(1NF):資料庫表中的欄位都是單一屬性的,不可再分。這個單一屬性由基本型別構成,包括整型、實數、字元型、邏輯型、日期型等。

第二正規化(2NF):資料庫表中不存在非關鍵欄位對任一候選關鍵欄位的部分函式依賴(部分函式依賴指的是存在組合關鍵字中的某些欄位決定非關鍵欄位的情況),也即所有非關鍵欄位都完全依賴於任意一組候選關鍵字。

第三正規化(3NF):在第二正規化的基礎上,資料表中如果不存在非關鍵欄位對任一候選關鍵欄位的傳遞函式依賴則符合第三正規化。所謂傳遞函式依賴,指的是如 果存在"A → B → C"的決定關係,則C傳遞函式依賴於A。因此,滿足第三正規化的資料庫表應該不存在如下依賴關係: 關鍵欄位 → 非關鍵欄位 x → 非關鍵欄位y

如果你對三個還不太瞭解,建議閱讀:解釋一下關係資料庫的第一第二第三正規化?

本文參考文獻文章: 

「1」很全的Python面試題

「2」資料庫常見筆試面試題

「3」資料庫索引

「4」資料庫常見筆試面試題 - Hectorhua的專欄

「5」 SQL 中 drop 、delete 和truncate 的區別

「6」資料庫基本概念面試必問

--------------------- 本文來自 Dream__Boy 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/weinierzui/article/details/71054964?utm_source=copy