轉載:JAVA企業面試題精選 資料庫1-10
轉載:https://blog.csdn.net/qq_38131668/article/details/76285638
第二部分
1.資料庫
1.1.什麼是關係型資料庫管理系統?
參考答案:
由關係,資料,資料之間的約束三者所組成的資料模型則被稱為RDBMS,即關係型資料庫管理系統.
1.2.簡述幾種主流的資料庫及其廠商
參考答案:
主流的資料庫及其廠商如下:
Oracle資料庫是著名的Oracle(甲骨文)公司的資料庫產品,Oracle資料庫是世界上第一個商品化的關係型資料庫管理系統;Oracle資料庫採用標準SQL(結構化查詢語言),自持多種資料型別,提供物件導向的資料支援,就有第四代語言開發工具,支援UNIX,WINDOWS,OS/2等多種平臺;Oracle公司的產品豐富,包括Oracle伺服器,Oracle開發工具和Oracle應用軟體,其中最著名的就是Oracle資料庫.
2)DB2是IBM公司的關係型資料庫管理系統.DB2有很多不同的版本,可以執行在從掌上產品到大型機不同的終端及其上;DB2 Universal Database Personal Edition和DB2 Universal Database Workgroup Edition分別是單使用者和多使用者系統,可以執行在OS/2和Windows上;DB2是Oracle的主要競爭對手.
3)Sybase是美國Sybase公司的關係型資料庫系統.Sybase是較早採用C/S技術的資料庫廠商;典型的UNIX或Windows NT平臺上客戶機/伺服器環境下的大型資料庫系統;Sybase通常與Sybase SQL Anywhere用於客戶機/伺服器環境,前者作為伺服器資料庫,後者為客戶機資料庫,採用該公司研製的PowerBuilder為開發工具,在國內大中型系統中具有廣泛的應用;Sybase公司2010年被SAP收購.
4)Microsoft SQL Server是微軟的產品,執行在Windows NT伺服器上.Microsoft SQL Server的最初版本適用於中小企業,但是應用範圍不斷擴充套件,已經觸及到大型,跨國企業的資料庫管理.
MySQL是開放原始碼的小型關係型資料庫管理系統.廣泛應用在中小型網站中,成本低,規模較Oracle和DB2小;2008年1月16日,Sun收購MySQL.2009年4月20日,Sun被Oracle收購,所以MySQL現在屬於Oracle公司.
1.3.簡述結構化查詢語言的分類
參考答案:
結構化查詢語言(SQL)可分為:
1.資料定義語言(DDL):Data Definition Language
2.資料操縱語言(DML):Data Manipulation Language
3.事物控制語言(TCL):Transaction Control Language
4.資料查詢語言(DQL):Data Query Language
5.資料控制語言(DCL):Data Control Language
1.4.簡述date和timestamp的區別?
參考答案:
date的最小單位是秒,timestamp包含小數位的秒.如果需要秒以下的單位,需要用timestamp.
1.5.簡述索引的原理及建立索引的意義?
參考答案:
索引是對錶的一列或多列進行排序的結構.因為絕大多數的搜尋方法在搜尋排序結構時效率都會大大提高,所以如果表中某一列經常被作為關鍵字搜尋,則建議對此列建立索引.
索引提供指標以指向村粗在表中指定列的資料值,根據指定的排序次序排列這些指標.資料庫使用索引的方式和與使用書的目錄很相似:通過搜尋索引找到特定的值,然後跟隨指標到達包含該值的行.
1.6.簡述檢視的意義
參考答案:
檢視的意義在於兩個方面:
1)簡化複雜查詢.如果需要經常執行某項複雜查詢,可以基於這個複雜查詢建立檢視,此後查詢此檢視即可.
2)限制資料訪問.檢視本質上就是一條SELECT語句,所以當訪問檢視時,只能訪問到所對應的SELECT語句中涉及到的列,對基表中的其他列起到安全和保密的作用.
1.7.觸發器分為事前觸發和事後觸發,這兩種觸發有何區別?語句級觸發和行級觸發有何區別?
參考答案:
事前觸發器執行於觸發事件發生之前,而事後觸發器執行於觸發事件發生之後.通常事前觸發器可以獲取事件之前和新的欄位值.語句級觸發器可以在語句執行之前或之後執行,而行級觸發器所影響的每一行時都會觸發一次.
簡單而言,事前觸發主要是驗證一些條件或進行一些準備工作,在資料儲存之前觸發,而事後觸發則是進行收尾工作,保證事務的完整性,在表經過修改以後才觸發.行級觸發器是對DML語句影響的每個行執行一次,如UPDATE語句影響多行,就會對每行都啟用一次觸發器.而語句級觸發器是對每個DML語句執行一次,如INSERT語句在表中即使插入了100多行,表上的INSERT語句級觸發器也只會執行一次.
1.8.SQL語句中exists和in有何區別?SQL語句優化有哪些方法?
參考答案:
SQL語句中exists和in區別如下:
exists是用迴圈(loop)的方式,由outer表的記錄數決定迴圈的次數,對於exists影響最大,所以外表的記錄數少,適合用exists;in先執行子查詢,子查詢的返回結果去重之後,再執行主查詢,所以,子查詢的返回結果越少,越適合用該方法.
SQL語句的優化方式如下:
1.儘量避免非操作符的使用.在索引列上使用NOT,<>等非操作符,資料庫管理系統是不會使用索引的,可以將查詢語句轉換為可以使用索引的查詢.
2.避免對查詢的列的操作.任何對列的操作都可能導致全表掃描,這裡所謂的操作包括資料庫函式,計算表示式等,查詢時要儘可能將操作移至等式的右邊,甚至去掉函式.
3.避免不必要的型別轉換.需要注意的是,儘量避免潛在的資料型別轉換.如字元型資料與數值型資料比較,會自動將字元進行轉換,從而導致全表掃描.
4.增加查詢的範圍限制.增加查詢的範圍限制,避免全範圍的搜尋.
5.合理使用IN與EXISTS.例如:有A,B兩個表,它們分別使用如下情況:
1)當只顯示一個表的資料如A,關係條件只一個如ID時,使用IN更合適,SQL語句如下:
SELECT * FROM A WHERE id IN (SELECT id FROM B);
- 1
2)當只顯示一個表的資料如A,關係條件不止一個列,例如關係條件涉及到的列為ID,col1時,使用IN就不方便了,可以使用EXISTS,SQL語句如下:
SELECT * FROM A WHERE EXISTS (SELECT 1 FROM B WHERE id = A.id and col1 = A.col1);
- 1
in與exists的區別:in是把外表和內表作hash連線,而exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢.一直以為認為exists比in效率高的說法是不準確的.如果查詢的兩個表大小相當,那麼用in和exists差別不大.如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in.
2)not in與not exists的區別:如果查詢語句使用了not in那麼內外表都進行全表掃描,沒有用到索引;而not exists的子查詢依然能用到表上的索引.所以無論哪個表大,用not exists都比not in要快.
6.儘量去掉< >.儘量去掉< >,避免全表掃描,如果資料是列舉值,且取值範圍同定,則修改為OR或者IN a< >0改為a>0 or a<0 a< >’ ’ 改為a>’ ‘.
7.去掉WHERE子句中的IS NULL和IS NOT NULL.WHERE子句中的IS NULL和IS NOT NULL將不會使用索引而是進行全表搜尋,因此需要通過改變查詢方式,分情況討論等辦法,去掉WHERE子句中的IS NULL和IS NOT NULL,IS NOT NULL改為A>0或者A>’ ‘.
8.儘量不要使用前導模糊查詢.由於前導模糊查詢(前面有%的like查詢)不能利用索引,所以速度會比較慢.
9.SELECT子句中避免使用’‘.當你想在SELECT子句中列出所有的COLUMN時,使用動態SQL列引用’‘是一個方便的方法,不幸的是,這是一個非常低效的方法.實際上,資料庫在解析的過程中,會將’*’依次轉換成所有的列名,這個工作是通過查詢資料字典完成的,這意味著將消耗更多的時間.
10.規範所有的SQL關鍵字的書寫 比如:SELECT,UPDATE,DELETE,FROM等,要麼全部大寫,要麼全部小寫,不要大小寫混用.
1.9說說你對資料庫事務隔離級別的理解
參考答案:
事務隔離級別:一個事務對資料庫的修改與並行的另一個事務的隔離程度.另個併發事務同時訪問資料庫表相同的行時,可能存在以下三個問題:
1.幻讀:事務T1讀取一條自定WHERE條件的語句,返回結果集.此時事務T2插入一行新紀錄,恰好滿足T1的WHERE條件.然後T1使用相同的條件再次查詢,結果集中可以看到T2插入的記錄,這條新紀錄則是幻讀記錄.
2.不可重複讀取:事務T1讀取一行記錄,緊接著事務T2修改了T1剛剛讀取的記錄,然後T1再次查詢,發現與第一次讀取的記錄不同,這稱為不可重複讀.
3.髒讀:事務T1更新了一行記錄,還未提交所做的修改,這個T2讀取了更新後的資料,然後T1執行回滾操作,取消剛才的修改,所以T2所讀取的行就無效,也就是髒資料.
為了處理這些問題,SQL標準定義了以下幾種事務隔離級別:
1) READ UNCOMMITTED 幻讀,不可重複讀和髒讀都允許.
2) READ COMMITTED 允許幻讀,不可重複讀,不允許髒讀
3) REPEATABLE READ 允許幻讀,不允許不可重複讀和髒讀
4) SERIALIZABLE 幻讀,不可重複讀和髒讀都不允許
Oracle資料庫支援READ COMMITTED和SERIALIZABLE 這兩種事務隔離級別.所以Oracle不支援髒讀.SQL標準所定義的預設事務隔離級別是SERIALIZABLE,但是Oracle預設使用的是READ COMMITTED.
1.10.在資料庫中條件查詢速度很慢的時候,如何優化?
參考答案:
1.為經常出現在WHERE子句中的列建立索引;為經常出現在ORDER BY,DISTINCT後面的欄位建立索引.如果建立的是複合索引,索引的欄位順序要和這些關鍵字後面的欄位順序一致;為經常作為表的連線條件的列上建立索引.
2.減少表之間的關聯
3.優化SQL,儘量讓SQL很快定位資料,不要讓SQL做全表查詢,應該走索引,把資料量大的表排在前面
4.簡化查詢欄位,沒用的欄位不要,對返回的結果進行控制,儘量返回少量資料
相關文章
- 轉載:JAVA企業面試題精選 OOP 1-10Java面試題OOP
- 轉載:JAVA企業面試題精選 Java基礎 1-10Java面試題
- 轉載: JAVA企業面試題精選 資料庫11-20Java面試題資料庫
- 轉載:JAVA企業面試題精選 OOP 11-20Java面試題OOP
- 轉載:JAVA企業面試題精選 OOP 21-24Java面試題OOP
- 轉載:JAVA企業面試題精選 Java基礎 41-50Java面試題
- 轉載:JAVA企業面試題精選 Java基礎 31-40Java面試題
- 轉載:JAVA企業面試題精選 Java基礎 11-20Java面試題
- 轉載:JAVA企業面試題精選 Java基礎 21-30Java面試題
- Java併發面試題精選Java面試題
- 面經精選:資料庫高頻面試十問資料庫面試
- Java_資料庫面試題Java資料庫面試題
- 最新精選Java面試題,附答案!Java面試題
- 2021精選 Java面試題附答案(一)Java面試題
- 2018年--阿里大資料面試題(部分精選)阿里大資料面試題
- iOS面試題精選iOS面試題
- 資料庫面試題資料庫面試題
- 面試題精選14-資料庫中如何實現行鎖和表鎖面試題資料庫
- 精選30道Java多執行緒面試題Java執行緒面試題
- JAVA面試:mysql資料庫Java面試MySql資料庫
- 精選乾貨:Java精選筆試題附答案Java筆試
- Android面試題(轉載)Android面試題
- JAVA面試二(資料庫部分)Java面試資料庫
- 面試系列二:精選大資料面試真題JVM專項-附答案詳細解析面試大資料JVM
- 資料庫面試題總結資料庫面試題
- Python學習資料之企業面試題集錦!Python面試題
- 50+ 精選資料結構和演算法面試問題 【譯】資料結構演算法面試
- Java就業企業面試問題-電商專案Java就業面試
- 26個精選的JavaScript面試問題JavaScript面試
- MySQL精選60道面試題 ( 含答案 )MySql面試題
- 「面試必問」leetcode高頻題精選面試LeetCode
- Treasure Of JAVA——JAVA的資料型別(JAVA面試題)Java資料型別面試題
- 防火牆企業面試題iptalbes Linux面試題分享防火牆面試題Linux
- 入職大廠,齊姐精選的 9 道 Java 集合面試題Java面試題
- 100家IT 名企面試必考面試題java系列面試題Java
- 面試精選之Promise面試Promise
- 資料庫面試簡答、30道高頻面試題資料庫面試題
- 資料庫常見面試題總結資料庫面試題