數據庫_面試問題【未完待續】

 參考了大佬的分享:@小師兄.【34個數據庫常見面試題講解】

一,數據庫技術基礎

1,視圖

具體可以查看這位博主的文章@不會看見【數據庫--視圖的基本概念以及作用】

定義 

視圖(子查詢):是從一個或多個表導出的虛擬的表,其內容由查詢定義。具有普通表的結構,但是不實現數據存儲
對視圖的修改:單表視圖一般用於查詢和修改,會改變基本表的數據,
多表視圖一般用於查詢,不會改變基本表的數據。

作用

①簡化了操作,把經常使用的數據定義爲視圖。

②安全性,用戶只能查詢和修改能看到的數據。

③邏輯上的獨立性,屏蔽了真實表的結構帶來的影響。

缺點

①性能差  數據庫必須把視圖查詢轉化成對基本表的查詢,如果這個視圖是由一個複雜的多表查詢所定義,那麼,即使是視圖的一個簡單查詢,數據庫也要把它變成一個複雜的結合體,需要花費一定的時間。
②修改限制  當用戶試圖修改視圖的某些信息時,數據庫必須把它轉化爲對基本表的某些信息的修改,對於簡單的視圖來說,這是很方便的,但是,對於比較複雜的試圖,可能是不可修改的。
 

二,關係模型

 

三,SQL語言

 

四,數據庫的完整性與安全性

 

五,數據庫編程

1,觸發器的作用與執行

  • 定義:觸發器是一中特殊的存儲過程,主要是通過事件來觸發而被執行的。它可以強化約束,來維護數據的完整性和一致性。
  • 執行:觸發器的執行,是由觸發事件激活的,並由數據庫服務器自動執行(斷言是數據庫管理系統檢測)

2,存儲過程

  • 定義:過程化SQL編寫基本的SQL是高度非過程化的語言。嵌入式SQL將SQL語句嵌入程序設計語言,藉助高級語言的控制功能實現過程化。過程化SQL是對SQL的擴展,使其增加了過程化語句功能的過程,經編譯和優化後存儲在數據庫服務器中,使用時只要調用即可 。
  • 優點:1)存儲過程是預編譯過的,執行效率高。 2)存儲過程的代碼直接存放於數據庫中,通過存儲過程名直接調用,減少網絡通訊。 3)安全性高,執行存儲過程需要有一定權限的用戶。 4)存儲過程可以重複使用,可減少數據庫開發人員的工作量。

 3,索引

  • 作用:加快查詢速度;
  • 類型:基於順序文件的索引、B+樹索引、哈希索引、位圖索引等;
  • 不適合建立索引:1,不出現或很少出現在查詢條件中的屬性;2,屬性值很少的屬性;3,屬性值分佈嚴重不均的屬性;4,經常更新的屬性或表;5,過長屬性;6,太小的表;
  • 適合建立索引:1,主碼和外碼一般都應建索引;2,以讀爲主或只讀表,只要空間允許可以多建索引;3,等值查詢,且滿足條件的元組數<5%,可以在相關屬性上建索引;4,範圍查詢,可以考慮在相關屬性上建索引

4,事務

定義:

  • 構成單一邏輯工作單元的數據庫操作序列
  • 一個不可分割的工作單位;
  • 恢復和併發控制的基本單位
  • 一個事務就是將一系列的數據操縱SQL語句作爲一個邏輯單元,邏輯單元裏面的單個操作要麼全做,要麼全部不做,以保證數據的完整性

ACID特性

  • 原子性(Atomicity):一個事務是一個不可分割的工作單位,事務中包括的諸操作要麼都做,要麼都不做;
  • 一致性(Consistency):事務必須是使數據庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的;
  • 隔離性(Isolation):一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的數據對併發的其他事務是隔離的,併發執行的各個事務之間不能互相干擾。
  • 持續性(Durability ):指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。

5,鎖

這位博主寫的很詳細!想要更深入瞭解的同學,可以戳這裏@阿駱麥迪【數據庫事務與鎖詳解】

在所有的DBMS中,鎖是實現事務的關鍵,鎖可以保證事務的完整性和併發性。

數據庫併發操作異常情形:

  • 第一類丟失更新(Update Lost):此種更新丟失是因爲回滾的原因,所以也叫回滾丟失。此時兩個事務同時更新count,兩個事務都讀取到100,事務一更新成功並提交,count=100+1=101,事務二出於某種原因更新失敗了,然後回滾,事務二就把count還原爲它一開始讀到的100,此時事務一的更新就這樣丟失了。
  • 髒讀(Dirty Read)此種異常時因爲一個事務讀取了另一個事務修改了但是未提交的數據。舉個例子,事務一更新了count=101,但是沒有提交,事務二此時讀取count,值爲101而不是100,然後事務一出於某種原因回滾了,然後第二個事務讀取的這個值就是噩夢的開始。
  • 不可重複讀(Not Repeatable Read):此種異常是一個事務對同一行數據執行了兩次或更多次查詢,但是卻得到了不同的結果,也就是在一個事務裏面你不能重複(即多次)讀取一行數據,如果你這麼做了,不能保證每次讀取的結果是一樣的,有可能一樣有可能不一樣。造成這個結果是在兩次查詢之間有別的事務對該行數據做了更新操作。舉個例子,事務一先查詢了count,值爲100,此時事務二更新了count=101,事務一再次讀取count,值就會變成101,兩次讀取結果不一樣。
  • 第二類丟失更新(Second Update Lost)此種更新丟失是因爲更新被其他事務給覆蓋了,也可以叫覆蓋丟失。舉個例子,兩個事務同時更新count,都讀取100這個初始值,事務一先更新成功並提交,count=100+1=101,事務二後更新成功並提交,count=100+1=101,由於事務二count還是從100開始增加,事務一的更新就這樣丟失了。
  • 幻讀(Phantom Read):幻讀和不可重複讀有點像,只是針對的不是數據的值而是數據的數量。此種異常是一個事務在兩次查詢的過程中數據的數量不同,讓人以爲發生幻覺,幻讀大概就是這麼得來的吧。舉個例子,事務一查詢order表有多少條記錄,事務二新增了一條記錄,然後事務一查了一下order表有多少記錄,發現和第一次不一樣,這就是幻讀。
     

鎖機制

一般可以分爲兩類,一個是悲觀鎖,一個是樂觀鎖,悲觀鎖一般就是我們通常說的數據庫鎖機制,樂觀鎖一般是指用戶自己實現的一種鎖機制。

悲觀鎖

悲觀鎖按照使用性質劃分:

共享鎖(Share locks簡記爲S鎖):也稱讀鎖事務A對對象T加s鎖,其他事務也只能對T加S,多個事務可以同時讀,但不能有寫操作,直到A釋放S鎖。
排它鎖(Exclusivelocks簡記爲X鎖):也稱寫鎖事務A對對象T加X鎖以後,其他事務不能對T加任何鎖,只有事務A可以讀寫對象T直到A釋放X鎖。
更新鎖(簡記爲U鎖):用來預定要對此對象施加X鎖,它允許其他事務讀,但不允許再施加U鎖或X鎖;當被讀取的對象將要被更新時,則升級爲X鎖,主要是用來防止死鎖的。因爲使用共享鎖時,修改數據的操作分爲兩步,首先獲得一個共享鎖,讀取數據,然後將共享鎖升級爲排它鎖,然後再執行修改操作。這樣如果同時有兩個或多個事務同時對一個對象申請了共享鎖,在修改數據的時候,這些事務都要將共享鎖升級爲排它鎖。這些事務都不會釋放共享鎖而是一直等待對方釋放,這樣就造成了死鎖。如果一個數據在修改前直接申請更新鎖,在數據修改的時候再升級爲排它鎖,就可以避免死鎖。
 

樂觀鎖 

顧名思義,就是很樂觀,每次自己操作數據的時候認爲沒有人回來修改它,所以不去加鎖,但是在更新的時候會去判斷在此期間數據有沒有被修改,需要用戶自己去實現。

既然都有數據庫提供的悲觀鎖可以方便使用爲什麼要使用樂觀鎖呢?對於讀操作遠多於寫操作的時候,大多數都是讀取,這時候一個更新操作加鎖會阻塞所有讀取,降低了吞吐量。最後還要釋放鎖,鎖是需要一些開銷的,我們只要想辦法解決極少量的更新操作的同步問題。換句話說,如果是讀寫比例差距不是非常大或者你的系統沒有響應不及時,吞吐量瓶頸問題,那就不要去使用樂觀鎖,它增加了複雜度,也帶來了額外的風險。
 

6,遊標

是對查詢出來的結果集作爲一個單元來有效的處理。遊標可以定在該單元中的特定行,從結果集的當前行檢索一行或多行。可以對結果集當前行做修改。一般不使用遊標,但是需要逐條處理數據的時候,遊標顯得十分重要。

六,關係數據理論

1,範式

第一範式(1NF)

定義:如果一個關係模式R的所有屬性都是不可分的基本數據項,則R∈1NF。

存在:非主屬性(dno)對碼(sno,cname)的部分函數依賴!

第二範式(2NF)

定義:若R∈1NF,且每一個非主屬性完全函數依賴於碼,則R∈2NF。

問題:將一個1NF關係分解爲多個2NF的關係,並不能完全消除關係模式中的各種異常情況和數據冗餘。(存在非主屬性(dmanager)對碼的傳遞函數依賴!)

第三範式(3NF)

定義:關係模式R<U,F> 中若不存在這樣的碼X、屬性組Y及非主屬性Z(Z  Y), 使得X→Y,Y→Z成立,Y → X,則稱R<U,F> ∈ 3NF。(若R∈3NF,則每一個非主屬性既不部分依賴於碼也不傳遞依賴於碼。)

BC範式(BCNF)

定義:關係模式R<U,F>∈1NF,若X→Y且Y 不包含於X時X必含有碼,則R<U,F> ∈BCNF。

等價於:每一個決定屬性因素都包含碼。

若R∈BCNF :

  • 所有非主屬性對每一個碼都是完全函數依賴;
  • 所有的主屬性對每一個不包含它的碼,也是完全函數依賴;
  • 沒有任何屬性完全函數依賴於非碼的任何一組屬性。

 

七,數據庫設計

 

八,查詢處理與優化

1,查詢優化

代數優化

  1. 選擇運算應儘可能先做。在優化策略中這是最重要、最基本的一條;
  2. 投影運算和選擇運算同時進行
  3. 把投影同其前或其後的雙目運算結合起來;
  4. 把某些選擇同在它前面要執行的笛卡爾積結合起來成爲一個連接運算;
  5. 找出公共子表達式。

 

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