數(shù)據(jù)庫面試題
1、什么是數(shù)據(jù)庫索引?
????索引是對數(shù)據(jù)庫表中一列或多列的值進行排序的一種結(jié)構(gòu),使用索引可快速訪問數(shù)據(jù)庫表中的特定信息。如果想按特定職員的姓來查找他或她,則與在表中搜索所有的行相比,索引有助于更快地獲取信息。
????索引的一個主要目的就是加快檢索表中數(shù)據(jù)的方法,亦即能協(xié)助信息搜索者盡快的找到符合限制條件的記錄ID的輔助數(shù)據(jù)結(jié)構(gòu)。
優(yōu)點:
通過創(chuàng)建唯一性索引,可以保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性。
可以大大加快數(shù)據(jù)的檢索速度,這也是創(chuàng)建索引的最主要的原因。
可以加速表和表之間的連接,特別是在實現(xiàn)數(shù)據(jù)的參考完整性方面特別有意義。
在使用分組和排序子句進行數(shù)據(jù)檢索時,同樣可以顯著減少查詢中分組和排序的時間。
通過使用索引,可以在查詢的過程中,使用優(yōu)化隱藏器,提高系統(tǒng)的性能。缺點:
創(chuàng)建索引和維護索引要耗費時間,這種時間隨著數(shù)據(jù)量的增加而增加。
索引需要占物理空間,除了數(shù)據(jù)表占數(shù)據(jù)空間之外,每一個索引還要占一定的物理空間,如果要建立聚簇索引,那么需要的空間就會更大。
當對表中的數(shù)據(jù)進行增加、刪除和修改的時候,索引也要動態(tài)的維護,這樣就降低了數(shù)據(jù)的維護速度。添加索引原則
在查詢中很少使用或者參考的列不應該創(chuàng)建索引。這是因為,既然這些列很少使用到,因此有索引或者無索引,并不能提高查詢速度。相反,由于增加了索引,反而降低了系統(tǒng)的維護速度和增大了空間需求。
只有很少數(shù)據(jù)值的列也不應該增加索引。這是因為,由于這些列的取值很少,例如人事表的性別列,在查詢的結(jié)果中,結(jié)果集的數(shù)據(jù)行占了表中數(shù)據(jù)行的很大比例,即需要在表中搜索的數(shù)據(jù)行的比例很大。增加索引,并不能明顯加快檢索速度。
定義為text、image和bit數(shù)據(jù)類型的列不應該增加索引。這是因為,這些列的數(shù)據(jù)量要么相當大,要么取值很少。
當修改性能遠遠大于檢索性能時,不應該創(chuàng)建索引。這是因為,修改性能和檢索性能是互相矛盾的。當增加索引時,會提高檢索性能,但是會降低修改性能。當減少索引時,會提高修改性能,降低檢索性能。因此,當修改性能遠遠大于檢索性能時,不應該創(chuàng)建索引。
2、inner join和left join
left join(左聯(lián)接) 返回包括左表中的所有記錄和右表中聯(lián)結(jié)字段相等的記錄 。
right join(右聯(lián)接) 返回包括右表中的所有記錄和左表中聯(lián)結(jié)字段相等的記錄。
inner join(等值連接) 只返回兩個表中聯(lián)結(jié)字段相等的行。
3、數(shù)據(jù)庫事務(wù)
????事務(wù)(Transaction)是由一系列對系統(tǒng)中數(shù)據(jù)進行訪問與更新的操作所組成的一個程序執(zhí)行邏輯單元。事務(wù)是DBMS中最基礎(chǔ)的單位,事務(wù)不可分割。事務(wù)具有4個基本特征,分別是:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Duration),簡稱ACID。
1)原子性(Atomicity)
原子性是指事務(wù)包含的所有操作要么全部成功,要么全部失敗回滾,[刪刪刪]因此事務(wù)的操作如果成功就必須要完全應用到數(shù)據(jù)庫,如果操作失敗則不能對數(shù)據(jù)庫有任何影響。
2)一致性(Consistency)
一致性是指事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另一個一致性狀態(tài),也就是說一個事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)。
3)隔離性(Isolation)
隔離性是當多個用戶并發(fā)訪問數(shù)據(jù)庫時,比如操作同一張表時,數(shù)據(jù)庫為每一個用戶開啟的事務(wù),不能被其他事務(wù)的操作所干擾,多個并發(fā)事務(wù)之間要相互隔離。即要達到這么一種效果:對于任意兩個并發(fā)的事務(wù)T1和T2,在事務(wù)T1看來,T2要么在T1開始之前就已經(jīng)結(jié)束,要么在T1結(jié)束之后才開始,這樣每個事務(wù)都感覺不到有其他事務(wù)在并發(fā)地執(zhí)行。多個事務(wù)并發(fā)訪問時,事務(wù)之間是隔離的,一個事務(wù)不應該影響其它事務(wù)運行效果。這指的是在并發(fā)環(huán)境中,當不同的事務(wù)同時操縱相同的數(shù)據(jù)時,每個事務(wù)都有各自的完整數(shù)據(jù)空間。由并發(fā)事務(wù)所做的修改必須與任何其他并發(fā)事務(wù)所做的修改隔離。
不同的隔離級別:
Read Uncommitted(讀取未提交[添加中文釋義]內(nèi)容):最低的隔離級別,什么都不需要做,一個事務(wù)可以讀到另一個事務(wù)未提交的結(jié)果。所有的并發(fā)事務(wù)問題都會發(fā)生。
Read Committed(讀取提交內(nèi)容):只有在事務(wù)提交后,其更新結(jié)果才會被其他事務(wù)看見??梢越鉀Q臟讀問題。
Repeated Read(可重復讀):在一個事務(wù)中,對于同一份數(shù)據(jù)的讀取結(jié)果總是相同的,無論是否有其他事務(wù)對這份數(shù)據(jù)進行操作,以及這個事務(wù)是否提交。可以解決臟讀、不可重復讀。
Serialization(可串行化):事務(wù)串行化執(zhí)行,隔離級別最高,犧牲了系統(tǒng)的并發(fā)性??梢越鉀Q并發(fā)事務(wù)的所有問題。
4)持久性(Durability)
持久性是指一個事務(wù)一旦被提交了,那么對數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久性的,即便是在數(shù)據(jù)庫系統(tǒng)遇到故障的情況下也不會丟失提交事務(wù)的操作。
4、數(shù)據(jù)庫的三大范式
第一范式:當關(guān)系模式R的所有屬性都不能再分解為更基本的數(shù)據(jù)單位時,稱R是滿足第一范式,即屬性不可分
第二范式:如果關(guān)系模式R滿足第一范式,并且R得所有非主屬性都完全依賴于R的每一個候選關(guān)鍵屬性,稱R滿足第二范式
第三范式:設(shè)R是一個滿足第一范式條件的關(guān)系模式,X是R的任意屬性集,如果X非傳遞依賴于R的任意一個候選關(guān)鍵字,稱R滿足第三范式,即非主屬性不傳遞依賴于鍵碼
5、數(shù)據(jù)庫連接泄露的含義
????數(shù)據(jù)庫連接泄露指的是如果在某次使用或者某段程序中沒有正確地關(guān)閉Connection、Statement和ResultSet資源,那么每次執(zhí)行都會留下一些沒有關(guān)閉的連接,這些連接失去了引用而不能得到重新使用,因此就造成了數(shù)據(jù)庫連接的泄漏。數(shù)據(jù)庫連接的資源是寶貴而且是有限的,如果在某段使用頻率很高的代碼中出現(xiàn)這種泄漏,那么數(shù)據(jù)庫連接資源將被耗盡,影響系統(tǒng)的正常運轉(zhuǎn)。
6、數(shù)據(jù)庫中的聚類查詢
????聚集索引中鍵值的邏輯順序決定了表中相應行的物理順序。聚集索引確定表中數(shù)據(jù)的物理順序。聚集索引類似于電話簿,后者按姓氏排列數(shù)據(jù)。由于聚集索引規(guī)定數(shù)據(jù)在表中的物理存儲順序,因此一個表只能包含一個聚集索引。但該索引可以包含多個列(組合索引),就像電話簿按姓氏和名字進行組織一樣。聚集索引對于那些經(jīng)常要搜索范圍值的列特別有效。使用聚集索引找到包含第一個值的行后,便可以確保包含后續(xù)索引值的行在物理相鄰。例如,如果應用程序執(zhí)行的一個查詢經(jīng)常檢索某一日期范圍內(nèi)的記錄,則使用聚集索引可以迅速找到包含開始日期的行,然后檢索表中所有相鄰的行,直到到達結(jié)束日期。這樣有助于提高此類查詢的性能。同樣,如果對從表中檢索的數(shù)據(jù)進行排序時經(jīng)常要用到某一列,則可以將該表在該列上聚集(物理排序),避免每次查詢該列時都進行排序,從而節(jié)省成本。當索引值唯一時,使用聚集索引查找特定的行也很有效率。
7、數(shù)據(jù)庫事務(wù)、主鍵與外鍵的區(qū)別?
數(shù)據(jù)庫的事務(wù):事務(wù)即用戶定義的一個數(shù)據(jù)庫操作序列,這些操作要么全做要全不做,是一個不可分割的工作單位,它具有四個特性,ACID,原子性,一致性,隔離性,持續(xù)性。
主鍵是能確定一條記錄的唯一標識,比如,一條記錄包括身份正號,姓名,年齡。
外鍵用于與另一張表的關(guān)聯(lián)。是能確定另一張表記錄的字段,用于保持數(shù)據(jù)的一致性。
8、請問count和sum的區(qū)別,以及count(*)和count(列名)的區(qū)別
Count和sum區(qū)別:求和用累加sum(),求行的個數(shù)用累計count
Count(*)包括了所有的列,在統(tǒng)計結(jié)果的時候不會忽略列值為null
Count(列名)只包括列名那一項,會忽略列值為空的計數(shù)
9、請問什么是臟讀?
????臟讀就是指當一個事務(wù)正在訪問數(shù)據(jù),并且對數(shù)據(jù)進行了修改,但是還沒有來得及提交到數(shù)據(jù)庫中,這時,另一個事務(wù)也訪問這個數(shù)據(jù),然后使用了這個數(shù)據(jù)
10、請問什么是幻讀?
????幻讀指的是一個事務(wù)在前后兩次查詢同一個范圍的時候,后一次查詢看到了前一次查詢沒有看到的數(shù)據(jù)行。
11、請問SQL優(yōu)化方法有哪些
通過建立索引對查詢進行優(yōu)化
對查詢進行優(yōu)化,應盡量避免全表掃描
調(diào)整數(shù)據(jù)結(jié)構(gòu)的設(shè)計,對于經(jīng)常訪問的數(shù)據(jù)庫表建立索引
調(diào)整SQL語句, ORACLE公司推薦使用ORACLE語句優(yōu)化器(Oracle Optimizer)和行鎖管理器(row-level manager)來調(diào)整優(yōu)化SQL語句。
調(diào)整服務(wù)器內(nèi)存分配。內(nèi)存分配是在信息系統(tǒng)運行過程中優(yōu)化配置的,數(shù)據(jù)庫管理員可以根據(jù)數(shù)據(jù)庫運行狀況調(diào)整數(shù)據(jù)庫系統(tǒng)全局區(qū)(SGA區(qū))的數(shù)據(jù)緩沖區(qū)、日志緩沖區(qū)和共享池的大??;還可以調(diào)整程序全局區(qū)(PGA區(qū))的大小。
調(diào)整硬盤I/O,DBA可以將組成同一個表空間的數(shù)據(jù)文件放在不同的硬盤上,做到硬盤之間I/O負載均衡。
12、Select語句的執(zhí)行順序
執(zhí)行順序:select---from---where--group by---having---select---order by
詞語分析:
SELECT 語句用于從表中選取數(shù)據(jù)。結(jié)果被存儲在一個結(jié)果表中(稱為結(jié)果集)。
from? 代表具體的數(shù)據(jù)源,具體表。
where? 設(shè)置條件從表中選取數(shù)據(jù)
GROUP BY 語句用于結(jié)合合計函數(shù),根據(jù)一個或多個列對結(jié)果集進行分組。
SELECT Customer1,SUM(OrderPrice1) FROM Orders
GROUP BY Customer1
HAVING? 關(guān)鍵字無法與合計函數(shù)一起使用。
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)<1000
前面從from(表)where(按條件取出數(shù)據(jù))goup by(再對取出的數(shù)據(jù)進行分組)having(分組之后再過濾得到最新數(shù)據(jù)集)select(按照設(shè)置列從數(shù)據(jù)集里面取出數(shù)據(jù))order by(對取出的數(shù)據(jù)進行排序)
13、where和having的區(qū)別
????having是在分組后對數(shù)據(jù)進行過濾
????where是在分組前對數(shù)據(jù)進行過濾
????having后面可以使用聚合函數(shù)
????where后面不可以使用聚合
在查詢過程中執(zhí)行順序:from>where>group(含聚合)>having>order>select。
所以聚合語句(sum,min,max,avg,count)要比having子句優(yōu)先執(zhí)行,而where子句在查詢過程中執(zhí)行優(yōu)先級別優(yōu)先于聚合語句(sum,min,max,avg,count)。
where子句:
select sum(num) as rmb from order where id>10
//只有先查詢出id大于10的記錄才能進行聚合語句
having子句:
select reports, count(*)? from employees group by reports having count(*) > 4
上例having條件表達示為聚合語句,肯定的說having子句查詢過程執(zhí)行優(yōu)先級別低于聚合語句。
再換句說話說把上面的having換成where則會出錯,統(tǒng)計分組數(shù)據(jù)時用到聚合語句。
對分組數(shù)據(jù)再次判斷時要用having。如果不用這些關(guān)系就不存在使用having。直接使用where就行了。
having就是來彌補where在分組數(shù)據(jù)判斷時的不足。因為where執(zhí)行優(yōu)先級別要快于聚合語句。
聚合函數(shù):
例如SUM, COUNT, MAX, AVG等。這些函數(shù)和其它函數(shù)的根本區(qū)別就是它們一般作用在多條記錄上。
HAVING子句可以讓我們直接篩選成組后的各組數(shù)據(jù),也可以在聚合后對組記錄進行篩選,而WHERE子句在聚合前先篩選記錄,也就是說作用在GROUP BY 子句和HAVING子句前。
14、視圖和表有什么區(qū)別和聯(lián)系
視圖是數(shù)據(jù)庫表的一個抽象子集,它是子集因為它僅僅展示數(shù)據(jù)庫表的一部分數(shù)據(jù),可以禁止所有用戶訪問底層數(shù)據(jù)庫表,而只通過視圖操作數(shù)據(jù)。它是抽象的,因為,它從表里提取數(shù)據(jù),形成虛擬表,是編譯好的sql語句,而并沒有實際的物理記錄。
使用視圖的好處是:
① 有利于提高執(zhí)行效率?
②對視圖的創(chuàng)建和刪除不會影響數(shù)據(jù)庫表,保護數(shù)據(jù)庫的數(shù)據(jù)安全