數據庫面試總結

1、什麼是事務?數據庫事務的四大特性?

事務是對數據庫中一系列操作進行統一的回滾或提交的操作,主要用來保證數據的完整性和一致性。

原子性:要麼全執行,要麼全不執行

一致性:操作執行前後,數據保持一致

隔離性:一個操作在執行結束前,其他人是看不到執行過程的

持久性:一旦操作提交成功後,對數據的改變就是永久的

2、數據庫的隔離級別?

髒讀:事務B讀取了事務A還沒有提交的數據

不可重複讀:兩次事務讀取的數據不一致

幻讀:一個讀事務按照一定條件查詢出結果,一個寫事務插入了該條件的一條數據,讀事務再次查詢,結果不一樣

3、索引的作用?什麼時候不能用索引?

提高查詢效率

頻繁的更新數據時,不建議用索引,因爲同時要更新索引

4、數據庫三範式

1NF:屬性不可再分,比如,一個字段不能再被分成多個字段

2NF:非主鍵屬性,完全依賴主鍵屬性

3NF:非主鍵屬性不可有傳遞依賴

5、左連接、右連接

inner join:返回兩個表中所有的數據

left  join on:返回左表中的全部,右表中符合條件的數據,沒有的以null代替

right join on:返回右表中的全部,左表中符合條件的數據,沒有的以null代替

cross join:兩個表中的每一條記錄都再生成一條記錄,比如:A有4條,B有4條,生成16條記錄

6、數據庫鎖的分類?

鎖的定義:鎖是一種同步機制,用來強行限制資源訪問。

悲觀鎖:在一個事務執行過程中,認爲都有可能會對數據進行改變,所以都會加鎖。(共享鎖、排他鎖兩種機制)

樂觀鎖:在一個事務執行過程中,不認爲會對數據進行改變,所以不會加鎖。但是有更新操作時,會判斷數據是否進行了改變,通常使用版本號機制

共享鎖:即讀鎖,在使用select時使用的鎖機制。一個事務在讀數據時,其他事務也能讀數據

排他鎖:即寫鎖,在使用update、delete時使用的鎖機制。一個事務在操作數據時,其他事務看不到,更不能對其進行修改

7、爲什麼要對數據庫實行鎖機制?

背景:因爲數據庫併發操作會導致數據不一致

解決目的:多個用戶併發操作時,保持數據的一致性

8、什麼是死鎖?產生的原因?產生的條件?怎麼解決?

定義:死鎖是指多個進程在運行過程中因爭奪資源而造成的一種僵局,當進程處於這種狀態,若無外力作用,它們都無法再繼續進行。

原因:因競爭資源(可剝奪和不可剝奪資源)、進程推進順序非法

條件:

互斥條件(一個資源一次只能被一個進程使用)

請求與保持條件(一個進程因請求資源而阻塞時,對已獲得的資源保持不放)

不可剝奪條件(進程已獲得的資源,在沒有使用完之前不可剝奪,只有進程自己釋放)

循環等待條件(多個進程之間形成一種首尾相接的循環關係)

解決:找到進程號,直接kill掉;設置鎖的超時時間;指定獲取鎖的順序

9、什麼是存儲過程?如何創建?怎麼調用?

存儲過程是爲了完成特定功能的一組sql語句集,經過編譯後存儲在數據庫中,用戶通過名字和給定的參數調用相關的面目存儲過程

創建存儲過程的語法:

CREATE PROCEDURE 存儲過程名稱([存儲過程的參數列表])  存儲過程特性 過程體

存儲過程參數列表的格式:([[IN|OUT|INOUT]參數名 參數類型])

IN:輸入參數,該參數必須在調用存儲過程時指定,在存儲過程內部被改變時不能被返回,爲默認值

OUT:輸出參數,該參數可在存儲過程內部被改變並返回

INOUT:輸入輸出參數,調用時被指定,並且可被改變並返回

調用:

可以用命令CALL調用——call 過程名(過程參數);查看存儲過程用SHOW PROCEDURE STATUS LIKE xx%

可以用java程序;

10、什麼是視圖?

是一種虛擬表,具有和物理表一樣的功能,可以對其進行增、刪、改、查,視圖表一般是一個基本表或多個基本表的列或行的子集,視圖表影響基本表,相當於多表查詢,但是查詢速度更快

11、drop、truncate、delete的區別?

drop直接刪除表

truncate刪除全部數據,速度快,不可回滾

delete逐行刪除數據,可回滾

12、varchar、char的區別?

varchar是變長的,一個英文字符佔2個字節,漢字佔2個字節

char是固長,一個英文字符佔1個字節,漢字佔2個字節

13、SQL語言分類

DQL數據查詢語言(select)

DML數據操縱語言(insert、update、delete)

DDL數據定義語言(create)

DCL數據控制語言

14、select查詢語句中用到的關鍵詞

語法順序:select--from--where--group by--having--order by

執行順序:from--where--group by--having--select--order by

from 需要從哪個數據表檢索數據

where 過濾表中數據的條件

group by 如何將過濾出的數據分組

having 對上面已經分組的數據進行過濾的條件

select 查看結果集中的哪個列或者列的計算結果

order by 按照什麼順序進行排序

15、having和where的區別?

having只能用在group by之後,對分組後的結果進行篩選。可使用聚合函數

where在group by之前,肯定也在having之前。where條件後的表達式裏不可使用聚合函數

16、select語句的關鍵字

1)別名

select field1 n1 ,field2 n2 from table /select field1 as n1,field2 as n2 from table

2)去重

select distinct name from table

select distinct id , name from table,作用於多列時,需要同時滿足兩個條件都相同纔去重

3)連接

左連接:select a.*,b.* from a left join b on(a.id = b.id),查詢出a表中所有數據,和b表中與a表id相同的數據,不符合的以null代替

右連接:select a.*,b.* from a right join b on(a.id = b.id),查詢出b表所有數據,和a表與b表id相同的數據,不符合的以null代替

內連接:select a.*,b.* from a inner join b on(a.id = b.id),只查詢出a表和b表中相同的數據,不符合的不顯示

4)分頁  limit

limit i,n

i爲查詢結果的索引值;n爲查詢結果返回的數量。從i開始查詢數據,返回n條,左閉右開

5)分組函數

avg()、sum()、max()、min()、count()

17、增刪改查基本語法

1)插入

      單行

      insert into tablename (field1,field2,field3……) values(value1,value2,value3……)

      insert into tablename set field1 = value1,field2 = value2……

      多行

      insert into tablename (field1,field2,……) values (value1)(value2),(value3)……

      一般情況下都是分開多個單行語句進行插入

2)修改

update tablename set field = value where……

3)刪除

delete from tablename where ……

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章