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

你好,是我琉憶,PHP程序員面試筆試系列圖書的做者。程序員

本週(2019.3.4至3.8)的一三五更新的文章以下:面試

週一:PHP面試MySQL數據庫的基礎知識
週三:PHP面試MySQL數據庫的索引
週五:PHP面試MySQL數據庫的面試真題
本身整理了一篇「 一二三四範式有何區別?」的文章,關注公衆號:「 琉憶編程庫」,回覆:「 範式」,我發給你。

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


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

clipboard.png


2、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等。其具體使用方式見下表。編程

clipboard.png


本身整理了一篇「 一二三四範式有何區別?」的文章,關注公衆號:「 琉憶編程庫」,回覆:「 範式」,我發給你。

3、什麼是事務?

事務是數據庫中一個單獨的執行單元(Unit),它一般由高級數據庫操做語言(例如SQL)或編程語言(例如C++、Java等)書寫的用戶程序的執行所引發。當在數據庫中更改數據成功時,在事務中更改的數據便會提交,再也不改變;不然,事務就取消或者回滾,更改無效。
例如網上購物,其交易過程至少包括如下幾個步驟的操做:
1)更新客戶所購商品的庫存信息。
2)保存客戶付款信息。
3)生成訂單而且保存到數據庫中。
4)更新用戶相關信息,如購物數量等。
在正常的狀況下,這些操做都將順利進行,最終交易成功,與交易相關的全部數據庫信息也成功地更新。可是,若是遇到忽然掉電或是其餘意外狀況,致使這一系列過程當中任何一個環節出了差錯,例如在更新商品庫存信息時發生異常、顧客銀行帳戶餘額不足等,都將致使整個交易過程失敗。而一旦交易失敗,數據庫中全部信息都必須保持交易前的狀態不變,例如最後一步更新用戶信息時失敗而致使交易失敗,那麼必須保證這筆失敗的交易不影響數據庫的狀態,即原有的庫存信息沒有被更新、用戶也沒有付款、訂單也沒有生成。不然,數據庫的信息將會不一致,或者出現更爲嚴重的不可預測的後果,數據庫事務正是用來保證這種狀況下交易的平穩性和可預測性的技術。
事務必須知足四個屬性,即原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability),即ACID四種屬性。
(1)原子性
事務是一個不可分割的總體,爲了保證事務的整體目標,事務必須具備原子性,即當數據修改時,要麼全執行,要麼全都不執行,即不容許事務部分地完成,避免了只執行這些操做的一部分而帶來的錯誤。原子性要求事務必須被完整執行。
(2)一致性
一個事務執行以前和執行以後數據庫數據必須保持一致性狀態。數據庫的一致性狀態應該知足模式鎖指定的約束,那麼在完整執行該事務後數據庫仍然處於一致性狀態。爲了維護全部數據的完整性,在關係型數據庫中,全部的規則必須應用到事務的修改上。數據庫的一致性狀態由用戶來負責,由併發控制機制實現,例如銀行轉帳,轉帳先後兩個帳戶金額之和應保持不變,因爲併發操做帶來的數據不一致性包括丟失數據修改、讀「髒」數據、不可重複讀和產生幽靈數據。
(3)隔離性
隔離性也被稱爲獨立性,當兩個或多個事務併發執行時,爲了保證數據的安全性,將一個事物內部的操做與事務的操做隔離起來,不被其餘正在進行的事務看到。例如對任何一對事務T一、T2,對T1而言,T2要麼在T1開始以前已經結束,要麼在T1完成以後再開始執行。數據庫有四種類型的事務隔離級別:不提交的讀、提交的讀、可重複的讀和串行化。由於隔離性使得每一個事務的更新在它被提交以前,對其餘事務都是不可見的,因此,實施隔離性是解決臨時更新與消除級聯回滾問題的一種方式。
(4)持久性
持久性也被稱爲永久性,事務完成之後,數據庫管理系統(DBMS)保證它對數據庫中的數據的修改是永久性的,當系統或介質發生故障時,該修改也永久保持。持久性通常經過數據庫備份與恢復來保證。
嚴格來講,數據庫事務屬性(ACID)都是由數據庫管理系統來進行保證的,在整個應用程序運行過程當中應用無須去考慮數據庫的ACID實現。
通常狀況下,經過執行COMMIT或ROLLBACK語句來終止事務,當執行COMMIT語句時,自從事務啓動以來對數據庫所作的一切更改就成爲永久性的了,即被寫入磁盤,而當執行ROLLBACK語句時,自動事務啓動以來對數據庫所作的一切更改都會被撤銷,而且數據庫中內容返回到事務開始以前所處的狀態。不管什麼狀況,在事務完成時,都能保證回到一致狀態。安全


4、什麼是觸發器?

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

clipboard.png

根據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;

5、觸發器分爲事前觸發和過後觸發,兩者有什麼區別?語句級觸發和行級觸發有什麼區別?

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


預告:本週三(3.6)將更新PHP面試MySQL數據庫的索引,敬請期待。spa

以上內容摘自《PHP程序員面試筆試寶典》書籍,目前本書沒有電子版,可到各大電商平臺購買紙質版。
圖片描述3d

更多PHP相關的面試知識、考題能夠關注公衆號獲取:琉憶編程庫
圖片描述

對本文有什麼問題或建議均可以進行留言,我將不斷完善追求極致,感謝大家的支持。

相關文章
相關標籤/搜索