面試官常問的 數據庫 問題(一)

1. 觸發器的作用?

特殊的存儲過程。可強化約束,維護數據完整性與統一性。

何爲觸發器?
在SQLServer裏面也就是對某一個表的一定的操作,觸發某種條件,從而執行的一段程序。
觸發器是一種特殊的存儲過程,主要是通過事件來觸發而被執行的。
它可以強化約束,來維護數據的完整性和一致性,可以跟蹤數據庫內的操作從而不允許未經許可的更新和變化,可以聯級運算。
常見的觸發器有三種:分別應用於Insert,Delete,Update事件。

如,某表上的觸發器上包含對另一個表的數據操作,而該操作又會導致該表觸發器被觸發。

2. 什麼是存儲過程?用什麼來調用?

自創建一次可調用多次!
如果需要執行多次SQL語句,存儲過程比單純的SQL要快。

存儲過程是一個預編譯的SQL語句,優點是允許模塊化的設計,就是說只需創建一次,以後在該程序中就可以調用多次。
如果某次操作需要執行多次SQL,使用存儲過程比單純SQL語句執行要快。

調用:
1)可以用一個命令對象來調用存儲過程。
2)可以供外部程序調用,比如:java程序。

3. 索引的作用及優缺點是什麼?

索引的作用:創建索引可提高系統的性能
優:加快數據檢索;可保證數據唯一;
缺:創建和維護索引需要時間;佔空間;

索引的作用:創建索引能夠大大的提高系統的性能

優點:

①通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性

②大大加快數據的檢索速度,這也是創建索引的最主要原因

③保證了表與表之間的連接,在實現數據的參考完整性方面特別有意義

④在使用分組和排序,子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間

⑤通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的性能。

缺點:

①創建索引和維護索引需要時間,這種時間隨着數據量的增加而增加

②索引需要佔物理空間,除了數據表佔數據空間之外,每一個索引還要佔物理空間,如果要建立聚簇索引,需要的空間更大

③當對錶中的數據進行增加、刪除和修改的時候,索引也要動態的維護,這就降低了數據的維護速度。

索引是創建在數據庫的表中的列上。因此,在創建索引的時候,要考慮哪些列上適合加索引,那些列上不適合加索引。
搜索引擎技術es

4. 什麼叫視圖?遊標是什麼?

視圖:一種虛擬的表,具有和物理表相同的功能,我們一般做查詢(視圖查詢相較於多表查詢更容易獲取數據)。

視圖是一種虛擬的表,具有和物理表相同的功能,可以對視圖進行增,改,查,操作,試圖通常是有一個表或者多個表的行或列
的子集。對視圖的修改不影響基本表。它使得我們獲取數據更容易,相比多表查詢。

遊標:是對查詢出來的結果集作爲一個單元來有效的處理。可定在該單元中的特定行,從結果集的當前行檢索一行或多行;可對結果集當前行做修改。
一般不使用遊標,但是需要逐條處理數據的時候,遊標顯得十分重要。

5. delete、drop、truncate 區別

delete 刪除後可恢復,一般刪除部分數據(刪全部太慢了)
truncate、delete 只刪除數據,不刪除表結構,drop 刪除表結構,且釋放所佔的空間;
刪除數據的速度,drop>truncate>delete ;
delete 屬於 DML 語言,需要事務管理,commit 之後才能生效,drop 和 truncate 屬於 DDL 語言,操作立刻生效,不可回滾;
使用場合:
不再需要該表時, 用drop;刪除所有記錄但保留該表時, 用truncate;刪除部分記錄時用delete。

6. 如何進行 SQL 優化?

建存儲索引;優化字段數據類型;爲字段添加索引;不使用select * ;使用ENUM;使用NOTNULL;固定表長度;

(1)選擇正確的存儲引擎
以 MySQL 爲例,包括有兩個存儲引擎 MyISAM 和 InnoDB,每個引擎都有利有弊。 MyISAM 適合於一些需要大量查詢的應用,但其對於有大量寫操作並不是很好。甚至你只是需要 update 一個字段,整個表都會被鎖起來,而別的進程,就算是讀進程都無法操作直到讀操作完成。另外,MyISAM 對於 SELECTCOUNT(*) 這類的計算是超快無比的。 InnoDB 的趨勢會是一個非常複雜的存儲引擎,對於一些小的應用,它會比 MyISAM 還慢。但是它支持“行鎖” ,於是在寫操作比較多的時候,會更優秀。並且,他還支持更多的高級應用,比如:事務。

(2)優化字段的數據類型
記住一個原則,越小的列會越快。如果一個表只會有幾列罷了(比如說字典表,配置表),那麼,我們就沒有理由使用 INT 來做主鍵,使用 MEDIUMINT,SMALLINT 或是更小的 TINYINT 會更經濟一些。
如果你不需要記錄時間,使用 DATE 要比 DATETIME 好得多。 當然,你也需要留夠足夠的擴展空間。

(3)爲搜索字段添加索引,索引並不一定就是給主鍵或是唯一的字段
如果在你的表中,有某個字段你總要會經常用來做搜索,那麼最好是爲其建立索引,
除非你要搜索的字段是大的文本字段,那應該建立全文索引。

(4)避免使用 Select *
從數據庫裏讀出越多的數據,那麼查詢就會變得越慢。並且,如果你的數據庫服務器和 WEB 服務器是兩臺獨 立的服務器的話,這還會增加網絡傳輸的負載。即使你要查詢數據表的所有字段,也儘量不要用*通配符,善用內置提供的字段排除定 義也許能給帶來更多的便利。

(5)使用 ENUM 而不是 VARCHAR
ENUM 類型是非常快和緊湊的。在實際上,其保存的是 TINYINT,但其外表上顯示爲字符串。這樣一來,用這個字段來做一些選 項列表變得相當的完美。例如,性別、民族、部門和狀態之類的這些字段的取值是有限而且固定的,那麼,你應該使用 ENUM 而不是 VARCHAR。

(6)儘可能的使用 NOTNULL
除非你有一個很特別的原因去使用 NULL 值,你應該總是讓你的字段保持 NOTNULL。 NULL 其實需要額外的空間,並且,在你進行比較的時候,你的程序會更復雜。 當然,這裏並不是說你就不能使用 NULL 了,現實情況是很複雜的,依然會有些情況下,你需要 使用 NULL 值。

(7)固定長度的表會更快
如果表中的所有字段都是“固定長度”的,整個表會被認爲是 “static” 或 “fixed-length”。 例如,表中沒有如下類型的字段: VARCHAR,TEXT,BLOB。只要你包括了其中一個這些字段,那麼這個表就不是“固定長度靜態表”了,這樣,MySQL 引擎會用另一種方法來處理。
固定長度的表會提高性能,因爲 MySQL 搜尋得會更快一些,因爲這些固定的長度是很容易計算下一個數據的偏移量的,所以讀取的自然也會很快。而如果字段不是定長的,那麼,每一次要找下一條的話,需要程序找到主鍵。
並且,固定長度的表也更容易被緩存和重建。不過,唯一的副作用是,固定長度的字段會浪費一些空間,因爲定長的字段無論你
用不用,他都是要分配那麼多的空間。

7. MySQL 中的 varchar 和 char 有什麼區別?(重點)

char:定長字段;varchar:可變字段;
檢索效率:char>varchar(確定某字段值的長度時,用char);

char 是一個定長字段,假如申請了 char(10)的空間,那麼無論實際存儲多少內容,該字段都佔用 10 個字符;
而 varchar 是變長的,也就是說申請的只是最大長度,佔用的空間爲實際字符長度+1,最後一個字符存儲使用了多長的空間。

在檢索效率上來講,char>varchar;
因此在使用中,如果確定某個字段的值的長度(shiro 鹽加密),可以使用char,否則應該儘量使用varchar。例如存儲用 戶 MD5 加密後的密碼,則應該使用 char。

8. 在哪些情況下會發生針對該列創建了索引,但是在查詢的時候並沒有使用呢?

使用不等於查詢;
列參與了數學運算或者函數;
使用 like 時 ,左邊是通配符,類似於’%aaa’;
當mysql分析全表掃描比使用索引快的時候不使用索引;
當使用聯合索引,前面一個條件爲範圍查詢,後面的即使符合最左前綴原則,也無法使用索引;

以上情況,MySQL無法使用索引!

9. 爲什麼要儘量設定一個主鍵?

保證數據的唯一性

主鍵是數據庫確保數據行在整張表唯一性的保障,即使業務上本張表沒有主鍵,也建議添加一個自增長的 ID 列作爲主鍵,設定了主鍵 之後,在後續的刪改查的時候可能更加快速以及確保操作數據範圍安全。

10.Mysql 數據庫與 Oracle 數據庫有什麼區別?

MySql:中小型數據庫;可自動增長(有自動增長的=數據類型);group by 方法可隨意用;可用單引號、雙引號包起字符串;
Oracle:大型數據庫;無自動增長(需要創建自增序列);當查詢語句中有組函數,則其他列必須是組函數處理過的或者是 group by 子句中的列,否則會報錯;只可用單引號包起字符串;

  1. 應用方面,Mysql 是中小型應用的數據庫。一般用於個人和中小型企業。Oracle 屬於大型數據庫,一般用於具有相當規模的企 業應用。
  2. 自動增長的數據類型方面: MySQL 有自動增長的數據類型。Oracle 沒有自動增長的數據類型。需要建立一個自增序列。
  3. group by 用法: Mysql 中 group by 在 SELECT 語句中可以隨意使用,但在 ORACLE 中如果查詢語句中有組函數,那麼其他列必須是組函數處理過的或者是 group by 子句中的列,否則會報錯。
  4. 引導方面: MySQL 中可以用單引號、雙引號包起字符串,Oracle 中只可以用單引號包起字符串
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章