面試之MySQL數據庫部分基礎知識

以下內容來自《PHP程序員面試筆試寶典》如需轉載請註明出處。

一、幾款開源數據庫的對比和介紹


面試之MySQL數據庫部分基礎知識



二、SQL語言的功能有哪些?

SQL是結構化查詢語言(Structured Query Language)的縮寫,其功能包括數據查詢、數據操縱、數據定義和數據控制四個部分。 數據查詢是數據庫中最常見的操作,通過select語句可以得到所需的信息。SQL語言的數據操縱語句(Data Manipulation Language,DML)主要包括插入數據、修改數據以及刪除數據三種語句。SQL語言使用數據定義語言(Data Definition Language,DDL)實現數據定義功能,可對數據庫用戶、基本表、視圖、索引進行定義與撤銷。數據控制語句(Data Control Language,DCL)用於對數據庫進行統一的控制管理,保證數據在多用戶共享的情況下能夠安全。 基本的SQL語句有select、insert、update、delete、create、drop、grant、revoke等。其具體使用方式見下表。

面試之MySQL數據庫部分基礎知識



自己整理了一篇“一二三四範式有何區別?”的文章,關注公眾號:“琉憶編程庫”,回覆:“範式”,我發給你。


三、什麼是事務?

事務是數據庫中一個單獨的執行單元(Unit),它通常由高級數據庫操作語言(例如SQL)或編程語言(例如C++、Java等)書寫的用戶程序的執行所引起。當在數據庫中更改數據成功時,在事務中更改的數據便會提交,不再改變;否則,事務就取消或者回滾,更改無效。 例如網上購物,其交易過程至少包括以下幾個步驟的操作: 1)更新客戶所購商品的庫存信息。 2)保存客戶付款信息。 3)生成訂單並且保存到數據庫中。 4)更新用戶相關信息,如購物數量等。 在正常的情況下,這些操作都將順利進行,最終交易成功,與交易相關的所有數據庫信息也成功地更新。但是,如果遇到突然掉電或是其他意外情況,導致這一系列過程中任何一個環節出了差錯,例如在更新商品庫存信息時發生異常、顧客銀行賬戶餘額不足等,都將導致整個交易過程失敗。而一旦交易失敗,數據庫中所有信息都必須保持交易前的狀態不變,例如最後一步更新用戶信息時失敗而導致交易失敗,那麼必須保證這筆失敗的交易不影響數據庫的狀態,即原有的庫存信息沒有被更新、用戶也沒有付款、訂單也沒有生成。否則,數據庫的信息將會不一致,或者出現更為嚴重的不可預測的後果,數據庫事務正是用來保證這種情況下交易的平穩性和可預測性的技術。 事務必須滿足四個屬性,即原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability),即ACID四種屬性。

(1)原子性

事務是一個不可分割的整體,為了保證事務的總體目標,事務必須具有原子性,即當數據修改時,要麼全執行,要麼全都不執行,即不允許事務部分地完成,避免了只執行這些操作的一部分而帶來的錯誤。原子性要求事務必須被完整執行。

(2)一致性

一個事務執行之前和執行之後數據庫數據必須保持一致性狀態。數據庫的一致性狀態應該滿足模式鎖指定的約束,那麼在完整執行該事務後數據庫仍然處於一致性狀態。為了維護所有數據的完整性,在關係型數據庫中,所有的規則必須應用到事務的修改上。數據庫的一致性狀態由用戶來負責,由併發控制機制實現,例如銀行轉賬,轉賬前後兩個賬戶金額之和應保持不變,由於併發操作帶來的數據不一致性包括丟失數據修改、讀“髒”數據、不可重複讀和產生幽靈數據。

(3)隔離性

隔離性也被稱為獨立性,當兩個或多個事務併發執行時,為了保證數據的安全性,將一個事物內部的操作與事務的操作隔離起來,不被其他正在進行的事務看到。例如對任何一對事務T1、T2,對T1而言,T2要麼在T1開始之前已經結束,要麼在T1完成之後再開始執行。數據庫有四種類型的事務隔離級別:不提交的讀、提交的讀、可重複的讀和串行化。因為隔離性使得每個事務的更新在它被提交之前,對其他事務都是不可見的,所以,實施隔離性是解決臨時更新與消除級聯回滾問題的一種方式。

(4)持久性

持久性也被稱為永久性,事務完成以後,數據庫管理系統(DBMS)保證它對數據庫中的數據的修改是永久性的,當系統或介質發生故障時,該修改也永久保持。持久性一般通過數據庫備份與恢復來保證。 嚴格來說,數據庫事務屬性(ACID)都是由數據庫管理系統來進行保證的,在整個應用程序運行過程中應用無須去考慮數據庫的ACID實現。 一般情況下,通過執行COMMIT或ROLLBACK語句來終止事務,當執行COMMIT語句時,自從事務啟動以來對數據庫所做的一切更改就成為永久性的了,即被寫入磁盤,而當執行ROLLBACK語句時,自動事務啟動以來對數據庫所做的一切更改都會被撤銷,並且數據庫中內容返回到事務開始之前所處的狀態。無論什麼情況,在事務完成時,都能保證回到一致狀態。


四、什麼是觸發器?

觸發器是一種特殊類型的存儲過程,它由事件觸發,而不是程序調用或手工啟動,當數據庫有特殊的操作時,對這些操作由數據庫中的事件來觸發,自動完成這些SQL語句。使用觸發器可以用來保證數據的有效性和完整性,完成比約束更復雜的數據約束。 具體而言,觸發器與存儲過程的區別見下表。

面試之MySQL數據庫部分基礎知識


根據SQL語句的不同,觸發器可分為兩類:DML觸發器和DLL觸發器。 DML觸發器是當數據庫服務器發生數據操作語言事件時執行的存儲過程,有After和Instead Of這兩種觸發器。After觸發器被激活觸發是在記錄改變之後進行的一種觸發器。Instead Of觸發器是在記錄變更之前,去執行觸發器本身所定義的操作,而不是執行原來SQL語句裡的操作。DLL觸發器是在響應數據定義語言事件時執行的存儲過程。 具體而言,觸發器的主要作用表現為如下幾個方面: 1)增加安全性。 2)利用觸發器記錄所進行的修改以及相關信息,跟蹤用戶對數據庫的操作,實現審計。 3)維護那些通過創建表時的聲明約束不可能實現的複雜的完整性約束以及對數據庫中特定事件進行監控與響應。 4)實現複雜的非標準的數據庫相關完整性規則、同步實時地複製表中的數據。 5)觸發器是自動的,它們在對錶的數據做了任何修改之後就會被激活,例如可以自動計算數據值,如果數據的值達到了一定的要求,則進行特定的處理。以某企業財務管理為例,如果企業的資金鍊出現短缺,並且達到某種程度,則發送警告信息。 下面是一個觸發器的例子,該觸發器的功能是在每週末進行數據表更新,如果當前用戶沒有訪問WEEKEND_UPDATE_OK表的權限,那麼需要重新賦予權限。

CREATE OR REPLACE TRIGGER update_on_weekends_check
BEFORE UPDATE OF sal ON EMP
FOR EACH ROW
DECLARE
my_count number(4);
BEGINSELECT COUNT(u_name)
FROM WEEKEND_UPDATE_OK INTO my_count
WHERE u_name = user_name;
IF my_count=0 THEN
RAISE_APPLICATION_ERROR(20508, 'Update not allowed');
END IF;
END;

五、觸發器分為事前觸發和事後觸發,二者有什麼區別?語句級觸發和行級觸發有什麼區別?

事前觸發發生在事件發生之前驗證一些條件或進行一些準備工作;事後觸發發生在事件發生之後,做收尾工作,保證事務的完整性。而事前觸發可以獲得之前和新的字段值。語句級觸發器可以在語句執行之前或之後執行,而行級觸發在觸發器所影響的每一行觸發一次。

轉載地址:https://mp.weixin.qq.com/s/Bces4Hbr_sLudTjR4P-UIw


分享到:


相關文章: