1. 程式人生 > >12-撩課-Java面試寶典-第十二篇

12-撩課-Java面試寶典-第十二篇

學習地址:
撩課-JavaWeb系列1之基礎語法-前端基礎
撩課-JavaWeb系列2之XML
撩課-JavaWeb系列3之MySQL
撩課-JavaWeb系列4之JDBC
撩課-JavaWeb系列5之web伺服器-idea

91.如何提升資料查詢的效率?

1.首先檢查表的結構是否合理,
因為採用多表查詢的時候,
看主外來鍵的引用關係是否適當.
如果不適當則重新設定表結構.
如果是應用中的系統,
則不需要更改表的欄位,
只更改主外來鍵關係.
如果資料庫中有較多的資料,
還應採用索引提高查詢效率.

2.利用索引(index)
對查詢進行優化,
index可以避免對錶資料的全面掃描,
當你以某個欄位建立一個索引的時候,
資料庫就會生成一個索引頁,
索引頁不單單儲存索引的資料,
還儲存了索引在資料庫的
具體的實體地址,
能夠很快的定位查詢到要找的記錄

3. 如果表的列很少,
不適合建索引.
表資料很少查詢,
而經常做insert、delete、update動作,
不適合建所以。
因為Oracle需要對索引額外維護。
建立索引後,select會快, 
當執行過多次的insert,delete,update後,
會出現索引碎片,
影響查詢速度,我
們應該對索引進行重組
(即drop掉索引重新create)

4.索引的型別分為:

B-樹索引:
適合於大量的增、刪、改,
大多數資料的索引預設型別。

點陣圖索引:
適合於決策支援系統

HASH索引、分割槽索引等。

92.什麼是資料庫事務?

事務是作為一個邏輯單元
執行的一系列操作,
要麼一起成功,要麼一起失敗。

一個邏輯工作單元必須有四個屬性,
稱為 ACID:
原子性、
一致性、
隔離性
永續性
屬性,
只有這樣才能成為一個事務。

原子性 :
事務必須是原子工作單元;
對於其資料修改,
要麼全都執行
,要麼全都不執行。

一致性 :
事務在完成時,
必須使所有的資料都保持一致狀態。
在相關資料庫中,
所有規則都必須應用於事務的修改,
保持所有資料的完整性。
事務結束時,
所有的內部資料結構
(如 B 樹索引或雙向連結串列)
都必須是正確的。

隔離性 :
由併發事務所作的修改
必須與任何其它併發事務
所作的修改隔離。
事務檢視資料時資料所處的狀態,
要麼另一併發事務修改它之前的狀態,
要麼是另一事務修改它之後的狀態,
事務不會檢視中間狀態的資料。
這為可序列性,
因為它能夠重新裝載起始資料,
並且重播一系列事務,
以使資料結束時的狀態
與原始事務執的狀態相同。

永續性 :
事務完成之後,
它對於系統的影響是永久性的。
該修改即使出現系統故障也將一直保持。

93.什麼是資料庫事務的隔離級別?

多個執行緒開啟各自事務操作資料庫中資料時,數
據庫系統要負責隔離操作,
以保證各個執行緒在獲取資料時的準確性。

資料庫共定義了四種隔離級別:
Serializable:(序列化)
可避免髒讀、
不可重複讀、
虛讀情況的發生

Repeatable read:(可重複讀)

可避免髒讀、
不可重複讀情況的發生。

Read committed:(讀已提交)
可避免髒讀情況發生。

Read uncommitted:(讀未提交)
最低級別,
以上情況均無法保證。

94.如何刪除表中的重複資料,只保留一條記錄?

1、查詢表中多餘的重複記錄,
重複記錄是根據單個欄位(peopleId)來判斷 
select * from people 
where peopleId in (
select peopleId from people 
group by peopleId 
having count(peopleId) > 1
) 

2、刪除表中多餘的重複記錄,
重複記錄是根據單個欄位(peopleId)來判斷,
只留有rowid最小的記錄 
delete from people 
where   peopleName in (
select peopleName  from people 
group by peopleName    
having count(peopleName) > 1
) and  peopleId not in (
select min(peopleId) from people 
group by peopleName     
having count(peopleName)>1
) 

3、查詢表中多餘的重複記錄(多個欄位) 
select * from vitae a 
where (a.peopleId,a.seq) in (
select peopleId,seq from vitae 
group by peopleId,seq 
having count(*) > 1
) 

4、刪除表中多餘的重複記錄(多個欄位),只留有rowid最小的記錄 
delete from vitae a 
where (a.peopleId,a.seq) in (
select peopleId,seq from vitae
 group by peopleId,seq 
having count(*) > 1
) and rowid not in (
 select min(rowid) from vitae
 group by peopleId,seq
 having count(*)>1
) 

5、查詢表中多餘的重複記錄(多個欄位),不包含rowid最小的記錄 
select * from vitae a 
where (a.peopleId,a.seq) in (
select peopleId,seq from vitae
group by peopleId,
seq having count(*) > 1
) 
and rowid not in (
select min(rowid) from vitae 
group by peopleId,
seq having count(*)>1
)   

6.消除一個欄位的左邊的第一位:

update tableName set 
[Title]=Right([Title],(len([Title])-1)) 
where Title like '村%'

7.消除一個欄位的右邊的第一位:

update tableName set 
[Title]=left([Title],(len([Title])-1)) 
where Title like '%村'

8.假刪除表中多餘的重複記錄(多個欄位),
不包含rowid最小的記錄 
update vitae set ispass=-1
where peopleId in (
select peopleId from vitae 
group by peopleId
)

95.如何通過sql語句完成分頁?

客戶端通過傳遞start(頁碼),
PageSize(每頁顯示的條數)兩個引數
去分頁查詢資料庫表中的資料,
那我們知道MySql資料庫提供了
分頁的函式limit m,n,
但是該函式的用法和我們的需求不一樣,
所以就需要我們根據實際情況
去改寫適合我們自己的分頁語句,
具體的分析如下:

比如:
查詢第1條到第10條的資料的sql是:
select * from table limit 0,10;   
對應我們的需求就是查詢第一頁的資料:
select * from table limit (1-1)*10,10;

查詢第10條到第20條的資料的sql是:
select * from table limit 10,20;  
對應我們的需求就是查詢第二頁的資料:
select * from table limit (2-1)*10,10;

查詢第20條到第30條的資料的sql是:
select * from table limit 20,30;  
對應我們的需求就是查詢第三頁的資料:
select * from table limit (3-1)*10,10;

二:通過上面的分析,
可以得出符合我們自己需求的分頁
sql格式是:
select * from table limit (start-1)*PageSize,PageSize; 
其中start是頁碼,
PageSize是每頁顯示的條數。