考研複試數據庫原理面試題(二)SQL、索引、存儲過程、觸發器

寫作目的:爲了應對考研複試中的面試,我整理了導師可能提問的地方,力求用口語化的語言描述出來。

這只是一部分,陸續還有數據庫原理的其它章節,還會推出數據結構、計算機網絡複試題整理。

數據庫原理我的參考書是《數據庫原理及應用第二版(雷景生)》,因爲一些機緣巧合選擇了這本書。不過沒關係,網上有很多關於數據庫原理的面試題,而且答案也很容易搜到。思維導圖在我的processon。如果對你有幫助就打賞一下吧。

https://www.processon.com/view/link/5e7e0107e4b027d999d2cb1d

還有其它系列的面試題整理

考研複試計算機組成原理面試題

考研複試操作系統面試題

目錄

sql語言的特點和功能

三種模式與SQL的關係?

SQL各部分的的執行順序?

什麼是存儲過程?

什麼是觸發器?

存儲過程和函數區別?​

什麼情況下用存儲過程什麼情況下不用?

存儲過程的優缺點

什麼是最左匹配原則

爲什麼索引底層用B+樹而不用B樹、紅黑樹、hash

索引的優點和缺點


sql語言的特點和功能

sql全程是結構化查詢語言。它的功能是數據查詢DQL、數據操縱DML、數據定義DDL、數據控制DCL。

特點是:①語言集的風格綜合統一;②高度非過程化,只需要指出“做什麼”,不用說“怎麼做”;③面向集合操作方式;④同一種語言提供兩種使用方式(自含式語言、嵌入式語言),靈活方便;⑤簡單易學。

sql語言的動詞:

DQL:SELECT

DDL:CREATE DROP ALTER

DML:INSERT UNDATE DELETE

DCL:GRANT REVOKE

三種模式與SQL的關係?

sql支持關係數據庫三級模式結構。

外模式對應視圖和部分基本表;模式對應基本表;內模式對應於存儲文件。

SQL各部分的的執行順序?

先根據where子句給出的條件從from子句指定的基本表或視圖中找出滿足條件的元組;然後,再按照select子句中的目標列選出元組中的屬性值形成結果。如果有group by的話,則按照條件進行分組,如果有having的話,則只是給定的組才能輸出。如果有order by則按照條件進行升序或降序。

什麼是存儲過程?

一組爲了完成特定功能的sql語句集,經編譯後存儲在數據庫中,用戶通過指定存儲過程的名字並給出參數(如果需要參數)來執行它。

什麼是觸發器?

是一個特殊的存儲過程,它的執行不是由程序調用,也不是手工啓動,而是由事件觸發,比如對一個表進行增刪改(insert、delete、update)操作會激活執行它。

存儲過程和函數區別?​

①返回值區別:函數有1個返回值,而存儲過程是本質上沒有返回值,但可以通過設置輸出參數方式輸出(輸入:in ,輸出:out ,輸入輸出:in out );

②調用區別:函數可以嵌入在sql中使用的,可以在select中調用,而存儲過程必須單獨調用;​

什麼情況下用存儲過程什麼情況下不用?

1、當一個業務同時對多個表進行處理的時候採用存儲過程比較合適。

2、複雜的數據處理用存儲過程,如有些報表處理

3、多條件多表聯合查詢,並做分頁處理

存儲過程的優缺點

優點:

1. 運行速度:存儲過程一旦執行,在內存中就會保留一份這個存儲過程,這樣下次再執行同樣的存儲過程時,可以從內存中直接調用,所以執行速度會比普通sql快。

2. 減少網絡傳輸:存儲過程直接就在數據庫服務器上跑。

3. 可維護性:因爲可以實時更新DB端的存儲過程, 有些bug,直接改存儲過程裏的業務邏輯就搞定了。

4. 增強安全性:提高代碼安全,防止 SQL注入。這一點sql語句也可以做到。

5. 可擴展性:應用程序和數據庫操作分開,獨立進行,而不是相互在一起。方便以後的擴展和DBA維護優化。

缺點:

1. SQL本身是一種結構化查詢語言,但不是面向對象的的,本質上還是過程化的語言,面對複雜的業務邏輯,過程化的處理會很喫力。同時SQL擅長的是數據查詢而非業務邏輯的處理,如果如果把業務邏輯全放在存儲過程裏面,違背了這一原則。

2. 如果需要對輸入存儲過程的參數進行更改,或者要更改由其返回的數據,則仍需要更新程序集中的代碼以添加參數、更新調用,等等,這時候估計會比較繁瑣了。

3. 開發調試複雜,由於編程工具的問題,存儲過程的開發調試要比一般程序困難。

4. 沒辦法應用緩存。雖然有全局臨時表之類的方法可以做緩存,但同樣加重了數據庫的負擔。如果緩存併發嚴重,經常要加鎖,那效率實在堪憂。

5. 不支持羣集,數據庫服務器無法水平擴展,或者數據庫的切割(水平或垂直切割)。數據庫切割之後,存儲過程並不清楚數據存儲在哪個數據庫中。

什麼是最左匹配原則

一句話說不清,不敢往上寫。

爲什麼索引底層用B+樹而不用B樹、紅黑樹、hash

紅黑樹在增加刪除時會進行頻繁的調整,來保證紅黑樹的性質,會影響性能。

hash的速度雖然在隨機訪問時非常快,但是在順序查找時非常雞肋。

B+樹的優勢:

1、 B+樹的磁盤讀寫代價更低:B+樹的內部節點並沒有指向關鍵字具體信息的指針,因此其內部節點相對B樹更小,如果把所有同一內部節點的關鍵字存放在同一盤塊中,那麼盤塊所能容納的關鍵字數量也越多,一次性讀入內存的需要查找的關鍵字也就越多,相對IO讀寫次數就降低了。

2、B+樹的查詢效率更加穩定:由於非終結點並不是最終指向文件內容的結點,而只是葉子結點中關鍵字的索引。所以任何關鍵字的查找必須走一條從根結點到葉子結點的路。所有關鍵字查詢的路徑長度相同,導致每一個數據的查詢效率相當。

3、由於B+樹的數據都存儲在葉子結點中,分支結點均爲索引,方便掃庫,只需要掃一遍葉子結點即可,但是B樹因爲其分支結點同樣存儲着數據,我們要找到具體的數據,需要進行一次中序遍歷按序來掃,所以B+樹更加適合在區間查詢的情況,所以通常B+樹用於數據庫索引。

4、B+樹適合範圍查找,順序遍歷葉節點即可。而B樹在範圍查找時比較雞肋。

索引的優點和缺點

索引的缺點:首先,索引需要佔用一定的空間,創建和維護索引需要消耗時間;其次對錶進行增加刪除時索引也要動態維護,降低了維護速度;

索引的優點:

1.大大加快數據的檢索速度;

2.創建唯一性索引,保證數據庫表中每一行數據的唯一性;

3.加速表和表之間的連接;

4.在使用分組和排序子句進行數據檢索時,可以顯著減少查詢中分組和排序的時間。

什麼時候應該創建索引,什麼時候不應該創建索引

不使用索引的時候

第一,對於那些在查詢中很少使用或者參考的列不應該創建索引。

第二,對於那些只有很少數據值種類的列也不應該增加索引。

第三,對於那些數據量要麼相當大,要麼取值很少的,不應該創建索引。

第四,當修改性能遠遠大於檢索性能時,不應該創建索引。

使用索引的時候

1.主鍵自動建立唯一索引;

2.頻繁作爲查詢條件的字段應該創建索引;

3.查詢中與其他表有關聯的字段,例如外鍵關係;

4.查詢中排序的字段創建索引將大大提高排序的速度(索引就是排序加快速查找);

5.查詢中統計或者分組的字段;

 

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