轉載:JAVA企業面試題精選 資料庫1-10

假裝鎮定發表於2018-09-30

轉載: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.簡化查詢欄位,沒用的欄位不要,對返回的結果進行控制,儘量返回少量資料

相關文章