PHP面試之MySQL資料庫部分基礎知識
你好,是我琉憶,PHP程式設計師面試筆試系列圖書的作者。
本週(2019.3.4至3.8)的一三五更新的文章如下:
週一:PHP面試MySQL資料庫的基礎知識
週三:PHP面試MySQL資料庫的索引
週五:PHP面試MySQL資料庫的面試真題
自己整理了一篇“ 一二三四正規化有何區別? ”的文章,關注公眾號:“ 琉憶程式設計庫 ”,回覆:“ 正規化 ”,我發給你。
以下內容來自 《PHP程式設計師面試筆試寶典》 如需轉載請註明出處。
一、幾款開源資料庫的對比和介紹
二、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等。其具體使用方式見下表。
自己整理了一篇“ 一二三四正規化有何區別? ”的文章,關注公眾號:“ 琉憶程式設計庫 ”,回覆:“ 正規化 ”,我發給你。
三、什麼是事務?
事務是資料庫中一個單獨的執行單元(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語句。使用觸發器可以用來保證資料的有效性和完整性,完成比約束更復雜的資料約束。
具體而言,觸發器與儲存過程的區別見下表。
根據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); BEGIN SELECT 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;
五、觸發器分為事前觸發和事後觸發,二者有什麼區別?語句級觸發和行級觸發有什麼區別?
事前觸發發生在事件發生之前驗證一些條件或進行一些準備工作;事後觸發發生在事件發生之後,做收尾工作,保證事務的完整性。而事前觸發可以獲得之前和新的欄位值。語句級觸發器可以在語句執行之前或之後執行,而行級觸發在觸發器所影響的每一行觸發一次。
預告:本週三(3.6)將更新 PHP面試MySQL資料庫的索引 ,敬請期待。
以上內容摘自 《PHP程式設計師面試筆試寶典》 書籍, 目前本書沒有電子版 ,可到各大電商平臺購買紙質版。
更多PHP相關的面試知識、考題可以關注公眾號獲取: 琉憶程式設計庫