1. 程式人生 > >sql資料庫面試題(概念類)

sql資料庫面試題(概念類)

1.觸發器的作用?

  答:觸發器是一中特殊的儲存過程,主要是通過事件來觸發而被執行的。它可以強化約束,來維護資料的完整性和一致性,可以跟蹤資料庫內的操作從而不允許未經許可的更新和變化。可以聯級運算。如,某表上的觸發器上包含對另一個表的資料操作,而該操作又會導致該表觸發器被觸發。

2。什麼是儲存過程?用什麼來呼叫?

答:儲存過程是一個預編譯的SQL 語句,優點是允許模組化的設計,就是說只需建立一次,以後在該程式中就可以呼叫多次。如果某次操作需要執行多次SQL ,使用儲存過程比單純SQL 語句執行要快。可以用一個命令物件來呼叫儲存過程。

3。索引的作用?和它的優點缺點是什麼?

答:索引就一種特殊的查詢表,資料庫的搜尋引擎可以利用它加速對資料的檢索。它很類似與現實生活中書的目錄,不需要查詢整本書內容就可以找到想要的資料。索引可以是唯一的,建立索引允許指定單個列或者是多個列。缺點是它減慢了資料錄入的速度,同時也增加了資料庫的尺寸大小。

3。什麼是記憶體洩漏?

答:一般我們所說的記憶體洩漏指的是堆記憶體的洩漏。堆記憶體是程式從堆中為其分配的,大小任意的,使用完後要顯示釋放記憶體。當應用程式用關鍵字new 等建立物件時,就從堆中為它分配一塊記憶體,使用完後程序呼叫free 或者delete 釋放該記憶體,否則就說該記憶體就不能被使用,我們就說該記憶體被洩漏了。

4。維護資料庫的完整性和一致性,你喜歡用觸發器還是自寫業務邏輯?為什麼?

答:我是這樣做的,儘可能使用約束,如check, 主鍵,外來鍵,非空欄位等來約束,這樣做效率最高,也最方便。其次是使用觸發器,這種方法可以保證,無論什麼業務系統訪問資料庫都可以保證資料的完整新和一致性。最後考慮的是自寫業務邏輯,但這樣做麻煩,程式設計複雜,效率低下。

5。什麼是事務?什麼是鎖?

答:事務就是被繫結在一起作為一個邏輯工作單元的SQL 語句分組,如果任何一個語句操作失敗那麼整個操作就被失敗,以後操作就會回滾到操作前狀態,或者是上有個節點。為了確保要麼執行,要麼不執行,就可以使用事務。要將有組語句作為事務考慮,就需要通過ACID 測試,即原子性,一致性,隔離性和永續性。

  鎖:在所以的 DBMS中,鎖是實現事務的關鍵,鎖可以保證事務的完整性和併發性。與現實生活中鎖一樣,它可以使某些資料的擁有者,在某段時間內不能使用某些資料或資料結構。當然鎖還分級別的。

6。什麼叫檢視?遊標是什麼?

答:檢視是一種虛擬的表,具有和物理表相同的功能。可以對檢視進行增,改,查,操作,試圖通常是有一個表或者多個表的行或列的子集。對檢視的修改不影響基本表。它使得我們獲取資料更容易,相比多表查詢。

  遊標:是對查詢出來的結果集作為一個單元來有效的處理。遊標可以定在該單元中的特定行,從結果集的當前行檢索一行或多行。可以對結果集當前行做修改。一般不使用遊標,但是需要逐條處理資料的時候,遊標顯得十分重要。

你能向我簡要敘述一下SQL Server 2000中使用的一些資料庫物件嗎?

你希望聽到的答案包括這樣一些物件:表格、檢視、使用者定義的函式,以及儲存過程;如果他們還能夠提到像觸發器這樣的物件就更好了。如果應聘者不能回答這個基本的問題,那麼這不是一個好兆頭。

NULL是什麼意思?

NULL(空)這個值是資料庫世界裡一個非常難纏的東西,所以有不少應聘者會在這個問題上跌跟頭您也不要覺得意外。

NULL這個值表示UNKNOWN(未知):它不表示“”(空字串)。假設您的SQL Server資料庫裡有ANSI_NULLS,當然在預設情況下會有,對NULL這個值的任何比較都會生產一個NULL值。您不能把任何值與一個 UNKNOWN值進行比較,並在邏輯上希望獲得一個答案。您必須使用IS NULL操作符。

什麼是索引?SQL Server 2000裡有什麼型別的索引?

任何有經驗的資料庫開發人員都應該能夠很輕易地回答這個問題。一些經驗不太多的開發人員能夠回答這個問題,但是有些地方會說不清楚。

簡單地說,索引是一個數據結構,用來快速訪問資料庫表格或者視圖裡的資料。在SQL Server裡,它們有兩種形式:聚集索引和非聚集索引。聚集索引在索引的葉級儲存資料。這意味著不論聚集索引裡有表格的哪個(或哪些)欄位,這些欄位都會按順序被儲存在表格。由於存在這種排序,所以每個表格只會有一個聚集索引。非聚集索引在索引的葉級有一個行識別符號。這個行識別符號是一個指向磁碟上資料的指標。它允許每個表格有多個非聚集索引。

什麼是主鍵?什麼是外來鍵?

主鍵是表格裡的(一個或多個)欄位,只用來定義表格裡的行;主鍵裡的值總是唯一的。外來鍵是一個用來建立兩個表格之間關係的約束。這種關係一般都涉及一個表格裡的主鍵欄位與另外一個表格(儘管可能是同一個表格)裡的一系列相連的欄位。那麼這些相連的欄位就是外來鍵。

什麼是觸發器?SQL Server 2000有什麼不同型別的觸發器?

讓未來的資料庫開發人員知道可用的觸發器型別以及如何實現它們是非常有益的。

觸發器是一種專用型別的儲存過程,它被捆綁到SQL Server 2000的表格或者檢視上。在SQL Server 2000裡,有INSTEAD-OF和AFTER兩種觸發器。INSTEAD-OF觸發器是替代資料操控語言(Data Manipulation Language,DML)語句對錶格執行語句的儲存過程。例如,如果我有一個用於TableA的INSTEAD-OF-UPDATE觸發器,同時對這個表格執行一個更新語句,那麼INSTEAD-OF-UPDATE觸發器裡的程式碼會執行,而不是我執行的更新語句則不會執行操作。

AFTER觸發器要在DML語句在資料庫裡使用之後才執行。這些型別的觸發器對於監視發生在資料庫表格裡的資料變化十分好用。

您如何確一個帶有名為Fld1欄位的TableB表格裡只具有Fld1欄位裡的那些值,而這些值同時在名為TableA的表格的Fld1欄位裡?

這個與關係相關的問題有兩個可能的答案。第一個答案(而且是您希望聽到的答案)是使用外來鍵限制。外來鍵限制用來維護引用的完整性。它被用來確保表格裡的欄位只儲存有已經在不同的(或者相同的)表格裡的另一個欄位裡定義了的值。這個欄位就是候選鍵(通常是另外一個表格的主鍵)。

另外一種答案是觸發器。觸發器可以被用來保證以另外一種方式實現與限制相同的作用,但是它非常難設定與維護,而且效能一般都很糟糕。由於這個原因,微軟建議開發人員使用外來鍵限制而不是觸發器來維護引用的完整性。

對一個投入使用的線上事務處理表格有過多索引需要有什麼樣的效能考慮?

你正在尋找進行與資料操控有關的應聘人員。對一個表格的索引越多,資料庫引擎用來更新、插入或者刪除資料所需要的時間就越多,因為在資料操控發生的時候索引也必須要維護。

你可以用什麼來確保表格裡的欄位只接受特定範圍裡的值?

這個問題可以用多種方式來回答,但是隻有一個答案是“好”答案。您希望聽到的回答是Check限制,它在資料庫表格裡被定義,用來限制輸入該列的值。

觸發器也可以被用來限制資料庫表格裡的欄位能夠接受的值,但是這種辦法要求觸發器在表格裡被定義,這可能會在某些情況下影響到效能。因此,微軟建議使用Check限制而不是其他的方式來限制域的完整性。

如果應聘者能夠正確地回答這個問題,那麼他的機會就非常大了,因為這表明他們具有使用儲存過程的經驗。

返回引數總是由儲存過程返回,它用來表示儲存過程是成功還是失敗。返回引數總是INT資料型別。

OUTPUT引數明確要求由開發人員來指定,它可以返回其他型別的資料,例如字元型和數值型的值。(可以用作輸出引數的資料型別是有一些限制的。)您可以在一個儲存過程裡使用多個OUTPUT引數,而您只能夠使用一個返回引數。

什麼是相關子查詢?如何使用這些查詢?

經驗更加豐富的開發人員將能夠準確地描述這種型別的查詢。

相關子查詢是一種包含子查詢的特殊型別的查詢。查詢裡包含的子查詢會真正請求外部查詢的值,從而形成一個類似於迴圈的狀況。

1.事務四大特性
原子性,要麼執行,要麼不執行
隔離性,所有操作全部執行完以前,其它會話不能看到過程
一致性,事務前後,資料總額一致
永續性,一旦事務提交,對資料的改變就是永久的

2.資料庫隔離級別,每個級別會引發什麼問題,mysql預設是哪個級別

髒讀:事務B讀取事務A還沒有提交的資料
不可重複讀:兩次事務讀的資料不一致
幻讀:事務A修改了資料,事務B也修改了資料,這時在事務A看來,明明修改了資料,昨不一樣,
隔離級別 讀資料一致性 髒讀 不可重複讀 幻讀
未提交讀 最低級別 是 是 是
已提交讀 語句級 否 是 是
事務級 事務級 否 否 是
序列化 最高級別 否 否 否

3.MYSQL的兩種儲存引擎區別(事務、鎖級別等等),各自的適用場景
MYISAM 不支援事務,不支援外來鍵,表鎖,插入資料時,鎖定整個表,查表總行數時,不需要全表掃描
INNODB 支援事務,支援外來鍵,行鎖,查表總行數時,全表掃描

4.索引有B+索引和hash索引,各自的區別
hash索引,等值查詢效率高,
不能排序
不能進行範圍查詢

B+索引
資料有序
範圍查詢

5.B+索引資料結構,和B樹的區別

1.單一節點儲存更多的元素,B+樹空間利用率更高,使得查詢的IO次數更少。
2.所有查詢都要查詢到葉子節點,查詢效能穩定。
3.所有葉子節點形成有序連結串列,便於範圍查詢

6.索引的底層實現(B+樹,為何不採用紅黑樹,B樹)
增加,刪除,紅黑樹會進行頻繁的調整,來保證紅黑樹的性質,浪費時間
B樹,查詢效能不穩定,查詢結果高度不致,
B樹,每個結點儲存指向真實資料的指印,相比B+樹每一層每屋儲存的元素更多,顯得更高一點。

7.聚集索引和非聚集索引區別
聚集索引,資料按索引順序儲存,中子結點儲存真實的物理資料
非聚集索引,儲存指向真正資料行的指標

8.索引的優缺點,什麼時候使用索引,什麼時候不能使用索引(重點)
索引最大的好處是提高查詢速度,
缺點是更新資料時效率低,因為要同時更新索引
對資料進行頻繁查詢進建立索引,如果要頻繁更改資料不建議使用索引。

9.B樹,也是B-樹
先看二叉查詢樹,時間複雜度log(n),考慮磁碟IO,所以需要二叉查詢樹矮寬,減小樹的高度。
1.根結點至少有兩個子女。
2.每個中間節點都包含k-1個元素和k個孩子,其中 m/2 <= k <= m
3.每一個葉子節點都包含k-1個元素,其中 m/2 <= k <= m
4.所有的葉子結點都位於同一層。
5.每個節點中的元素從小到大排列,節點當中k-1個元素正好是k個孩子包含的元素的值域分劃
k的大小取決於磁碟頁的大小,主存和磁碟以頁為單位交換資料。當程式要讀取的資料不在主存中時,會觸發一個缺頁異常,
此時系統會向磁碟發出讀盤訊號,磁碟會找到資料的起始位置並向後連續讀取一頁或幾頁載入記憶體中,然後異常返回,程式繼續執行。

10.InnoDB索引和MyISAM索引的區別:
一是主索引的區別,InnoDB的資料檔案本身就是索引檔案。而MyISAM的索引和資料是分開的。
二是輔助索引的區別:InnoDB的輔助索引data域儲存相應記錄主鍵的值而不是地址。而MyISAM的輔助索引和主索引沒有多大區別。

11.為什麼使用B-/+Tree
索引查詢過程中就要產生磁碟I/O消耗,主要看IO次數,和磁碟存取原理有關。
根據B-Tree的定義,可知檢索一次最多需要訪問h個節點。資料庫系統的設計者巧妙利用了磁碟預讀原理,
將一個節點的大小設為等於一個頁,這樣每個節點只需要一次I/O就可以完全載入
區域性性原理與磁碟預讀

12.B+樹具體實現
一個m階的B+樹具有如下幾個特徵:
1.有k個子樹的中間節點包含有k個元素(B樹中是k-1個元素),每個元素不儲存資料,只用來索引,所有資料都儲存在葉子節點。
2.所有的葉子結點中包含了全部元素的資訊,及指向含這些元素記錄的指標,且葉子結點本身依關鍵字的大小自小而大順序連結。
3.所有的中間節點元素都同時存在於子節點,在子節點元素中是最大(或最小)元素

13.資料庫的優化(一條sql中能使用一個索引,多個索引會自動選擇最優的索引,從sql語句優化和索引兩個部分回答)
原則1.sql儘量使用索引
2.對sql語句優化
子查詢變成left join
limit 分佈優化,先利用ID定位,再分頁
or條件優化,多個or條件可以用union all對結果進行合併(union all結果可能重複)
不必要的排序
where代替having,having 檢索完所有記錄,才進行過濾
避免巢狀查詢
對多個欄位進行等值查詢時,聯合索引

14.是否使用索引explain檢視查詢計劃

15.索引最左字首問題
如果對三個欄位建立聯合索引,如果第二個欄位沒有使用索引,第三個欄位也使用不到索引了。
16.索引分類,索引失效條件
普通索引:最基本的索引,沒有任何限制
唯一索引:與”普通索引”類似,不同的就是:索引列的值必須唯一,但允許有空值。
主鍵索引:它是一種特殊的唯一索引,不允許有空值。
全文索引:針對較大的資料,生成全文索引很耗時好空間。
組合索引:為了更多的提高mysql效率可建立組合索引,遵循”最左字首“原則
失效條件
條件是or,如果還想讓or條件生效,給or每個欄位加個索引
like查詢,以%開發
內部函式
對索引列進行計算
is null不會用,is not null 會用

16.資料庫的主從複製
預設非同步複製,容易造成主庫資料和從庫不一致
一個數據庫為Master,一個數據庫為slave,通過Binlog日誌
slave兩個執行緒,一個執行緒去讀master binlog日誌,寫到自己的中繼日誌
一個執行緒解析日誌,執行sql
master啟動一個執行緒
給slave傳遞binlog日誌

半同步複製
只有把master傳送的binlog日誌寫到slave的中繼日誌,這時主庫
才返回操作完成的反饋,效能有一定降低

並行複製
slave 多個執行緒去請求binlog日誌

17.long_query怎麼解決
設定引數,開啟慢日誌功能,得到耗時超過一定時間的sql

18.varchar和char的使用場景
用來儲存字元
varchar適用字元長度經常變的
char適用字元長度固定的

19.資料庫連線池的作用
維護一定數量的連線,減少建立連線的時間
更快的響應時間
統一的管理

20.分庫分表,主從複製,讀寫分離
讀寫分離,讀從庫,寫主庫
spring配置兩個資料庫,通過AOP(面向切面程式設計),在寫或讀方法前面進行判斷得到動態切換資料來源。

21.資料庫三正規化
1NF 屬性不可分
2NF 非主鍵屬性,完全依賴於主鍵屬性
3NF 非主鍵屬性無傳遞依賴

22.關係型資料庫和非關係型資料庫區別
資料庫
型別 特性
關係型資料庫mysql 1、關係型資料庫,是指採用了關係模型來組織資料的資料庫,
2.關係型資料庫的最大特點就是事務的一致性;

                    優點
                  1、容易理解:二維表結構是非常貼近邏輯世界一個概念,關係模型相對網狀、層次等其他模型來說更容易理解;
                  2、使用方便:通用的SQL語言使得操作關係型資料庫非常方便;
                  3、易於維護:豐富的完整性(實體完整性、參照完整性和使用者定義的完整性)大大減低了資料冗餘和資料不一致的概率;
                  4、支援SQL,可用於複雜的查詢。 
                     缺點
                  1、為了維護一致性所付出的巨大代價就是其讀寫效能比較差;
                  2、固定的表結構;
                  3、不支援高併發讀寫需求;
                  4、不支援海量資料的高效率讀寫;

非關係型資料庫 特性
HBase 1、使用鍵值對儲存資料;
2、分散式;
優點
無需經過sql層的解析,讀寫效能很高
基於鍵值對,資料沒有耦合性,容易擴充套件
儲存資料的格式:nosql的儲存格式是key,value形式
缺點
不支援事務
不提供sql支援

23.資料庫中join的inner join, outer join, cross join
以A,B兩張表為例
A left join B
選出A的所有記錄,B表中沒有的以null 代替
right join 同理

inner join
A,B的所有記錄都選出,沒有的記錄以null代替

cross join (笛卡爾積)
A中的每一條記錄和B中的每一條記錄生成一條記錄
例如A中有4條,B中有4條,cross join 就有16條記錄

24.有哪些鎖,select時怎麼加排它鎖
樂觀鎖,自己實現,通過版本號
悲觀鎖:共享鎖,多個事務,只能讀不能寫,加 lock in share mode
排它鎖,一個事務,只能寫,for update
行鎖
表鎖
25.死鎖怎麼解決
找到程序號,kill 程序

26 最左匹配原則
最左匹配原則是針對索引的
舉例來說:兩個欄位(name,age)建立聯合索引,如果where age=12這樣的話,是沒有利用到索引的,這裡我們可以簡單的理解為先是對name欄位的值排序,然後對age的資料排序,如果直接查age的話,這時就沒有利用到索引了,查詢條件where name=’xxx’ and age=xx 這時的話,就利用到索引了,再來思考下where age=xx and name=’xxx‘ 這個sql會利用索引嗎,按照正常的原則來講是不會利用到的,但是優化器會進行優化,把位置交換下。這個sql也能利用到索引了

參考: