撩課-Java每天5道面試題第12天
摘要:
91.如何提升資料查詢的效率?
1.首先檢查表的結構是否合理,
因為採用多表查詢的時候,
看主外來鍵的引用關係是否適當.
如果不適當則重新設定表結構.
如果是應用中的系統,
則不需要更改表的欄位,
只更改主外來鍵關係.
如果資料庫中有較多的資料,
還應採用索引提高查詢效率.
2....
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 wherepeopleName in ( select peopleNamefrom people group by peopleName having count(peopleName) > 1 ) andpeopleId 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是每頁顯示的條數。