史上最全的技術(shù)崗面試筆記——數(shù)據(jù)庫篇(上)
第二范式:滿足第一范式并且表中的非主鍵字段都依賴于主鍵字段。第三范式:滿足第二范式并且表中的非主鍵字段必須不傳遞依賴于主鍵字段,每一列數(shù)據(jù)和主鍵直接相關(guān)。事務(wù)具有四大特性:一致性、原子性、隔離性、持久性。原子性:原子性是指事務(wù)包含的所有操作要么全部成功,要么全部失敗回滾。一致性:事務(wù)開始前和結(jié)束后,數(shù)據(jù)庫的完整性約束沒有被破壞。比如A向B轉(zhuǎn)賬,不可能A扣了錢,B卻沒收到。隔離性:隔離性是當(dāng)多個用戶并發(fā)訪問數(shù)據(jù)庫時,比如操作同一張表時,數(shù)據(jù)庫為每一個用戶開啟的事務(wù),不能被其他事務(wù)的操作所干擾,多個并發(fā)事務(wù)之間要相互隔離。持久性:持久性是指一個事務(wù)一旦被提交了,那么對數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久性的。數(shù)據(jù)庫事務(wù)是指:幾個SQL語句,要么全部執(zhí)行成功,要么全部執(zhí)行失敗。比如銀行轉(zhuǎn)賬就是事務(wù)的典型場景。數(shù)據(jù)庫事務(wù)的三個常用命令:Begin Transaction、Commit Transaction、RollBackTransaction。視圖實際上是在數(shù)據(jù)庫中通過Select查詢語句從多張表中提取的多個表字段所組成的虛擬表。l 視圖并不占據(jù)物理空間,所以通過視圖查詢出的記錄并非保存在視圖中,而是保存在原表中。l 通過視圖可以對指定用戶隱藏相應(yīng)的表字段,起到保護(hù)數(shù)據(jù)的作用。l 在滿足一定條件時,可以通過視圖對原表中的記錄進(jìn)行增刪改操作。l 創(chuàng)建視圖時,只能使用單條select查詢語句。索引是對數(shù)據(jù)庫表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu),使用索引可快速訪問數(shù)據(jù)庫表中的特定信息。l 一張表可以有多個唯一索引和非聚集索引,但最多只能有一個聚集索引。l 合理的創(chuàng)建索引能夠提升查詢語句的執(zhí)行效率,但降低了新增、刪除操作的速度,同時也會消耗一定的數(shù)據(jù)庫物理空間。是一種快速查詢表中內(nèi)容的機(jī)制,類似于字典。運用在表中某個些字段上,但存儲時,獨立于表外。索引一旦建立,Oracle管理系統(tǒng)會對其進(jìn)行自動維護(hù),而且由Oracle管理系統(tǒng)決定何時使用索引。在定義primary key或unique約束后系統(tǒng)自動在想印的列上創(chuàng)建索引。用戶也能按自己的需求,對指定單個字段或多個字段,添加索引。● (1)表經(jīng)常進(jìn)行 SELECT 操作 ● (2)表很大(記錄超多),記錄內(nèi)容分布范圍很廣 ● (3)列名經(jīng)常在 WHERE 子句或連接條件中出現(xiàn)● (1)表經(jīng)常進(jìn)行 INSERT/UPDATE/DELETE 操作 ● (3)列名不經(jīng)常作為連接條件或出現(xiàn)在 WHERE 子句中● 索引降低了插入、刪除、修改等維護(hù)任務(wù)的速度(雖然索引可以提高查詢速度,但是它們也會導(dǎo)致數(shù)據(jù)庫系統(tǒng)更新數(shù)據(jù)的性能下降,因為大部分?jǐn)?shù)據(jù)更新需要同時更新索引) ● 唯一索引可以確保每一行數(shù)據(jù)的唯一性,通過使用索引,可以在查詢的過程中使用優(yōu)化隱藏器,提高系統(tǒng)的性能● 主鍵索引:為表定義一個主鍵將自動創(chuàng)建主鍵索引,主鍵索引是唯一索引的特殊類型。主鍵索引要求主鍵中的每個值是唯一的,并且不能為空 ● 聚集索引(Clustered):表中各行的物理順序與鍵值的邏輯(索引)順序相同,每個表只能有一個● 非聚集索引(Non-clustered):非聚集索引指定表的邏輯順序。數(shù)據(jù)存儲在一個位置,索引存儲在另一個位置,索引中包含指向數(shù)據(jù)存儲位置的指針。可以有多個,小于249個存儲過程是一個預(yù)編譯的SQL語句,優(yōu)點是允許模塊化的設(shè)計,就是說只需創(chuàng)建一次,以后在該程序中就可以調(diào)用多次。如果某次操作需要執(zhí)行多次SQL,使用存儲過程 比單純SQL語句執(zhí)行要快。讓編程語言進(jìn)行調(diào)用 存儲過程是一個預(yù)編譯的代碼塊,執(zhí)行效率比較高;一個存儲過程替代大量T_SQL語句 ,可以降低網(wǎng)絡(luò)通信量,提高通信速率。每個數(shù)據(jù)庫的存儲過程語法幾乎都不一樣,十分難以維護(hù)(不通用)業(yè)務(wù)邏輯放在數(shù)據(jù)庫上,難以迭代預(yù)編譯又稱為預(yù)處理,是做些代碼文本的替換工作。處理#開頭的指令,比如拷貝#include包含的文件代碼,#define宏定義的替換,條件編 譯等就是為編譯做的預(yù)備工作的階段主要處理#開始的預(yù)編譯指令。觸發(fā)器是一中特殊的存儲過程,主要是通過事件來觸發(fā)而被執(zhí)行的。它可以強(qiáng)化約束,來維護(hù)數(shù)據(jù)的完整性和一致性,可以跟蹤數(shù)據(jù)庫內(nèi)的操作從而不允許未經(jīng)許可的更新和變化??梢月?lián)級運算。如,某表上的觸發(fā)器上包含對另一個表的數(shù)據(jù)操作,而該操作又會導(dǎo)致該表觸發(fā)器被觸發(fā)。7.寫出一條Sql語句:取出表A中第31到第40記錄 (MS-SQLServer) 解1:select top 10 * from A where id not in (select top 30 id from A)解2:select top 10 * from A where id > (select max(id) from (select top 30 id from A)as A)解3:select * from (select *, Row_Number() OVER (ORDER BY id asc) rowid FROMA) as A where rowid between 31 and 408.寫出一條Sql語句:取出表A中第31到第40記錄 (Mysql) select * from A limit 30, 109.寫出一條Sql語句:取出表A中第31到第40記錄 (Oracle) select *row_number() over (order by id asc) rank where rank >=31 AND rank<=40;
在關(guān)系型數(shù)據(jù)庫中如何描述多對多的關(guān)系? 在關(guān)系型數(shù)據(jù)庫中描述多對多的關(guān)系,需要建立第三張數(shù)據(jù)表。比如學(xué)生選課,需要在學(xué)生信息表和課程信息表的基礎(chǔ)上,再建立選課信息表,該表中存放學(xué)生Id和課程Id。什么是數(shù)據(jù)庫約束,常見的約束有哪幾種? 數(shù)據(jù)庫約束用于保證數(shù)據(jù)庫表數(shù)據(jù)的完整性(正確性和一致性)??梢酝ㄟ^定義約束\索引\觸發(fā)器來保證數(shù)據(jù)的完整性。空值約束:not null;用于控制字段的值范圍。Sum:求和\ Avg:求平均數(shù)\ Max:求最大值\ Min:求最小值\ Count:求記錄數(shù)什么是內(nèi)聯(lián)接、左外聯(lián)接、右外聯(lián)接? l 內(nèi)聯(lián)接(Inner Join):匹配2張表中相關(guān)聯(lián)的記錄。l 左外聯(lián)接(Left Outer Join):除了匹配2張表中相關(guān)聯(lián)的記錄外,還會匹配左表中剩余的記錄,右表中未匹配到的字段用NULL表示。l 右外聯(lián)接(Right Outer Join):除了匹配2張表中相關(guān)聯(lián)的記錄外,還會匹配右表中剩余的記錄,左表中未匹配到的字段用NULL表示。在判定左表和右表時,要根據(jù)表名出現(xiàn)在Outer Join的左右位置關(guān)系。如何在刪除主表記錄時,一并刪除從表相關(guān)聯(lián)的記錄?如果兩張表存在主外鍵關(guān)系,那么在刪除主鍵表的記錄時,如果從表有相關(guān)聯(lián)的記錄,那么將導(dǎo)致刪除失敗。在定義外鍵約束時,可以同時指定3種刪除策略:一是將從表記錄一并刪除(級聯(lián)刪除);二是將從表記錄外鍵字段設(shè)置為NULL;三是將從表記錄外鍵字段設(shè)置為默認(rèn) 值。級聯(lián)是用來設(shè)計一對多關(guān)系的。例如一個表存放老師的信息:表A(姓名,性別,年齡),姓名為主鍵。還有一張表存放老師所教的班級信息:表B(姓名,班級)。他們 通過姓名來級聯(lián)。級聯(lián)的操作有級聯(lián)更新,級聯(lián)刪除。在啟用一個級聯(lián)更新選項后,就可在存在相匹配的外鍵值的前提下更改一個主鍵值。系統(tǒng)會相應(yīng)地更新所有匹配的外鍵值。如果在表A中將姓名為張三的記錄改為李四,那么表B中的姓名為張三的所有記錄也會隨著改為李四。級聯(lián)刪除與更新相類似。如果在表A中將姓名為張三的記錄刪除,那么表B中的姓名為張三的所有記錄也將刪除。級聯(lián)刪除示例:foreign key(字段名) references 主表名(字段名)超鍵:在關(guān)系中能唯一標(biāo)識元組的屬性集稱為關(guān)系模式的超鍵。一個屬性可以為作為一個超鍵,多個屬性組合在一起也可以作為一個超鍵。超鍵包含候選鍵和主鍵。候選鍵(候選碼):是最小超鍵,即沒有冗余元素的超鍵。主鍵(主碼):數(shù)據(jù)庫表中對儲存數(shù)據(jù)對象予以唯一和完整標(biāo)識的數(shù)據(jù)列或?qū)傩缘慕M 合。一個數(shù)據(jù)列只能有一個主鍵,且主鍵的取值不能缺失,即不能為空值(Null)。外鍵:在一個表中存在的另一個表的主鍵稱此表的外鍵。例子:郵寄地址(城市名,街道名,郵政編碼,單位名,收件人)● 它有兩個候選鍵:{城市名,街道名} 和 {街道名,郵政編碼}● 如果我選取{城市名,街道名}作為唯一標(biāo)識實體的屬性,那么{城市名,街道名}就是主碼(主鍵)Char是一種固定長度的類型,varchar是一種可變長度的類型如果存進(jìn)去的是‘csdn’,那么char所占的長度依然為10,除了字符‘csdn’外,后面跟六個空格,varchar就立馬把長度變?yōu)?了,取數(shù)據(jù)的時候,char類型的要用trim()去掉多余的空格,而varchar是不需要的。char的存取數(shù)度還是要比varchar要快得多,因為其長度固定,方便程序的存儲與查找。b+數(shù)的查找過程如圖所示,如果要查找數(shù)據(jù)項29,那么首先會把磁盤塊1由磁盤加載到內(nèi)存,此時發(fā)生一次IO,在內(nèi)存中用二分查找確定29在17和35之間,鎖定磁盤塊1的P2指針,內(nèi)存時間因為非常短(相比磁盤的IO)可以忽略不計,通過磁盤塊1的P2指針的磁盤地址把磁盤塊3由磁盤加載到內(nèi)存,發(fā)生第二次IO,29在26和30之間,鎖定磁盤塊3的P2指針,通過指針加載磁盤塊8到內(nèi)存,發(fā)生第三次IO,同時內(nèi)存中做二分查找找到29,結(jié)束查詢,總計三次IO。真實的情況是,3層的b+樹可以表示上百萬的數(shù)據(jù),如果上百萬的數(shù)據(jù)查找只需要三次IO,性能提高將是巨大的,如果沒有索引,每個數(shù)據(jù)項都要發(fā)生一次IO,那么總共需要百萬次的IO,顯然成本非常非常高。1.通過上面的分析,我們知道IO次數(shù)取決于b+數(shù)的高度h,假設(shè)當(dāng)前數(shù)據(jù)表的數(shù)據(jù)為N,每個磁盤塊的數(shù)據(jù)項的數(shù)量是m,則有h=㏒(m+1)N,當(dāng)數(shù)據(jù)量N一定的情況下,m越大,h越??;而m = 磁盤塊的大小 / 數(shù)據(jù)項的大小,磁盤塊的大小也就是一個數(shù)據(jù)頁的大小,是固定的,如果數(shù)據(jù)項占的空間越小,數(shù)據(jù)項的數(shù)量越多,樹的高度越低。這就是為什么每個數(shù)據(jù)項,即索引字段要盡量的小,比如int占4字節(jié),要比bigint8字節(jié)少一半。這也是為什么b+樹要求把真實的數(shù)據(jù)放到葉子節(jié)點而不是內(nèi)層節(jié)點,一旦放到內(nèi)層節(jié)點,磁盤塊的數(shù)據(jù)項會大幅度下降,導(dǎo)致樹增高。當(dāng)數(shù)據(jù)項等于1時將會退化成線性表。當(dāng)b+樹的數(shù)據(jù)項是復(fù)合的數(shù)據(jù)結(jié)構(gòu),比如(name,age,sex)的時候,b+數(shù)是按照從左到右的順序來建立搜索樹的,比如當(dāng)(張三,20,F)這樣的數(shù)據(jù)來檢索的時候,b+樹會優(yōu)先 比較name來確定下一步的所搜方向,如果name相同再依次比較age和sex,最后得到檢索的數(shù)據(jù);但當(dāng)(20,F)這樣的沒有name的數(shù)據(jù)來的時候,b+樹就不知道下一步該查哪個節(jié)點,因為建立搜索樹的時候name就是第一個比較因子,必須要先根據(jù)name來搜索才能知道下一步去哪里查詢。比如當(dāng)(張三,F)這樣的數(shù)據(jù)來檢索時,b+樹可以用name來指定搜索方向,但下一個字段age的缺失,所以只能把名字等于張三的數(shù)據(jù)都找到,然后再匹配性別是F的數(shù)據(jù)了, 這個是非常重要的性質(zhì),即索引的最左匹配特性。B+樹的表示要比B樹要“胖”,原因在于B+樹中的非葉子節(jié)點會冗余一份在葉子節(jié)點中,并且葉子節(jié)點之間用指針相連。最后,也歡迎大家關(guān)注這位同學(xué)的Github:https://github.com/TG-yang。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。