數據庫MS
1、數據庫的三范式是什么?
第一范式:表中每個字段不能再分
第二范式:滿足第一范式並且表中的非主鍵字段都依賴與主鍵字段(消除了部分依賴)
第三范式:滿足第二范式並且表中的非主鍵字段必須直接依賴於主鍵字段
2、什么是數據庫的事務?
事務具有四大特性:原子性,一致性,隔離性,持久性
數據庫的事務是指:幾個SQL語句,要么全部執行成功,要么全部執行失敗。比如銀行轉賬問題。
數據庫事務的三個常用指令:Begin Transaction、Commit Transaction、Rollback Transaction
3、什么是視圖?
視圖實際上是在數據庫中通過Select查詢語句從多張表中提取的多個表字段組成的虛擬表。
視圖不占用物理空間,所以通過視圖查詢出的記錄並非存儲在視圖中,而是在原表中。
視圖可以通過指定用戶隱藏相應的表字段,起到保護數據的作用
在滿足一定條件的情況下,可以通過視圖對原表中的數據進行增刪改。
創建視圖時,只能使用單條select查詢語句。
1、插入記錄
通過視圖插入數據與直接向表中插入數據一樣,但通過視圖插入數據時引用的字段為視圖中的字段,和表中字段不一定完全相同,故有如下規則:
1)使用插入語句的用戶必須擁有在基本表中插入數據的權限。
4)若視圖中包含有統計函數結果或多個字段值的組合,操作失敗。
5)若視圖中使用了distinct,group by短句,操作失敗。
7)對多表連接的視圖來講,一個插入語句只能對單獨某個表的字段進行操作。
8)其他的遵守數據庫插入語句標准
刪除記錄
同數據表的刪除操作,但就注意如下:
1)通過視圖刪除數據將最終體現為從基表中刪除數據。 當一個視圖由兩個以上基表構成時,不允許刪除視圖中的數據。
2)若視圖中的字段是常數或統計結果的話,允許執行delete操作,但不允許insert或update操作。
4、什么是索引?
索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可以快速訪問數據庫中的一些信息
索引分為:聚簇索引,非聚簇索引,唯一索引等
一張表可以包含多個唯一索引和非聚簇索引,但是更多的是一個聚簇索引
索引可以包含多列
合理的創建索引能夠提高查詢語句的執行效率,但是降低增加、刪除的效率 同時消耗一定的物理空間。
mysql中的索引
mysql中普遍使用B+Tree做索引,但在實現上又根據聚簇索引和非聚簇索引而不同。
聚簇索引
所謂聚簇索引,就是指主索引文件和數據文件為同一份文件,聚簇索引主要用在Innodb存儲引擎中。在該索引實現方式中B+Tree的葉子節點上的data就是數據本身,key為主鍵,如果是一般索引的話,data便會指向對應的主索引,如下圖所示:
在B+Tree的每個葉子節點增加一個指向相鄰葉子節點的指針,就形成了帶有順序訪問指針的B+Tree。做這個優化的目的是為了提高區間訪問的性能,例如圖4中如果要查詢key為從18到49的所有數據記錄,當找到18后,只需順着節點和指針順序遍歷就可以一次性訪問到所有數據節點,極大提到了區間查詢效率。
非聚簇索
非聚簇索引就是指B+Tree的葉子節點上的data,並不是數據本身,而是數據存放的地址。主索引和輔助索引沒啥區別,只是主索引中的key一定得是唯一的。主要用在MyISAM存儲引擎中,如下圖:
非聚簇索引比聚簇索引多了一次讀取數據的IO操作,所以查找性能上會差。
性能比較
B-Tree:如果一次檢索需要訪問4個節點,數據庫系統設計者利用磁盤預讀原理,把節點的大小設計為一個頁,那讀取一個節點只需要一次I/O操作,完成這次檢索操作,最多需要3次I/O(根節點常駐內存)。數據記錄越小,每個節點存放的數據就越多,樹的高度也就越小,I/O操作就少了,檢索效率也就上去了。
B+Tree:非葉子節點只存key,大大滴減少了非葉子節點的大小,那么每個節點就可以存放更多的記錄,樹更矮了,I/O操作更少了。所以B+Tree擁有更好的性能。
5、什么是存儲過程
存儲過程是一個預編譯的SQL語句,優點是允許模塊化設計,就是只需設計一次,可以使用多次。簡單的說,就是一組SQL語句集,功能強大,可以實現一些比較復雜的邏輯功能。
6、什么是觸發器?
觸發器是一種特殊的存儲過程,主要是通過事件來觸發而執行的,它可以強化約束,來維護數據的完整性和一致性,可以跟蹤數據庫內的操作從而不允許未經許可的更新和變化。可以級聯運算,如,某表上的觸發器有對另一個表的數據操作,而該操作會導致該表的觸發器被觸發。
10. 在關系型數據庫中如何描述多對多的關系?
在關系型數據庫中描述多對多的關系,需要建立第三張數據表。比如學生選課,需要在學生信息表和課程信息表的基礎上,再建立選課信息表,該表中存放學生Id和課程Id。
11. 什么是數據庫約束,常見的約束有哪幾種?
數據庫約束用於保證數據庫表數據的完整性(正確性和一致性)。可以通過定義約束\索引\觸發器來保證數據的完整性。
總體來講,約束可以分為:
主鍵約束:primary key;
外鍵約束:foreign key;
唯一約束:unique;
檢查約束:check;
空值約束:not null;
默認值約束:default
15. 什么是游標?
游標實際上是一種能從包括多條數據記錄的結果集中每次提取一條記錄進行處理的機制。
游標的使用步驟:
- 定義游標:declare cursor 游標名稱 for select查詢語句 [for {readonly|update}]
- 打開游標:open cursor
- 從游標中操作數據:fetch... ... current of cursor
- 關閉游標:close cursor
16、drop,delete與truncate的區別
drop直接刪掉表
truncate刪除表中數據,再插入時自增長id又從1開始
delete刪除表中數據,可以加where字句
17.內聯接,外聯接區別
內連接是保證兩個表中所有的行都要滿足連接條件,而外連接則不然。
在外連接中,某些不滿條件的列也會顯示出來,也就是說,只限制其中一個表的行,而不限制另一個表的行。分左連接、右連接、全連接三種
使用更加具體的文字形式進行描述
對於Table A
和Table B
,兩者指定的公共列元組集合為COM
,其中Table A
中獨有的公共列的元組集合為UA
,Table B
中獨有的公共列元組集合為UB
。
左連接:A x B | (UA U
COM),B中不含有的值置為空,注意公共部分COM
需要進行求笛卡爾積
右連接:A x B | (UB U
COM),A中沒有的值置為空,注意公共部分COM
需要進行求笛卡爾積
內連接:A x B | (COM),
全連接:A x B | (UB U
COM u UA),A或B中沒有的值置為空,注意公共部分COM
需要進行求笛卡爾積
18. 鎖:共享鎖、互斥鎖
兩段鎖協議:階段1:加鎖階段 (生長階段)階段2:解鎖階段(半衰階段)
加鎖階段:在該階段可以進行加鎖操作。在對任何數據進行讀操作之前要申請並獲得S鎖,在進行寫操作之前要申請並獲得X鎖。加鎖不成功,則事務進入等待狀態,直到加鎖成功才繼續執行。
解鎖階段:當事務釋放了一個封鎖以后,事務進入解鎖階段,在該階段只能進行解鎖操作不能再進行加鎖操作。
兩段封鎖法可以這樣來實現:事務開始后就處於加鎖階段,一直到執行ROLLBACK和COMMIT之前都是加鎖階段。ROLLBACK和COMMIT使事務進入解鎖階段,即在ROLLBACK和COMMIT模塊中DBMS釋放所有封鎖。