資料庫經典問題,資料庫經典
1、預存程序的優點是什嗎? 預存程序的優點: 1.提高效能 2.減輕網路擁塞 3.一致性較好 4.改善安全機制
2、什麼是觸發器?觸發器有哪幾種?觸發器有什麼優點?
一個觸發器是由T-SQL語句集組成的代碼塊,在響應某些動作時啟用該語句集
有insert,delete,update觸發器
它防止了對資料的不正確、未授權的和不一致的改變
3、常見的幾種約束有哪些?分別代表什麼意思?如何使用?
1)實體完整性:主鍵保證了實體完整性,一個表只有一個主鍵,但一個主鍵可有包含多個欄位,主鍵欄位不可為空
2)參照完整性:外鍵保證了參考完整性,一個表可以有多個外鍵
3)使用者定義完整性:CHECK保證了值域完整性, 一個表中可以有多個檢查性約束
4、事務:是一系列的資料庫操作,是資料庫應用的基本邏輯單位。
事務性質:ACID特性
原子性(Atomicity):事務的所有操作在資料庫中要麼全部正確的反映出來,要麼完全不反映;
一致性(Consistency):執行前後資料保持一致,比如,轉帳系統執行前後,兩者的總錢數保持一致;
隔離性(Isolation):儘管多個事務可能並發執行,但執行的結果與某個串列執行相同,因此,每個事務都感覺不到系統中其他事務在並發執行,隔離性是並發控制的主要任務;
持久性(Durability)一個事務成功執行完成後,它對資料庫的改變必須是永久的,即使出現系統故障,持久性是恢複系統的主要任務
5、內聯結與外聯結
內串連是保證兩個表中所有的行都要滿足串連條件,而外串連則不然。在外串連中,某些不滿條件的列也會顯示出來,也就是說,只限制其中一個表的行,而不限制另一個表的行。分左串連、右串連、全串連三種
6、視圖
視圖是資料庫資料的特定子集。可以禁止所有使用者訪問資料庫表,而要求使用者只能通過視圖操作資料,這種方法可以保護使用者和應用程式不受某些資料庫修改的影響。2.視圖是抽象的,他在使用時,從表裡提取出資料,形成虛的表。 視圖沒有自己的資料,當使用者操作視圖時,資料庫才把相應的操作轉化為對應表的操作,視圖僅僅是預先定義好的一些SQL操作,它是在基本表之上建立的表,它的結構(即所定義的列)和內容(即所有資料行)都來自基本表,它依據基本表存在而存在。一個視圖可以對應一個基本表,也可以對應多個基本表。
7、索引:參考文獻
優點:
第一,可以大大加快 資料的檢索速度,這也是建立索引的最主要的原因。
第二,通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。
缺點:
第一,建立索引和維護索引要耗費時間,這種時間隨著資料 量的增加而增加。
第二,索引需要佔物理空間,除了資料表占資料空間之外,每一個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。
第三,當對錶中的資料進行增加、刪除和修改的時候,索引也要動態維護,這樣就降低了資料的維護速度。
索引是建立在資料庫表中的某些列的上面。因此,在建立索引的時候,應該仔細考慮在哪些列上可以建立索引,在哪些列上不能建立索引。一般來說,應該在這些列 上建立索引,例如:
在經常需要搜尋的列上,可以加快搜尋的速度;
在作為主鍵的列上,強制該列的唯一性和組織表中資料的排列結構;
在經常用在串連的列上,這 些列主要是一些外鍵,可以加快串連的速度;
在經常需要根據範圍進行搜尋的列上建立索引,因為索引已經排序,其指定的範圍是連續的;
在經常需要排序的列上創 建索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;
在經常使用在WHERE子句中的列上面建立索引,加快條件的判斷速度。
同樣,對於有些列不應該建立索引。一般來說,不應該建立索引的的這些列具有下列特點:
第一,對於那些在查詢中很少使用或者參考的列不應該建立索引。這是因 為,既然這些列很少使用到,因此有索引或者無索引,並不能提高查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。
第二,對於那 些只有很少資料值的列也不應該增加索引。這是因為,由於這些列的取值很少,例如人事表的性別列,在查詢的結果中,結果集的資料行佔了表中資料行的很大比 例,即需要在表中搜尋的資料行的比例很大。增加索引,並不能明顯加快檢索速度。
第三,對於那些定義為text, image和bit資料類型的列不應該增加索引。這是因為,這些列的資料量要麼相當大,要麼取值很少。
第四,當修改效能遠遠大於檢索效能時,不應該建立索 引。這是因為,修改效能和檢索效能是互相矛盾的。當增加索引時,會提高檢索效能,但是會降低修改效能。當減少索引時,會提高修改效能,降低檢索效能。因 此,當修改效能遠遠大於檢索效能時,不應該建立索引。
索引的幾種方式
1、順序索引(基本不用)2、B+樹索引(最常用,如mysql的InnoDB)3、hash索引(用的不多)
8、SQL標準定義的四個隔離等級(都是與事務相關的) 參考
通過一些現象,可以反映出隔離等級的效果。這些現象有:
1、更新丟失(lost update):當系統允許兩個事務同時更新同一資料是,發生更新丟失。
2、髒讀(dirty read):當一個事務讀取另一個事務尚未提交的修改時,產生髒讀。
3、非重複讀(nonrepeatableread):同一查詢在同一事務中多次進行,由於其他提交事務所做的修改或刪除,每次返回不同的結果集,此時發生非重複讀。
4、幻像(phantom read):同一查詢在同一事務中多次進行,由於其他提交事務所做的插入操作,每次返回不同的結果集,此時發生幻像讀。
下面是隔離等級及其對應的可能出現或不可能出現的現象
|
Dirty Read |
NonRepeatable Read |
Phantom Read |
Read uncommitted |
Possible |
Possible |
Possible |
Read committed |
Not possible |
Possible |
Possible |
Repeatable read |
Not possible |
Not possible |
Possible |
Serializable |
Not possible |
Not possible |
Not possible |
ORACLE的隔離等級 ORACLE提供了SQL92標準中的readcommitted和serializable
mysql的InnoDB儲存引擎預設支援的隔離等級是Repeatable read
在標準SQL規範中,定義了4個交易隔離等級,不同的隔離等級對事務的處理不同:
◆未授權讀取(Read Uncommitted):允許髒讀取,但不允許更新丟失。如果一個事務已經開始寫資料,則另外一個事務則不允許同時進行寫操作,但允許其他事務讀此行資料。該隔離等級可以通過“排他寫鎖”實現。
◆授權讀取(Read Committed):允許不可重複讀取,但不允許髒讀取。這可以通過“瞬間共用讀鎖”和“排他寫鎖”實現。讀取資料的事務允許其他事務繼續訪問該行資料,但是未提交的寫事務將會禁止其他事務訪問該行。
◆可重複讀取(Repeatable Read):禁止不可重複讀取和髒讀取,但是有時可能出現幻影資料。這可以通過“共用讀鎖”和“排他寫鎖”實現。讀取資料的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。
◆序列化(Serializable):提供嚴格的事務隔離。它要求事務序列化執行,事務只能一個接著一個地執行,但不能並發執行。如果僅僅通過“行級鎖”是無法實現事務序列化的,必須通過其他機制保證新插入的資料不會被剛執行查詢操作的事務訪問到。
隔離等級越高,越能保證資料的完整性和一致性,但是對並發效能的影響也越大,通過選用不同的隔離等級就可以在不同程度上避免前面所提及的在交易處理中所面臨的各種問題。所以,資料庫隔離等級的選取就顯得尤為重要,在選取資料庫的隔離等級時,應該注意以下幾個處理的原則:
首先,必須排除“未授權讀取”,因為在多個事務之間使用它將會是非常危險的。事務的復原操作或失敗將會影響到其他並發事務。第一個事務的復原將會完全將其他事務的操作清除,甚至使資料庫處在一個不一致的狀態。很可能一個已復原為結束的事務對資料的修改最後卻修改提交了,因為“未授權讀取”允許其他事務讀取資料,最後整個錯誤狀態在其他事務之間傳播開來。
其次,絕大部分應用都無須使用“序列化”隔離(一般來說,讀取幻影資料並不是一個問題),此隔離等級也難以測量。目前使用序列化隔離的應用中,一般都使用悲觀鎖,這樣強行使所有事務都序列化執行。
剩下的也就是在“授權讀取”和“可重複讀取”之間選擇了。我們先考慮可重複讀取。如果所有的資料訪問都是在統一的原子資料庫事務中,此隔離等級將消除一個事務在另外一個並發事務過程中覆蓋資料的可能性(第二個事務更新丟失問題)。這是一個非常重要的問題,但是使用可重複讀取並不是解決問題的唯一途徑。
9、叢集索引與非叢集索引
聚簇索引是一種對磁碟上實際資料重新組織以按指定的一個或多個列的值排序。由於聚簇索引的索引頁面指標指向資料頁面,所以使用聚簇索引尋找資料幾乎總是比使用非聚簇索引快。每張表只能建一個聚簇索引,在聚簇索引下,資料在物理上按順序排在資料頁上,重複值也排在一起,因而在那些包含範圍檢查(between、<、<=、& gt;、>=)或使用groupby或order by的查詢時,一旦找到具有範圍中第一個鍵值的行,具有後續索引值的行保證物理上毗連在一起而不必進一步搜尋,避免了大範圍掃描,可以大大提高查詢速度。
10、記錄檔 redo 和 undo的作用
在事務T開始開始之前,日誌中寫入記錄<T start>,執行過程中,T執行任何write(X)操作前先要向日誌中寫入適當的新的記錄,當T提交時,日誌中寫入記錄<T commit>,總的來說就是先寫日誌,後更新記錄。
在這裡我們先說恢複的一般方法:
(1)正向掃描記錄檔(從頭到尾),找出故障發生前已經提交的事務(存在begin transaction和commit記錄),將其標識記入重做(redo)隊列。同時找出故障發生時未完成的事務(只有begin transaction,沒commit),將其標識記入(undo)隊列
(2)對undo隊列的各事務進行撤銷處理。進行undo的處理方法是,反向掃描記錄檔,對每個undo事務的更新操作執行反操作,即將日誌記錄中“更新前的值”寫入資料庫。
(3)對重做日誌中的各事務進行重做操作。進行redo的處理方法是,正向掃描日誌,對每個redo事務重新執行記錄檔登記操作。即將日誌中“更新後的值”寫入資料庫。
經典資料庫問題
問題1
select idCard,count(*) from carApplyDetail group by idCard having count(*)>1
問題2
對不起,沒想起來怎麼用一條語句更新兩個表,或者用兩條語句,或者在資料庫中寫一個觸發事件。
問題3
select applydate,count(*) as shul from cardapply group by applydate order by shul desc
唉,就這樣吧,第一條記錄就是那個最多的,
雖然記錄多了點
對於Sql Server資料庫的一個經典問題??
SQL Server 中叫“關係”(relation),和視圖沒有直接關係。
“關係”一般用作資料完整性檢查,比如表T1中的欄位F11和表T2中的F21欄位關聯,可以約束兩個表中的資料在儲存資料時,始終保持資料是對應的,另外也可以設定“串聯刪除”,即刪除主表中的某一條記錄,自動刪除字表中的相關記錄。
表之間的“關係”和查詢沒有任何關係,查詢時仍然要指定邏輯關聯關係。