'史上最全面的數據庫常見筆試面試題(附含答案)上'

數據庫 SQL Java MySQL 人生第一份工作 設計 讀書 Java架構師技術 2019-08-07
"

本文內容較多,建議收藏閱讀。

一、基本概念

"

本文內容較多,建議收藏閱讀。

一、基本概念

史上最全面的數據庫常見筆試面試題(附含答案)上

1.主鍵、外鍵、超鍵、候選鍵

超鍵:在關係中能唯一標識元組的屬性集稱為關係模式的超鍵。一個屬性可以為作為一個超鍵,多個屬性組合在一起也可以作為一個超鍵。超鍵包含候選鍵和主鍵。

候選鍵:是最小超鍵,即沒有冗餘元素的超鍵。

主鍵:數據庫表中對儲存數據對象予以唯一和完整標識的數據列或屬性的組合。一個數據列只能有一個主鍵,且主鍵的取值不能缺失,即不能為空值(Null)。

外鍵:在一個表中存在的另一個表的主鍵稱此表的外鍵。

2.為什麼用自增列作為主鍵

如果我們定義了主鍵(PRIMARY KEY),那麼InnoDB會選擇主鍵作為聚集索引、

如果沒有顯式定義主鍵,則InnoDB會選擇第一個不包含有NULL值的唯一索引作為主鍵索引、

如果也沒有這樣的唯一索引,則InnoDB會選擇內置6字節長的ROWID作為隱含的聚集索引(ROWID隨著行記錄的寫入而主鍵遞增,這個ROWID不像ORACLE的ROWID那樣可引用,是隱含的)。

數據記錄本身被存於主索引(一顆B+Tree)的葉子節點上。這就要求同一個葉子節點內(大小為一個內存頁或磁盤頁)的各條數據記錄按主鍵順序存放,因此每當有一條新的記錄插入時,MySQL會根據其主鍵將其插入適當的節點和位置,如果頁面達到裝載因子(InnoDB默認為15/16),則開闢一個新的頁(節點)

如果表使用自增主鍵,那麼每次插入新的記錄,記錄就會順序添加到當前索引節點的後續位置,當一頁寫滿,就會自動開闢一個新的頁

如果使用非自增主鍵(如果身份證號或學號等),由於每次插入主鍵的值近似於隨機,因此每次新紀錄都要被插到現有索引頁得中間某個位置,此時MySQL不得不為了將新記錄插到合適位置而移動數據,甚至目標頁面可能已經被回寫到磁盤上而從緩存中清掉,此時又要從磁盤上讀回來,這增加了很多開銷,同時頻繁的移動、分頁操作造成了大量的碎片,得到了不夠緊湊的索引結構,後續不得不通過OPTIMIZE TABLE來重建表並優化填充頁面。

3.觸發器的作用?

觸發器是一種特殊的存儲過程,主要是通過事件來觸發而被執行的。它可以強化約束,來維護數據的完整性和一致性,可以跟蹤數據庫內的操作從而不允許未經許可的更新和變化。可以聯級運算。如,某表上的觸發器上包含對另一個表的數據操作,而該操作又會導致該表觸發器被觸發。

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

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

調用:

1)可以用一個命令對象來調用存儲過程。

2)可以供外部程序調用,比如:java程序。

5.存儲過程的優缺點?

優點:

1)存儲過程是預編譯過的,執行效率高。

2)存儲過程的代碼直接存放於數據庫中,通過存儲過程名直接調用,減少網絡通訊。

3)安全性高,執行存儲過程需要有一定權限的用戶。

4)存儲過程可以重複使用,可減少數據庫開發人員的工作量。

缺點:

移植性差

6.存儲過程與函數的區別

"

本文內容較多,建議收藏閱讀。

一、基本概念

史上最全面的數據庫常見筆試面試題(附含答案)上

1.主鍵、外鍵、超鍵、候選鍵

超鍵:在關係中能唯一標識元組的屬性集稱為關係模式的超鍵。一個屬性可以為作為一個超鍵,多個屬性組合在一起也可以作為一個超鍵。超鍵包含候選鍵和主鍵。

候選鍵:是最小超鍵,即沒有冗餘元素的超鍵。

主鍵:數據庫表中對儲存數據對象予以唯一和完整標識的數據列或屬性的組合。一個數據列只能有一個主鍵,且主鍵的取值不能缺失,即不能為空值(Null)。

外鍵:在一個表中存在的另一個表的主鍵稱此表的外鍵。

2.為什麼用自增列作為主鍵

如果我們定義了主鍵(PRIMARY KEY),那麼InnoDB會選擇主鍵作為聚集索引、

如果沒有顯式定義主鍵,則InnoDB會選擇第一個不包含有NULL值的唯一索引作為主鍵索引、

如果也沒有這樣的唯一索引,則InnoDB會選擇內置6字節長的ROWID作為隱含的聚集索引(ROWID隨著行記錄的寫入而主鍵遞增,這個ROWID不像ORACLE的ROWID那樣可引用,是隱含的)。

數據記錄本身被存於主索引(一顆B+Tree)的葉子節點上。這就要求同一個葉子節點內(大小為一個內存頁或磁盤頁)的各條數據記錄按主鍵順序存放,因此每當有一條新的記錄插入時,MySQL會根據其主鍵將其插入適當的節點和位置,如果頁面達到裝載因子(InnoDB默認為15/16),則開闢一個新的頁(節點)

如果表使用自增主鍵,那麼每次插入新的記錄,記錄就會順序添加到當前索引節點的後續位置,當一頁寫滿,就會自動開闢一個新的頁

如果使用非自增主鍵(如果身份證號或學號等),由於每次插入主鍵的值近似於隨機,因此每次新紀錄都要被插到現有索引頁得中間某個位置,此時MySQL不得不為了將新記錄插到合適位置而移動數據,甚至目標頁面可能已經被回寫到磁盤上而從緩存中清掉,此時又要從磁盤上讀回來,這增加了很多開銷,同時頻繁的移動、分頁操作造成了大量的碎片,得到了不夠緊湊的索引結構,後續不得不通過OPTIMIZE TABLE來重建表並優化填充頁面。

3.觸發器的作用?

觸發器是一種特殊的存儲過程,主要是通過事件來觸發而被執行的。它可以強化約束,來維護數據的完整性和一致性,可以跟蹤數據庫內的操作從而不允許未經許可的更新和變化。可以聯級運算。如,某表上的觸發器上包含對另一個表的數據操作,而該操作又會導致該表觸發器被觸發。

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

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

調用:

1)可以用一個命令對象來調用存儲過程。

2)可以供外部程序調用,比如:java程序。

5.存儲過程的優缺點?

優點:

1)存儲過程是預編譯過的,執行效率高。

2)存儲過程的代碼直接存放於數據庫中,通過存儲過程名直接調用,減少網絡通訊。

3)安全性高,執行存儲過程需要有一定權限的用戶。

4)存儲過程可以重複使用,可減少數據庫開發人員的工作量。

缺點:

移植性差

6.存儲過程與函數的區別

史上最全面的數據庫常見筆試面試題(附含答案)上

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

視圖:

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

遊標:

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

"

本文內容較多,建議收藏閱讀。

一、基本概念

史上最全面的數據庫常見筆試面試題(附含答案)上

1.主鍵、外鍵、超鍵、候選鍵

超鍵:在關係中能唯一標識元組的屬性集稱為關係模式的超鍵。一個屬性可以為作為一個超鍵,多個屬性組合在一起也可以作為一個超鍵。超鍵包含候選鍵和主鍵。

候選鍵:是最小超鍵,即沒有冗餘元素的超鍵。

主鍵:數據庫表中對儲存數據對象予以唯一和完整標識的數據列或屬性的組合。一個數據列只能有一個主鍵,且主鍵的取值不能缺失,即不能為空值(Null)。

外鍵:在一個表中存在的另一個表的主鍵稱此表的外鍵。

2.為什麼用自增列作為主鍵

如果我們定義了主鍵(PRIMARY KEY),那麼InnoDB會選擇主鍵作為聚集索引、

如果沒有顯式定義主鍵,則InnoDB會選擇第一個不包含有NULL值的唯一索引作為主鍵索引、

如果也沒有這樣的唯一索引,則InnoDB會選擇內置6字節長的ROWID作為隱含的聚集索引(ROWID隨著行記錄的寫入而主鍵遞增,這個ROWID不像ORACLE的ROWID那樣可引用,是隱含的)。

數據記錄本身被存於主索引(一顆B+Tree)的葉子節點上。這就要求同一個葉子節點內(大小為一個內存頁或磁盤頁)的各條數據記錄按主鍵順序存放,因此每當有一條新的記錄插入時,MySQL會根據其主鍵將其插入適當的節點和位置,如果頁面達到裝載因子(InnoDB默認為15/16),則開闢一個新的頁(節點)

如果表使用自增主鍵,那麼每次插入新的記錄,記錄就會順序添加到當前索引節點的後續位置,當一頁寫滿,就會自動開闢一個新的頁

如果使用非自增主鍵(如果身份證號或學號等),由於每次插入主鍵的值近似於隨機,因此每次新紀錄都要被插到現有索引頁得中間某個位置,此時MySQL不得不為了將新記錄插到合適位置而移動數據,甚至目標頁面可能已經被回寫到磁盤上而從緩存中清掉,此時又要從磁盤上讀回來,這增加了很多開銷,同時頻繁的移動、分頁操作造成了大量的碎片,得到了不夠緊湊的索引結構,後續不得不通過OPTIMIZE TABLE來重建表並優化填充頁面。

3.觸發器的作用?

觸發器是一種特殊的存儲過程,主要是通過事件來觸發而被執行的。它可以強化約束,來維護數據的完整性和一致性,可以跟蹤數據庫內的操作從而不允許未經許可的更新和變化。可以聯級運算。如,某表上的觸發器上包含對另一個表的數據操作,而該操作又會導致該表觸發器被觸發。

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

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

調用:

1)可以用一個命令對象來調用存儲過程。

2)可以供外部程序調用,比如:java程序。

5.存儲過程的優缺點?

優點:

1)存儲過程是預編譯過的,執行效率高。

2)存儲過程的代碼直接存放於數據庫中,通過存儲過程名直接調用,減少網絡通訊。

3)安全性高,執行存儲過程需要有一定權限的用戶。

4)存儲過程可以重複使用,可減少數據庫開發人員的工作量。

缺點:

移植性差

6.存儲過程與函數的區別

史上最全面的數據庫常見筆試面試題(附含答案)上

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

視圖:

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

遊標:

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

史上最全面的數據庫常見筆試面試題(附含答案)上

8.視圖的優缺點

優點:

1對數據庫的訪問,因為視圖可以有選擇性的選取數據庫裡的一部分。

2)用戶通過簡單的查詢可以從複雜查詢中得到結果。

3)維護數據的獨立性,試圖可從多個表檢索數據。

4)對於相同的數據可產生不同的視圖。

缺點:

性能:查詢視圖時,必須把視圖的查詢轉化成對基本表的查詢,如果這個視圖是由一個複雜的多表查詢所定義,那麼,那麼就無法更改數據

9.drop、truncate、 delete區別

最基本:

drop直接刪掉表。

truncate刪除表中數據,再插入時自增長id又從1開始。

delete刪除表中數據,可以加where字句。

(1) DELETE語句執行刪除的過程是每次從表中刪除一行,並且同時將該行的刪除操作作為事務記錄在日誌中保存以便進行進行回滾操作。TRUNCATE TABLE 則一次性地從表中刪除所有的數據並不把單獨的刪除操作記錄記入日誌保存,刪除行是不能恢復的。並且在刪除的過程中不會激活與表有關的刪除觸發器。執行速度快。

(2) 表和索引所佔空間。當表被TRUNCATE 後,這個表和索引所佔用的空間會恢復到初始大小,而DELETE操作不會減少表或索引所佔用的空間。drop語句將表所佔用的空間全釋放掉。

(3) 一般而言,drop > truncate > delete

(4) 應用範圍。TRUNCATE 只能對TABLE;DELETE可以是table和view

(5) TRUNCATE 和DELETE只刪除數據,而DROP則刪除整個表(結構和數據)。

(6) truncate與不帶where的delete :只刪除數據,而不刪除表的結構(定義)drop語句將刪除表的結構被依賴的約束(constrain),觸發器(trigger)索引(index);依賴於該表的存儲過程/函數將被保留,但其狀態會變為:invalid。

(7) delete語句為DML(data maintain Language),這個操作會被放到 rollback segment中,事務提交後才生效。如果有相應的 tigger,執行的時候將被觸發。

(8) truncate、drop是DLL(data define language),操作立即生效,原數據不放到 rollback segment中,不能回滾。

(9) 在沒有備份情況下,謹慎使用 drop 與 truncate。要刪除部分數據行採用delete且注意結合where來約束影響範圍。回滾段要足夠大。要刪除表用drop;若想保留表而將表中數據刪除,如果於事務無關,用truncate即可實現。如果和事務有關,或老師想觸發trigger,還是用delete。

(10) Truncate table 表名 速度快,而且效率高,因為:?truncate table 在功能上與不帶 WHERE 子句的 DELETE 語句相同:二者均刪除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統和事務日誌資源少。DELETE 語句每次刪除一行,並在事務日誌中為所刪除的每行記錄一項。TRUNCATE TABLE 通過釋放存儲表數據所用的數據頁來刪除數據,並且只在事務日誌中記錄頁的釋放。

(11) TRUNCATE TABLE 刪除表中的所有行,但表結構及其列、約束、索引等保持不變。新行標識所用的計數值重置為該列的種子。如果想保留標識計數值,請改用 DELETE。如果要刪除表定義及其數據,請使用 DROP TABLE 語句。

(12) 對於由 FOREIGN KEY 約束引用的表,不能使用 TRUNCATE TABLE,而應使用不帶 WHERE 子句的 DELETE 語句。由於 TRUNCATE TABLE 不記錄在日誌中,所以它不能激活觸發器。

"

本文內容較多,建議收藏閱讀。

一、基本概念

史上最全面的數據庫常見筆試面試題(附含答案)上

1.主鍵、外鍵、超鍵、候選鍵

超鍵:在關係中能唯一標識元組的屬性集稱為關係模式的超鍵。一個屬性可以為作為一個超鍵,多個屬性組合在一起也可以作為一個超鍵。超鍵包含候選鍵和主鍵。

候選鍵:是最小超鍵,即沒有冗餘元素的超鍵。

主鍵:數據庫表中對儲存數據對象予以唯一和完整標識的數據列或屬性的組合。一個數據列只能有一個主鍵,且主鍵的取值不能缺失,即不能為空值(Null)。

外鍵:在一個表中存在的另一個表的主鍵稱此表的外鍵。

2.為什麼用自增列作為主鍵

如果我們定義了主鍵(PRIMARY KEY),那麼InnoDB會選擇主鍵作為聚集索引、

如果沒有顯式定義主鍵,則InnoDB會選擇第一個不包含有NULL值的唯一索引作為主鍵索引、

如果也沒有這樣的唯一索引,則InnoDB會選擇內置6字節長的ROWID作為隱含的聚集索引(ROWID隨著行記錄的寫入而主鍵遞增,這個ROWID不像ORACLE的ROWID那樣可引用,是隱含的)。

數據記錄本身被存於主索引(一顆B+Tree)的葉子節點上。這就要求同一個葉子節點內(大小為一個內存頁或磁盤頁)的各條數據記錄按主鍵順序存放,因此每當有一條新的記錄插入時,MySQL會根據其主鍵將其插入適當的節點和位置,如果頁面達到裝載因子(InnoDB默認為15/16),則開闢一個新的頁(節點)

如果表使用自增主鍵,那麼每次插入新的記錄,記錄就會順序添加到當前索引節點的後續位置,當一頁寫滿,就會自動開闢一個新的頁

如果使用非自增主鍵(如果身份證號或學號等),由於每次插入主鍵的值近似於隨機,因此每次新紀錄都要被插到現有索引頁得中間某個位置,此時MySQL不得不為了將新記錄插到合適位置而移動數據,甚至目標頁面可能已經被回寫到磁盤上而從緩存中清掉,此時又要從磁盤上讀回來,這增加了很多開銷,同時頻繁的移動、分頁操作造成了大量的碎片,得到了不夠緊湊的索引結構,後續不得不通過OPTIMIZE TABLE來重建表並優化填充頁面。

3.觸發器的作用?

觸發器是一種特殊的存儲過程,主要是通過事件來觸發而被執行的。它可以強化約束,來維護數據的完整性和一致性,可以跟蹤數據庫內的操作從而不允許未經許可的更新和變化。可以聯級運算。如,某表上的觸發器上包含對另一個表的數據操作,而該操作又會導致該表觸發器被觸發。

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

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

調用:

1)可以用一個命令對象來調用存儲過程。

2)可以供外部程序調用,比如:java程序。

5.存儲過程的優缺點?

優點:

1)存儲過程是預編譯過的,執行效率高。

2)存儲過程的代碼直接存放於數據庫中,通過存儲過程名直接調用,減少網絡通訊。

3)安全性高,執行存儲過程需要有一定權限的用戶。

4)存儲過程可以重複使用,可減少數據庫開發人員的工作量。

缺點:

移植性差

6.存儲過程與函數的區別

史上最全面的數據庫常見筆試面試題(附含答案)上

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

視圖:

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

遊標:

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

史上最全面的數據庫常見筆試面試題(附含答案)上

8.視圖的優缺點

優點:

1對數據庫的訪問,因為視圖可以有選擇性的選取數據庫裡的一部分。

2)用戶通過簡單的查詢可以從複雜查詢中得到結果。

3)維護數據的獨立性,試圖可從多個表檢索數據。

4)對於相同的數據可產生不同的視圖。

缺點:

性能:查詢視圖時,必須把視圖的查詢轉化成對基本表的查詢,如果這個視圖是由一個複雜的多表查詢所定義,那麼,那麼就無法更改數據

9.drop、truncate、 delete區別

最基本:

drop直接刪掉表。

truncate刪除表中數據,再插入時自增長id又從1開始。

delete刪除表中數據,可以加where字句。

(1) DELETE語句執行刪除的過程是每次從表中刪除一行,並且同時將該行的刪除操作作為事務記錄在日誌中保存以便進行進行回滾操作。TRUNCATE TABLE 則一次性地從表中刪除所有的數據並不把單獨的刪除操作記錄記入日誌保存,刪除行是不能恢復的。並且在刪除的過程中不會激活與表有關的刪除觸發器。執行速度快。

(2) 表和索引所佔空間。當表被TRUNCATE 後,這個表和索引所佔用的空間會恢復到初始大小,而DELETE操作不會減少表或索引所佔用的空間。drop語句將表所佔用的空間全釋放掉。

(3) 一般而言,drop > truncate > delete

(4) 應用範圍。TRUNCATE 只能對TABLE;DELETE可以是table和view

(5) TRUNCATE 和DELETE只刪除數據,而DROP則刪除整個表(結構和數據)。

(6) truncate與不帶where的delete :只刪除數據,而不刪除表的結構(定義)drop語句將刪除表的結構被依賴的約束(constrain),觸發器(trigger)索引(index);依賴於該表的存儲過程/函數將被保留,但其狀態會變為:invalid。

(7) delete語句為DML(data maintain Language),這個操作會被放到 rollback segment中,事務提交後才生效。如果有相應的 tigger,執行的時候將被觸發。

(8) truncate、drop是DLL(data define language),操作立即生效,原數據不放到 rollback segment中,不能回滾。

(9) 在沒有備份情況下,謹慎使用 drop 與 truncate。要刪除部分數據行採用delete且注意結合where來約束影響範圍。回滾段要足夠大。要刪除表用drop;若想保留表而將表中數據刪除,如果於事務無關,用truncate即可實現。如果和事務有關,或老師想觸發trigger,還是用delete。

(10) Truncate table 表名 速度快,而且效率高,因為:?truncate table 在功能上與不帶 WHERE 子句的 DELETE 語句相同:二者均刪除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統和事務日誌資源少。DELETE 語句每次刪除一行,並在事務日誌中為所刪除的每行記錄一項。TRUNCATE TABLE 通過釋放存儲表數據所用的數據頁來刪除數據,並且只在事務日誌中記錄頁的釋放。

(11) TRUNCATE TABLE 刪除表中的所有行,但表結構及其列、約束、索引等保持不變。新行標識所用的計數值重置為該列的種子。如果想保留標識計數值,請改用 DELETE。如果要刪除表定義及其數據,請使用 DROP TABLE 語句。

(12) 對於由 FOREIGN KEY 約束引用的表,不能使用 TRUNCATE TABLE,而應使用不帶 WHERE 子句的 DELETE 語句。由於 TRUNCATE TABLE 不記錄在日誌中,所以它不能激活觸發器。

史上最全面的數據庫常見筆試面試題(附含答案)上

10.什麼是臨時表,臨時表什麼時候刪除?

臨時表可以手動刪除:

DROP TEMPORARY TABLE IF EXISTS temp_tb;

臨時表只在當前連接可見,當關閉連接時,MySQL會自動刪除表並釋放所有空間。因此在不同的連接中可以創建同名的臨時表,並且操作屬於本連接的臨時表。

創建臨時表的語法與創建表語法類似,不同之處是增加關鍵字TEMPORARY,

如:

CREATE TEMPORARY TABLE tmp_table (

NAME VARCHAR (10) NOT NULL,

time date NOT NULL

);

select * from tmp_table;

11.非關係型數據庫和關係型數據庫區別,優勢比較?

非關係型數據庫的優勢:

性能:NOSQL是基於鍵值對的,可以想象成表中的主鍵和值的對應關係,而且不需要經過SQL層的解析,所以性能非常高。

可擴展性:同樣也是因為基於鍵值對,數據之間沒有耦合性,所以非常容易水平擴展。

關係型數據庫的優勢:

複雜查詢:可以用SQL語句方便的在一個表以及多個表之間做非常複雜的數據查詢。

事務支持:使得對於安全性能很高的數據訪問要求得以實現。

其他:

1.對於這兩類數據庫,對方的優勢就是自己的弱勢,反之亦然。

2.NOSQL數據庫慢慢開始具備SQL數據庫的一些複雜查詢功能,比如MongoDB。

3.對於事務的支持也可以用一些系統級的原子操作來實現例如樂觀鎖之類的方法來曲線救國,比如Redis set nx。

12.數據庫範式,根據某個場景設計數據表?

第一範式:(確保每列保持原子性)所有字段值都是不可分解的原子值。

第一範式是最基本的範式。如果數據庫表中的所有字段值都是不可分解的原子值,就說明該數據庫表滿足了第一範式。

第一範式的合理遵循需要根據系統的實際需求來定。比如某些數據庫系統中需要用到“地址”這個屬性,本來直接將“地址”屬性設計成一個數據庫表的字段就行。但是如果系統經常會訪問“地址”屬性中的“城市”部分,那麼就非要將“地址”這個屬性重新拆分為省份、城市、詳細地址等多個部分進行存儲,這樣在對地址中某一部分操作的時候將非常方便。這樣設計才算滿足了數據庫的第一範式,如下表所示。

上表所示的用戶信息遵循了第一範式的要求,這樣在對用戶使用城市進行分類的時候就非常方便,也提高了數據庫的性能。

第二範式:(確保表中的每列都和主鍵相關)在一個數據庫表中,一個表中只能保存一種數據,不可以把多種數據保存在同一張數據庫表中。

第二範式在第一範式的基礎之上更進一層。第二範式需要確保數據庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。也就是說在一個數據庫表中,一個表中只能保存一種數據,不可以把多種數據保存在同一張數據庫表中。

比如要設計一個訂單信息表,因為訂單中可能會有多種商品,所以要將訂單編號和商品編號作為數據庫表的聯合主鍵。

第三範式:(確保每列都和主鍵列直接相關,而不是間接相關) 數據表中的每一列數據都和主鍵直接相關,而不能間接相關。

第三範式需要確保數據表中的每一列數據都和主鍵直接相關,而不能間接相關。

比如在設計一個訂單數據表的時候,可以將客戶編號作為一個外鍵和訂單表建立相應的關係。而不可以在訂單表中添加關於客戶其它信息(比如姓名、所屬公司等)的字段。

BCNF:符合3NF,並且,主屬性不依賴於主屬性。

若關係模式屬於第二範式,且每個屬性都不傳遞依賴於鍵碼,則R屬於BC範式。

通常BC範式的條件有多種等價的表述:每個非平凡依賴的左邊必須包含鍵碼;每個決定因素必須包含鍵碼。

BC範式既檢查非主屬性,又檢查主屬性。當只檢查非主屬性時,就成了第三範式。滿足BC範式的關係都必然滿足第三範式。

還可以這麼說:若一個關係達到了第三範式,並且它只有一個候選碼,或者它的每個候選碼都是單屬性,則該關係自然達到BC範式。

一般,一個數據庫設計符合3NF或BCNF就可以了。

第四範式:要求把同一表內的多對多關係刪除。

第五範式:從最終結構重新建立原始結構。

"

本文內容較多,建議收藏閱讀。

一、基本概念

史上最全面的數據庫常見筆試面試題(附含答案)上

1.主鍵、外鍵、超鍵、候選鍵

超鍵:在關係中能唯一標識元組的屬性集稱為關係模式的超鍵。一個屬性可以為作為一個超鍵,多個屬性組合在一起也可以作為一個超鍵。超鍵包含候選鍵和主鍵。

候選鍵:是最小超鍵,即沒有冗餘元素的超鍵。

主鍵:數據庫表中對儲存數據對象予以唯一和完整標識的數據列或屬性的組合。一個數據列只能有一個主鍵,且主鍵的取值不能缺失,即不能為空值(Null)。

外鍵:在一個表中存在的另一個表的主鍵稱此表的外鍵。

2.為什麼用自增列作為主鍵

如果我們定義了主鍵(PRIMARY KEY),那麼InnoDB會選擇主鍵作為聚集索引、

如果沒有顯式定義主鍵,則InnoDB會選擇第一個不包含有NULL值的唯一索引作為主鍵索引、

如果也沒有這樣的唯一索引,則InnoDB會選擇內置6字節長的ROWID作為隱含的聚集索引(ROWID隨著行記錄的寫入而主鍵遞增,這個ROWID不像ORACLE的ROWID那樣可引用,是隱含的)。

數據記錄本身被存於主索引(一顆B+Tree)的葉子節點上。這就要求同一個葉子節點內(大小為一個內存頁或磁盤頁)的各條數據記錄按主鍵順序存放,因此每當有一條新的記錄插入時,MySQL會根據其主鍵將其插入適當的節點和位置,如果頁面達到裝載因子(InnoDB默認為15/16),則開闢一個新的頁(節點)

如果表使用自增主鍵,那麼每次插入新的記錄,記錄就會順序添加到當前索引節點的後續位置,當一頁寫滿,就會自動開闢一個新的頁

如果使用非自增主鍵(如果身份證號或學號等),由於每次插入主鍵的值近似於隨機,因此每次新紀錄都要被插到現有索引頁得中間某個位置,此時MySQL不得不為了將新記錄插到合適位置而移動數據,甚至目標頁面可能已經被回寫到磁盤上而從緩存中清掉,此時又要從磁盤上讀回來,這增加了很多開銷,同時頻繁的移動、分頁操作造成了大量的碎片,得到了不夠緊湊的索引結構,後續不得不通過OPTIMIZE TABLE來重建表並優化填充頁面。

3.觸發器的作用?

觸發器是一種特殊的存儲過程,主要是通過事件來觸發而被執行的。它可以強化約束,來維護數據的完整性和一致性,可以跟蹤數據庫內的操作從而不允許未經許可的更新和變化。可以聯級運算。如,某表上的觸發器上包含對另一個表的數據操作,而該操作又會導致該表觸發器被觸發。

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

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

調用:

1)可以用一個命令對象來調用存儲過程。

2)可以供外部程序調用,比如:java程序。

5.存儲過程的優缺點?

優點:

1)存儲過程是預編譯過的,執行效率高。

2)存儲過程的代碼直接存放於數據庫中,通過存儲過程名直接調用,減少網絡通訊。

3)安全性高,執行存儲過程需要有一定權限的用戶。

4)存儲過程可以重複使用,可減少數據庫開發人員的工作量。

缺點:

移植性差

6.存儲過程與函數的區別

史上最全面的數據庫常見筆試面試題(附含答案)上

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

視圖:

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

遊標:

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

史上最全面的數據庫常見筆試面試題(附含答案)上

8.視圖的優缺點

優點:

1對數據庫的訪問,因為視圖可以有選擇性的選取數據庫裡的一部分。

2)用戶通過簡單的查詢可以從複雜查詢中得到結果。

3)維護數據的獨立性,試圖可從多個表檢索數據。

4)對於相同的數據可產生不同的視圖。

缺點:

性能:查詢視圖時,必須把視圖的查詢轉化成對基本表的查詢,如果這個視圖是由一個複雜的多表查詢所定義,那麼,那麼就無法更改數據

9.drop、truncate、 delete區別

最基本:

drop直接刪掉表。

truncate刪除表中數據,再插入時自增長id又從1開始。

delete刪除表中數據,可以加where字句。

(1) DELETE語句執行刪除的過程是每次從表中刪除一行,並且同時將該行的刪除操作作為事務記錄在日誌中保存以便進行進行回滾操作。TRUNCATE TABLE 則一次性地從表中刪除所有的數據並不把單獨的刪除操作記錄記入日誌保存,刪除行是不能恢復的。並且在刪除的過程中不會激活與表有關的刪除觸發器。執行速度快。

(2) 表和索引所佔空間。當表被TRUNCATE 後,這個表和索引所佔用的空間會恢復到初始大小,而DELETE操作不會減少表或索引所佔用的空間。drop語句將表所佔用的空間全釋放掉。

(3) 一般而言,drop > truncate > delete

(4) 應用範圍。TRUNCATE 只能對TABLE;DELETE可以是table和view

(5) TRUNCATE 和DELETE只刪除數據,而DROP則刪除整個表(結構和數據)。

(6) truncate與不帶where的delete :只刪除數據,而不刪除表的結構(定義)drop語句將刪除表的結構被依賴的約束(constrain),觸發器(trigger)索引(index);依賴於該表的存儲過程/函數將被保留,但其狀態會變為:invalid。

(7) delete語句為DML(data maintain Language),這個操作會被放到 rollback segment中,事務提交後才生效。如果有相應的 tigger,執行的時候將被觸發。

(8) truncate、drop是DLL(data define language),操作立即生效,原數據不放到 rollback segment中,不能回滾。

(9) 在沒有備份情況下,謹慎使用 drop 與 truncate。要刪除部分數據行採用delete且注意結合where來約束影響範圍。回滾段要足夠大。要刪除表用drop;若想保留表而將表中數據刪除,如果於事務無關,用truncate即可實現。如果和事務有關,或老師想觸發trigger,還是用delete。

(10) Truncate table 表名 速度快,而且效率高,因為:?truncate table 在功能上與不帶 WHERE 子句的 DELETE 語句相同:二者均刪除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統和事務日誌資源少。DELETE 語句每次刪除一行,並在事務日誌中為所刪除的每行記錄一項。TRUNCATE TABLE 通過釋放存儲表數據所用的數據頁來刪除數據,並且只在事務日誌中記錄頁的釋放。

(11) TRUNCATE TABLE 刪除表中的所有行,但表結構及其列、約束、索引等保持不變。新行標識所用的計數值重置為該列的種子。如果想保留標識計數值,請改用 DELETE。如果要刪除表定義及其數據,請使用 DROP TABLE 語句。

(12) 對於由 FOREIGN KEY 約束引用的表,不能使用 TRUNCATE TABLE,而應使用不帶 WHERE 子句的 DELETE 語句。由於 TRUNCATE TABLE 不記錄在日誌中,所以它不能激活觸發器。

史上最全面的數據庫常見筆試面試題(附含答案)上

10.什麼是臨時表,臨時表什麼時候刪除?

臨時表可以手動刪除:

DROP TEMPORARY TABLE IF EXISTS temp_tb;

臨時表只在當前連接可見,當關閉連接時,MySQL會自動刪除表並釋放所有空間。因此在不同的連接中可以創建同名的臨時表,並且操作屬於本連接的臨時表。

創建臨時表的語法與創建表語法類似,不同之處是增加關鍵字TEMPORARY,

如:

CREATE TEMPORARY TABLE tmp_table (

NAME VARCHAR (10) NOT NULL,

time date NOT NULL

);

select * from tmp_table;

11.非關係型數據庫和關係型數據庫區別,優勢比較?

非關係型數據庫的優勢:

性能:NOSQL是基於鍵值對的,可以想象成表中的主鍵和值的對應關係,而且不需要經過SQL層的解析,所以性能非常高。

可擴展性:同樣也是因為基於鍵值對,數據之間沒有耦合性,所以非常容易水平擴展。

關係型數據庫的優勢:

複雜查詢:可以用SQL語句方便的在一個表以及多個表之間做非常複雜的數據查詢。

事務支持:使得對於安全性能很高的數據訪問要求得以實現。

其他:

1.對於這兩類數據庫,對方的優勢就是自己的弱勢,反之亦然。

2.NOSQL數據庫慢慢開始具備SQL數據庫的一些複雜查詢功能,比如MongoDB。

3.對於事務的支持也可以用一些系統級的原子操作來實現例如樂觀鎖之類的方法來曲線救國,比如Redis set nx。

12.數據庫範式,根據某個場景設計數據表?

第一範式:(確保每列保持原子性)所有字段值都是不可分解的原子值。

第一範式是最基本的範式。如果數據庫表中的所有字段值都是不可分解的原子值,就說明該數據庫表滿足了第一範式。

第一範式的合理遵循需要根據系統的實際需求來定。比如某些數據庫系統中需要用到“地址”這個屬性,本來直接將“地址”屬性設計成一個數據庫表的字段就行。但是如果系統經常會訪問“地址”屬性中的“城市”部分,那麼就非要將“地址”這個屬性重新拆分為省份、城市、詳細地址等多個部分進行存儲,這樣在對地址中某一部分操作的時候將非常方便。這樣設計才算滿足了數據庫的第一範式,如下表所示。

上表所示的用戶信息遵循了第一範式的要求,這樣在對用戶使用城市進行分類的時候就非常方便,也提高了數據庫的性能。

第二範式:(確保表中的每列都和主鍵相關)在一個數據庫表中,一個表中只能保存一種數據,不可以把多種數據保存在同一張數據庫表中。

第二範式在第一範式的基礎之上更進一層。第二範式需要確保數據庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。也就是說在一個數據庫表中,一個表中只能保存一種數據,不可以把多種數據保存在同一張數據庫表中。

比如要設計一個訂單信息表,因為訂單中可能會有多種商品,所以要將訂單編號和商品編號作為數據庫表的聯合主鍵。

第三範式:(確保每列都和主鍵列直接相關,而不是間接相關) 數據表中的每一列數據都和主鍵直接相關,而不能間接相關。

第三範式需要確保數據表中的每一列數據都和主鍵直接相關,而不能間接相關。

比如在設計一個訂單數據表的時候,可以將客戶編號作為一個外鍵和訂單表建立相應的關係。而不可以在訂單表中添加關於客戶其它信息(比如姓名、所屬公司等)的字段。

BCNF:符合3NF,並且,主屬性不依賴於主屬性。

若關係模式屬於第二範式,且每個屬性都不傳遞依賴於鍵碼,則R屬於BC範式。

通常BC範式的條件有多種等價的表述:每個非平凡依賴的左邊必須包含鍵碼;每個決定因素必須包含鍵碼。

BC範式既檢查非主屬性,又檢查主屬性。當只檢查非主屬性時,就成了第三範式。滿足BC範式的關係都必然滿足第三範式。

還可以這麼說:若一個關係達到了第三範式,並且它只有一個候選碼,或者它的每個候選碼都是單屬性,則該關係自然達到BC範式。

一般,一個數據庫設計符合3NF或BCNF就可以了。

第四範式:要求把同一表內的多對多關係刪除。

第五範式:從最終結構重新建立原始結構。

史上最全面的數據庫常見筆試面試題(附含答案)上

13.什麼是 內連接、外連接、交叉連接、笛卡爾積等?

內連接: 只連接匹配的行

左外連接: 包含左邊表的全部行(不管右邊的表中是否存在與它們匹配的行),以及右邊表中全部匹配的行

右外連接: 包含右邊表的全部行(不管左邊的表中是否存在與它們匹配的行),以及左邊表中全部匹配的行

例如1:

SELECT a.,b. FROM luntan LEFT JOIN usertable as b ON a.username=b.username

例如2:

SELECT a.,b. FROM city as a FULL OUTER JOIN user as b ON a.username=b.username

全外連接: 包含左、右兩個表的全部行,不管另外一邊的表中是否存在與它們匹配的行。

交叉連接: 生成笛卡爾積-它不使用任何匹配或者選取條件,而是直接將一個數據源中的每個行與另一個數據源的每個行都一一匹配

例如:

SELECT type,pub_name FROM titles CROSS JOIN publishers ORDER BY type

14.varchar和char的使用場景?

1.char的長度是不可變的,而varchar的長度是可變的。

定義一個char[10]和varchar[10]。

如果存進去的是‘csdn’,那麼char所佔的長度依然為10,除了字符‘csdn’外,後面跟六個空格,varchar就立馬把長度變為4了,取數據的時候,char類型的要用trim()去掉多餘的空格,而varchar是不需要的。

2.char的存取數度還是要比varchar要快得多,因為其長度固定,方便程序的存儲與查找。

char也為此付出的是空間的代價,因為其長度固定,所以難免會有多餘的空格佔位符佔據空間,可謂是以空間換取時間效率。

varchar是以空間效率為首位。

3.char的存儲方式是:對英文字符(ASCII)佔用1個字節,對一個漢字佔用兩個字節。

varchar的存儲方式是:對每個英文字符佔用2個字節,漢字也佔用2個字節。

4.兩者的存儲數據都非unicode的字符數據。

"

本文內容較多,建議收藏閱讀。

一、基本概念

史上最全面的數據庫常見筆試面試題(附含答案)上

1.主鍵、外鍵、超鍵、候選鍵

超鍵:在關係中能唯一標識元組的屬性集稱為關係模式的超鍵。一個屬性可以為作為一個超鍵,多個屬性組合在一起也可以作為一個超鍵。超鍵包含候選鍵和主鍵。

候選鍵:是最小超鍵,即沒有冗餘元素的超鍵。

主鍵:數據庫表中對儲存數據對象予以唯一和完整標識的數據列或屬性的組合。一個數據列只能有一個主鍵,且主鍵的取值不能缺失,即不能為空值(Null)。

外鍵:在一個表中存在的另一個表的主鍵稱此表的外鍵。

2.為什麼用自增列作為主鍵

如果我們定義了主鍵(PRIMARY KEY),那麼InnoDB會選擇主鍵作為聚集索引、

如果沒有顯式定義主鍵,則InnoDB會選擇第一個不包含有NULL值的唯一索引作為主鍵索引、

如果也沒有這樣的唯一索引,則InnoDB會選擇內置6字節長的ROWID作為隱含的聚集索引(ROWID隨著行記錄的寫入而主鍵遞增,這個ROWID不像ORACLE的ROWID那樣可引用,是隱含的)。

數據記錄本身被存於主索引(一顆B+Tree)的葉子節點上。這就要求同一個葉子節點內(大小為一個內存頁或磁盤頁)的各條數據記錄按主鍵順序存放,因此每當有一條新的記錄插入時,MySQL會根據其主鍵將其插入適當的節點和位置,如果頁面達到裝載因子(InnoDB默認為15/16),則開闢一個新的頁(節點)

如果表使用自增主鍵,那麼每次插入新的記錄,記錄就會順序添加到當前索引節點的後續位置,當一頁寫滿,就會自動開闢一個新的頁

如果使用非自增主鍵(如果身份證號或學號等),由於每次插入主鍵的值近似於隨機,因此每次新紀錄都要被插到現有索引頁得中間某個位置,此時MySQL不得不為了將新記錄插到合適位置而移動數據,甚至目標頁面可能已經被回寫到磁盤上而從緩存中清掉,此時又要從磁盤上讀回來,這增加了很多開銷,同時頻繁的移動、分頁操作造成了大量的碎片,得到了不夠緊湊的索引結構,後續不得不通過OPTIMIZE TABLE來重建表並優化填充頁面。

3.觸發器的作用?

觸發器是一種特殊的存儲過程,主要是通過事件來觸發而被執行的。它可以強化約束,來維護數據的完整性和一致性,可以跟蹤數據庫內的操作從而不允許未經許可的更新和變化。可以聯級運算。如,某表上的觸發器上包含對另一個表的數據操作,而該操作又會導致該表觸發器被觸發。

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

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

調用:

1)可以用一個命令對象來調用存儲過程。

2)可以供外部程序調用,比如:java程序。

5.存儲過程的優缺點?

優點:

1)存儲過程是預編譯過的,執行效率高。

2)存儲過程的代碼直接存放於數據庫中,通過存儲過程名直接調用,減少網絡通訊。

3)安全性高,執行存儲過程需要有一定權限的用戶。

4)存儲過程可以重複使用,可減少數據庫開發人員的工作量。

缺點:

移植性差

6.存儲過程與函數的區別

史上最全面的數據庫常見筆試面試題(附含答案)上

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

視圖:

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

遊標:

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

史上最全面的數據庫常見筆試面試題(附含答案)上

8.視圖的優缺點

優點:

1對數據庫的訪問,因為視圖可以有選擇性的選取數據庫裡的一部分。

2)用戶通過簡單的查詢可以從複雜查詢中得到結果。

3)維護數據的獨立性,試圖可從多個表檢索數據。

4)對於相同的數據可產生不同的視圖。

缺點:

性能:查詢視圖時,必須把視圖的查詢轉化成對基本表的查詢,如果這個視圖是由一個複雜的多表查詢所定義,那麼,那麼就無法更改數據

9.drop、truncate、 delete區別

最基本:

drop直接刪掉表。

truncate刪除表中數據,再插入時自增長id又從1開始。

delete刪除表中數據,可以加where字句。

(1) DELETE語句執行刪除的過程是每次從表中刪除一行,並且同時將該行的刪除操作作為事務記錄在日誌中保存以便進行進行回滾操作。TRUNCATE TABLE 則一次性地從表中刪除所有的數據並不把單獨的刪除操作記錄記入日誌保存,刪除行是不能恢復的。並且在刪除的過程中不會激活與表有關的刪除觸發器。執行速度快。

(2) 表和索引所佔空間。當表被TRUNCATE 後,這個表和索引所佔用的空間會恢復到初始大小,而DELETE操作不會減少表或索引所佔用的空間。drop語句將表所佔用的空間全釋放掉。

(3) 一般而言,drop > truncate > delete

(4) 應用範圍。TRUNCATE 只能對TABLE;DELETE可以是table和view

(5) TRUNCATE 和DELETE只刪除數據,而DROP則刪除整個表(結構和數據)。

(6) truncate與不帶where的delete :只刪除數據,而不刪除表的結構(定義)drop語句將刪除表的結構被依賴的約束(constrain),觸發器(trigger)索引(index);依賴於該表的存儲過程/函數將被保留,但其狀態會變為:invalid。

(7) delete語句為DML(data maintain Language),這個操作會被放到 rollback segment中,事務提交後才生效。如果有相應的 tigger,執行的時候將被觸發。

(8) truncate、drop是DLL(data define language),操作立即生效,原數據不放到 rollback segment中,不能回滾。

(9) 在沒有備份情況下,謹慎使用 drop 與 truncate。要刪除部分數據行採用delete且注意結合where來約束影響範圍。回滾段要足夠大。要刪除表用drop;若想保留表而將表中數據刪除,如果於事務無關,用truncate即可實現。如果和事務有關,或老師想觸發trigger,還是用delete。

(10) Truncate table 表名 速度快,而且效率高,因為:?truncate table 在功能上與不帶 WHERE 子句的 DELETE 語句相同:二者均刪除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統和事務日誌資源少。DELETE 語句每次刪除一行,並在事務日誌中為所刪除的每行記錄一項。TRUNCATE TABLE 通過釋放存儲表數據所用的數據頁來刪除數據,並且只在事務日誌中記錄頁的釋放。

(11) TRUNCATE TABLE 刪除表中的所有行,但表結構及其列、約束、索引等保持不變。新行標識所用的計數值重置為該列的種子。如果想保留標識計數值,請改用 DELETE。如果要刪除表定義及其數據,請使用 DROP TABLE 語句。

(12) 對於由 FOREIGN KEY 約束引用的表,不能使用 TRUNCATE TABLE,而應使用不帶 WHERE 子句的 DELETE 語句。由於 TRUNCATE TABLE 不記錄在日誌中,所以它不能激活觸發器。

史上最全面的數據庫常見筆試面試題(附含答案)上

10.什麼是臨時表,臨時表什麼時候刪除?

臨時表可以手動刪除:

DROP TEMPORARY TABLE IF EXISTS temp_tb;

臨時表只在當前連接可見,當關閉連接時,MySQL會自動刪除表並釋放所有空間。因此在不同的連接中可以創建同名的臨時表,並且操作屬於本連接的臨時表。

創建臨時表的語法與創建表語法類似,不同之處是增加關鍵字TEMPORARY,

如:

CREATE TEMPORARY TABLE tmp_table (

NAME VARCHAR (10) NOT NULL,

time date NOT NULL

);

select * from tmp_table;

11.非關係型數據庫和關係型數據庫區別,優勢比較?

非關係型數據庫的優勢:

性能:NOSQL是基於鍵值對的,可以想象成表中的主鍵和值的對應關係,而且不需要經過SQL層的解析,所以性能非常高。

可擴展性:同樣也是因為基於鍵值對,數據之間沒有耦合性,所以非常容易水平擴展。

關係型數據庫的優勢:

複雜查詢:可以用SQL語句方便的在一個表以及多個表之間做非常複雜的數據查詢。

事務支持:使得對於安全性能很高的數據訪問要求得以實現。

其他:

1.對於這兩類數據庫,對方的優勢就是自己的弱勢,反之亦然。

2.NOSQL數據庫慢慢開始具備SQL數據庫的一些複雜查詢功能,比如MongoDB。

3.對於事務的支持也可以用一些系統級的原子操作來實現例如樂觀鎖之類的方法來曲線救國,比如Redis set nx。

12.數據庫範式,根據某個場景設計數據表?

第一範式:(確保每列保持原子性)所有字段值都是不可分解的原子值。

第一範式是最基本的範式。如果數據庫表中的所有字段值都是不可分解的原子值,就說明該數據庫表滿足了第一範式。

第一範式的合理遵循需要根據系統的實際需求來定。比如某些數據庫系統中需要用到“地址”這個屬性,本來直接將“地址”屬性設計成一個數據庫表的字段就行。但是如果系統經常會訪問“地址”屬性中的“城市”部分,那麼就非要將“地址”這個屬性重新拆分為省份、城市、詳細地址等多個部分進行存儲,這樣在對地址中某一部分操作的時候將非常方便。這樣設計才算滿足了數據庫的第一範式,如下表所示。

上表所示的用戶信息遵循了第一範式的要求,這樣在對用戶使用城市進行分類的時候就非常方便,也提高了數據庫的性能。

第二範式:(確保表中的每列都和主鍵相關)在一個數據庫表中,一個表中只能保存一種數據,不可以把多種數據保存在同一張數據庫表中。

第二範式在第一範式的基礎之上更進一層。第二範式需要確保數據庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。也就是說在一個數據庫表中,一個表中只能保存一種數據,不可以把多種數據保存在同一張數據庫表中。

比如要設計一個訂單信息表,因為訂單中可能會有多種商品,所以要將訂單編號和商品編號作為數據庫表的聯合主鍵。

第三範式:(確保每列都和主鍵列直接相關,而不是間接相關) 數據表中的每一列數據都和主鍵直接相關,而不能間接相關。

第三範式需要確保數據表中的每一列數據都和主鍵直接相關,而不能間接相關。

比如在設計一個訂單數據表的時候,可以將客戶編號作為一個外鍵和訂單表建立相應的關係。而不可以在訂單表中添加關於客戶其它信息(比如姓名、所屬公司等)的字段。

BCNF:符合3NF,並且,主屬性不依賴於主屬性。

若關係模式屬於第二範式,且每個屬性都不傳遞依賴於鍵碼,則R屬於BC範式。

通常BC範式的條件有多種等價的表述:每個非平凡依賴的左邊必須包含鍵碼;每個決定因素必須包含鍵碼。

BC範式既檢查非主屬性,又檢查主屬性。當只檢查非主屬性時,就成了第三範式。滿足BC範式的關係都必然滿足第三範式。

還可以這麼說:若一個關係達到了第三範式,並且它只有一個候選碼,或者它的每個候選碼都是單屬性,則該關係自然達到BC範式。

一般,一個數據庫設計符合3NF或BCNF就可以了。

第四範式:要求把同一表內的多對多關係刪除。

第五範式:從最終結構重新建立原始結構。

史上最全面的數據庫常見筆試面試題(附含答案)上

13.什麼是 內連接、外連接、交叉連接、笛卡爾積等?

內連接: 只連接匹配的行

左外連接: 包含左邊表的全部行(不管右邊的表中是否存在與它們匹配的行),以及右邊表中全部匹配的行

右外連接: 包含右邊表的全部行(不管左邊的表中是否存在與它們匹配的行),以及左邊表中全部匹配的行

例如1:

SELECT a.,b. FROM luntan LEFT JOIN usertable as b ON a.username=b.username

例如2:

SELECT a.,b. FROM city as a FULL OUTER JOIN user as b ON a.username=b.username

全外連接: 包含左、右兩個表的全部行,不管另外一邊的表中是否存在與它們匹配的行。

交叉連接: 生成笛卡爾積-它不使用任何匹配或者選取條件,而是直接將一個數據源中的每個行與另一個數據源的每個行都一一匹配

例如:

SELECT type,pub_name FROM titles CROSS JOIN publishers ORDER BY type

14.varchar和char的使用場景?

1.char的長度是不可變的,而varchar的長度是可變的。

定義一個char[10]和varchar[10]。

如果存進去的是‘csdn’,那麼char所佔的長度依然為10,除了字符‘csdn’外,後面跟六個空格,varchar就立馬把長度變為4了,取數據的時候,char類型的要用trim()去掉多餘的空格,而varchar是不需要的。

2.char的存取數度還是要比varchar要快得多,因為其長度固定,方便程序的存儲與查找。

char也為此付出的是空間的代價,因為其長度固定,所以難免會有多餘的空格佔位符佔據空間,可謂是以空間換取時間效率。

varchar是以空間效率為首位。

3.char的存儲方式是:對英文字符(ASCII)佔用1個字節,對一個漢字佔用兩個字節。

varchar的存儲方式是:對每個英文字符佔用2個字節,漢字也佔用2個字節。

4.兩者的存儲數據都非unicode的字符數據。

史上最全面的數據庫常見筆試面試題(附含答案)上

15.SQL語言分類

SQL語言共分為四大類:

數據查詢語言DQL

數據操縱語言DML

數據定義語言DDL

數據控制語言DCL。

1. 數據查詢語言DQL

數據查詢語言DQL基本結構是由SELECT子句,FROM子句,WHERE子句組成的查詢塊:

SELECT

FROM

WHERE

2 .數據操縱語言DML

數據操縱語言DML主要有三種形式:

1) 插入:INSERT

2) 更新:UPDATE

3) 刪除:DELETE

3. 數據定義語言DDL

數據定義語言DDL用來創建數據庫中的各種對象-----表、視圖、索引、同義詞、聚簇等如:

CREATE TABLE/VIEW/INDEX/SYN/CLUSTER

表 視圖 索引 同義詞 簇

DDL操作是隱性提交的!不能rollback

4. 數據控制語言DCL

數據控制語言DCL用來授予或回收訪問數據庫的某種特權,並控制數據庫操縱事務發生的時間及效果,對數據庫實行監視等。如:

1) GRANT:授權。

2) ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一點。回滾---ROLLBACK;回滾命令使數據庫狀態回到上次最後提交的狀態。其格式為:

SQL>ROLLBACK;

3) COMMIT [WORK]:提交。

在數據庫的插入、刪除和修改操作時,只有當事務在提交到數據庫時才算完成。在事務提交前,只有操作數據庫的這個人才能有權看到所做的事情,別人只有在最後提交完成後才可以看到。

提交數據有三種類型:顯式提交、隱式提交及自動提交。下面分別說明這三種類型。

(1) 顯式提交

用COMMIT命令直接完成的提交為顯式提交。其格式為:

SQL>COMMIT;

(2) 隱式提交

用SQL命令間接完成的提交為隱式提交。這些命令是:

ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,

EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。

(3) 自動提交

若把AUTOCOMMIT設置為ON,則在插入、修改、刪除語句執行後,

系統將自動進行提交,這就是自動提交。其格式為:

SQL>SET AUTOCOMMIT ON;

"

本文內容較多,建議收藏閱讀。

一、基本概念

史上最全面的數據庫常見筆試面試題(附含答案)上

1.主鍵、外鍵、超鍵、候選鍵

超鍵:在關係中能唯一標識元組的屬性集稱為關係模式的超鍵。一個屬性可以為作為一個超鍵,多個屬性組合在一起也可以作為一個超鍵。超鍵包含候選鍵和主鍵。

候選鍵:是最小超鍵,即沒有冗餘元素的超鍵。

主鍵:數據庫表中對儲存數據對象予以唯一和完整標識的數據列或屬性的組合。一個數據列只能有一個主鍵,且主鍵的取值不能缺失,即不能為空值(Null)。

外鍵:在一個表中存在的另一個表的主鍵稱此表的外鍵。

2.為什麼用自增列作為主鍵

如果我們定義了主鍵(PRIMARY KEY),那麼InnoDB會選擇主鍵作為聚集索引、

如果沒有顯式定義主鍵,則InnoDB會選擇第一個不包含有NULL值的唯一索引作為主鍵索引、

如果也沒有這樣的唯一索引,則InnoDB會選擇內置6字節長的ROWID作為隱含的聚集索引(ROWID隨著行記錄的寫入而主鍵遞增,這個ROWID不像ORACLE的ROWID那樣可引用,是隱含的)。

數據記錄本身被存於主索引(一顆B+Tree)的葉子節點上。這就要求同一個葉子節點內(大小為一個內存頁或磁盤頁)的各條數據記錄按主鍵順序存放,因此每當有一條新的記錄插入時,MySQL會根據其主鍵將其插入適當的節點和位置,如果頁面達到裝載因子(InnoDB默認為15/16),則開闢一個新的頁(節點)

如果表使用自增主鍵,那麼每次插入新的記錄,記錄就會順序添加到當前索引節點的後續位置,當一頁寫滿,就會自動開闢一個新的頁

如果使用非自增主鍵(如果身份證號或學號等),由於每次插入主鍵的值近似於隨機,因此每次新紀錄都要被插到現有索引頁得中間某個位置,此時MySQL不得不為了將新記錄插到合適位置而移動數據,甚至目標頁面可能已經被回寫到磁盤上而從緩存中清掉,此時又要從磁盤上讀回來,這增加了很多開銷,同時頻繁的移動、分頁操作造成了大量的碎片,得到了不夠緊湊的索引結構,後續不得不通過OPTIMIZE TABLE來重建表並優化填充頁面。

3.觸發器的作用?

觸發器是一種特殊的存儲過程,主要是通過事件來觸發而被執行的。它可以強化約束,來維護數據的完整性和一致性,可以跟蹤數據庫內的操作從而不允許未經許可的更新和變化。可以聯級運算。如,某表上的觸發器上包含對另一個表的數據操作,而該操作又會導致該表觸發器被觸發。

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

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

調用:

1)可以用一個命令對象來調用存儲過程。

2)可以供外部程序調用,比如:java程序。

5.存儲過程的優缺點?

優點:

1)存儲過程是預編譯過的,執行效率高。

2)存儲過程的代碼直接存放於數據庫中,通過存儲過程名直接調用,減少網絡通訊。

3)安全性高,執行存儲過程需要有一定權限的用戶。

4)存儲過程可以重複使用,可減少數據庫開發人員的工作量。

缺點:

移植性差

6.存儲過程與函數的區別

史上最全面的數據庫常見筆試面試題(附含答案)上

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

視圖:

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

遊標:

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

史上最全面的數據庫常見筆試面試題(附含答案)上

8.視圖的優缺點

優點:

1對數據庫的訪問,因為視圖可以有選擇性的選取數據庫裡的一部分。

2)用戶通過簡單的查詢可以從複雜查詢中得到結果。

3)維護數據的獨立性,試圖可從多個表檢索數據。

4)對於相同的數據可產生不同的視圖。

缺點:

性能:查詢視圖時,必須把視圖的查詢轉化成對基本表的查詢,如果這個視圖是由一個複雜的多表查詢所定義,那麼,那麼就無法更改數據

9.drop、truncate、 delete區別

最基本:

drop直接刪掉表。

truncate刪除表中數據,再插入時自增長id又從1開始。

delete刪除表中數據,可以加where字句。

(1) DELETE語句執行刪除的過程是每次從表中刪除一行,並且同時將該行的刪除操作作為事務記錄在日誌中保存以便進行進行回滾操作。TRUNCATE TABLE 則一次性地從表中刪除所有的數據並不把單獨的刪除操作記錄記入日誌保存,刪除行是不能恢復的。並且在刪除的過程中不會激活與表有關的刪除觸發器。執行速度快。

(2) 表和索引所佔空間。當表被TRUNCATE 後,這個表和索引所佔用的空間會恢復到初始大小,而DELETE操作不會減少表或索引所佔用的空間。drop語句將表所佔用的空間全釋放掉。

(3) 一般而言,drop > truncate > delete

(4) 應用範圍。TRUNCATE 只能對TABLE;DELETE可以是table和view

(5) TRUNCATE 和DELETE只刪除數據,而DROP則刪除整個表(結構和數據)。

(6) truncate與不帶where的delete :只刪除數據,而不刪除表的結構(定義)drop語句將刪除表的結構被依賴的約束(constrain),觸發器(trigger)索引(index);依賴於該表的存儲過程/函數將被保留,但其狀態會變為:invalid。

(7) delete語句為DML(data maintain Language),這個操作會被放到 rollback segment中,事務提交後才生效。如果有相應的 tigger,執行的時候將被觸發。

(8) truncate、drop是DLL(data define language),操作立即生效,原數據不放到 rollback segment中,不能回滾。

(9) 在沒有備份情況下,謹慎使用 drop 與 truncate。要刪除部分數據行採用delete且注意結合where來約束影響範圍。回滾段要足夠大。要刪除表用drop;若想保留表而將表中數據刪除,如果於事務無關,用truncate即可實現。如果和事務有關,或老師想觸發trigger,還是用delete。

(10) Truncate table 表名 速度快,而且效率高,因為:?truncate table 在功能上與不帶 WHERE 子句的 DELETE 語句相同:二者均刪除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統和事務日誌資源少。DELETE 語句每次刪除一行,並在事務日誌中為所刪除的每行記錄一項。TRUNCATE TABLE 通過釋放存儲表數據所用的數據頁來刪除數據,並且只在事務日誌中記錄頁的釋放。

(11) TRUNCATE TABLE 刪除表中的所有行,但表結構及其列、約束、索引等保持不變。新行標識所用的計數值重置為該列的種子。如果想保留標識計數值,請改用 DELETE。如果要刪除表定義及其數據,請使用 DROP TABLE 語句。

(12) 對於由 FOREIGN KEY 約束引用的表,不能使用 TRUNCATE TABLE,而應使用不帶 WHERE 子句的 DELETE 語句。由於 TRUNCATE TABLE 不記錄在日誌中,所以它不能激活觸發器。

史上最全面的數據庫常見筆試面試題(附含答案)上

10.什麼是臨時表,臨時表什麼時候刪除?

臨時表可以手動刪除:

DROP TEMPORARY TABLE IF EXISTS temp_tb;

臨時表只在當前連接可見,當關閉連接時,MySQL會自動刪除表並釋放所有空間。因此在不同的連接中可以創建同名的臨時表,並且操作屬於本連接的臨時表。

創建臨時表的語法與創建表語法類似,不同之處是增加關鍵字TEMPORARY,

如:

CREATE TEMPORARY TABLE tmp_table (

NAME VARCHAR (10) NOT NULL,

time date NOT NULL

);

select * from tmp_table;

11.非關係型數據庫和關係型數據庫區別,優勢比較?

非關係型數據庫的優勢:

性能:NOSQL是基於鍵值對的,可以想象成表中的主鍵和值的對應關係,而且不需要經過SQL層的解析,所以性能非常高。

可擴展性:同樣也是因為基於鍵值對,數據之間沒有耦合性,所以非常容易水平擴展。

關係型數據庫的優勢:

複雜查詢:可以用SQL語句方便的在一個表以及多個表之間做非常複雜的數據查詢。

事務支持:使得對於安全性能很高的數據訪問要求得以實現。

其他:

1.對於這兩類數據庫,對方的優勢就是自己的弱勢,反之亦然。

2.NOSQL數據庫慢慢開始具備SQL數據庫的一些複雜查詢功能,比如MongoDB。

3.對於事務的支持也可以用一些系統級的原子操作來實現例如樂觀鎖之類的方法來曲線救國,比如Redis set nx。

12.數據庫範式,根據某個場景設計數據表?

第一範式:(確保每列保持原子性)所有字段值都是不可分解的原子值。

第一範式是最基本的範式。如果數據庫表中的所有字段值都是不可分解的原子值,就說明該數據庫表滿足了第一範式。

第一範式的合理遵循需要根據系統的實際需求來定。比如某些數據庫系統中需要用到“地址”這個屬性,本來直接將“地址”屬性設計成一個數據庫表的字段就行。但是如果系統經常會訪問“地址”屬性中的“城市”部分,那麼就非要將“地址”這個屬性重新拆分為省份、城市、詳細地址等多個部分進行存儲,這樣在對地址中某一部分操作的時候將非常方便。這樣設計才算滿足了數據庫的第一範式,如下表所示。

上表所示的用戶信息遵循了第一範式的要求,這樣在對用戶使用城市進行分類的時候就非常方便,也提高了數據庫的性能。

第二範式:(確保表中的每列都和主鍵相關)在一個數據庫表中,一個表中只能保存一種數據,不可以把多種數據保存在同一張數據庫表中。

第二範式在第一範式的基礎之上更進一層。第二範式需要確保數據庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。也就是說在一個數據庫表中,一個表中只能保存一種數據,不可以把多種數據保存在同一張數據庫表中。

比如要設計一個訂單信息表,因為訂單中可能會有多種商品,所以要將訂單編號和商品編號作為數據庫表的聯合主鍵。

第三範式:(確保每列都和主鍵列直接相關,而不是間接相關) 數據表中的每一列數據都和主鍵直接相關,而不能間接相關。

第三範式需要確保數據表中的每一列數據都和主鍵直接相關,而不能間接相關。

比如在設計一個訂單數據表的時候,可以將客戶編號作為一個外鍵和訂單表建立相應的關係。而不可以在訂單表中添加關於客戶其它信息(比如姓名、所屬公司等)的字段。

BCNF:符合3NF,並且,主屬性不依賴於主屬性。

若關係模式屬於第二範式,且每個屬性都不傳遞依賴於鍵碼,則R屬於BC範式。

通常BC範式的條件有多種等價的表述:每個非平凡依賴的左邊必須包含鍵碼;每個決定因素必須包含鍵碼。

BC範式既檢查非主屬性,又檢查主屬性。當只檢查非主屬性時,就成了第三範式。滿足BC範式的關係都必然滿足第三範式。

還可以這麼說:若一個關係達到了第三範式,並且它只有一個候選碼,或者它的每個候選碼都是單屬性,則該關係自然達到BC範式。

一般,一個數據庫設計符合3NF或BCNF就可以了。

第四範式:要求把同一表內的多對多關係刪除。

第五範式:從最終結構重新建立原始結構。

史上最全面的數據庫常見筆試面試題(附含答案)上

13.什麼是 內連接、外連接、交叉連接、笛卡爾積等?

內連接: 只連接匹配的行

左外連接: 包含左邊表的全部行(不管右邊的表中是否存在與它們匹配的行),以及右邊表中全部匹配的行

右外連接: 包含右邊表的全部行(不管左邊的表中是否存在與它們匹配的行),以及左邊表中全部匹配的行

例如1:

SELECT a.,b. FROM luntan LEFT JOIN usertable as b ON a.username=b.username

例如2:

SELECT a.,b. FROM city as a FULL OUTER JOIN user as b ON a.username=b.username

全外連接: 包含左、右兩個表的全部行,不管另外一邊的表中是否存在與它們匹配的行。

交叉連接: 生成笛卡爾積-它不使用任何匹配或者選取條件,而是直接將一個數據源中的每個行與另一個數據源的每個行都一一匹配

例如:

SELECT type,pub_name FROM titles CROSS JOIN publishers ORDER BY type

14.varchar和char的使用場景?

1.char的長度是不可變的,而varchar的長度是可變的。

定義一個char[10]和varchar[10]。

如果存進去的是‘csdn’,那麼char所佔的長度依然為10,除了字符‘csdn’外,後面跟六個空格,varchar就立馬把長度變為4了,取數據的時候,char類型的要用trim()去掉多餘的空格,而varchar是不需要的。

2.char的存取數度還是要比varchar要快得多,因為其長度固定,方便程序的存儲與查找。

char也為此付出的是空間的代價,因為其長度固定,所以難免會有多餘的空格佔位符佔據空間,可謂是以空間換取時間效率。

varchar是以空間效率為首位。

3.char的存儲方式是:對英文字符(ASCII)佔用1個字節,對一個漢字佔用兩個字節。

varchar的存儲方式是:對每個英文字符佔用2個字節,漢字也佔用2個字節。

4.兩者的存儲數據都非unicode的字符數據。

史上最全面的數據庫常見筆試面試題(附含答案)上

15.SQL語言分類

SQL語言共分為四大類:

數據查詢語言DQL

數據操縱語言DML

數據定義語言DDL

數據控制語言DCL。

1. 數據查詢語言DQL

數據查詢語言DQL基本結構是由SELECT子句,FROM子句,WHERE子句組成的查詢塊:

SELECT

FROM

WHERE

2 .數據操縱語言DML

數據操縱語言DML主要有三種形式:

1) 插入:INSERT

2) 更新:UPDATE

3) 刪除:DELETE

3. 數據定義語言DDL

數據定義語言DDL用來創建數據庫中的各種對象-----表、視圖、索引、同義詞、聚簇等如:

CREATE TABLE/VIEW/INDEX/SYN/CLUSTER

表 視圖 索引 同義詞 簇

DDL操作是隱性提交的!不能rollback

4. 數據控制語言DCL

數據控制語言DCL用來授予或回收訪問數據庫的某種特權,並控制數據庫操縱事務發生的時間及效果,對數據庫實行監視等。如:

1) GRANT:授權。

2) ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一點。回滾---ROLLBACK;回滾命令使數據庫狀態回到上次最後提交的狀態。其格式為:

SQL>ROLLBACK;

3) COMMIT [WORK]:提交。

在數據庫的插入、刪除和修改操作時,只有當事務在提交到數據庫時才算完成。在事務提交前,只有操作數據庫的這個人才能有權看到所做的事情,別人只有在最後提交完成後才可以看到。

提交數據有三種類型:顯式提交、隱式提交及自動提交。下面分別說明這三種類型。

(1) 顯式提交

用COMMIT命令直接完成的提交為顯式提交。其格式為:

SQL>COMMIT;

(2) 隱式提交

用SQL命令間接完成的提交為隱式提交。這些命令是:

ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,

EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。

(3) 自動提交

若把AUTOCOMMIT設置為ON,則在插入、修改、刪除語句執行後,

系統將自動進行提交,這就是自動提交。其格式為:

SQL>SET AUTOCOMMIT ON;

史上最全面的數據庫常見筆試面試題(附含答案)上

16.like %和-的區別

通配符的分類:

%百分號通配符: 表示任何字符出現任意次數(可以是0次).

_下劃線通配符: 表示只能匹配單個字符,不能多也不能少,就是一個字符.

like操作符: LIKE作用是指示mysql後面的搜索模式是利用通配符而不是直接相等匹配進行比較.

注意 : 如果在使用like操作符時,後面的沒有使用通用匹配符效果是和=一致的,SELECT * FROM products WHERE products.prod_name like '1000';

只能匹配的結果為1000,而不能匹配像JetPack 1000這樣的結果.

%通配符使用: 匹配以"yves"開頭的記錄:(包括記錄"yves") SELECT FROM products WHERE products.prod_name like 'yves%';

匹配包含"yves"的記錄(包括記錄"yves") SELECT FROM products WHERE products.prod_name like '%yves%';

匹配以"yves"結尾的記錄(包括記錄"yves",不包括記錄"yves ",也就是yves後面有空格的記錄,這裡需要注意) SELECT * FROM products WHERE products.prod_name like '%yves';

通配符使用: SELECT FROM products WHERE products.prod_name like '_yves'; 匹配結果為: 像"yyves"這樣記錄.

SELECT FROM products WHERE products.prod*name like 'yves*'; 匹配結果為: 像"yvesHe"這樣的記錄.(一個下劃線只能匹配一個字符,不能多也不能少)

注意事項:

注意大小寫,在使用模糊匹配時,也就是匹配文本時,mysql是可能區分大小的,也可能是不區分大小寫的,這個結果是取決於用戶對MySQL的配置方式.如果是區分大小寫,那麼像YvesHe這樣記錄是不能被"yves__"這樣的匹配條件匹配的.

注意尾部空格,"%yves"是不能匹配"heyves "這樣的記錄的.

注意NULL,%通配符可以匹配任意字符,但是不能匹配NULL,也就是說SELECT * FROM products WHERE products.prod_name like '%;是匹配不到products.prod_name為NULL的的記錄.

技巧與建議:

正如所見, MySQL的通配符很有用。但這種功能是有代價的:通配符搜索的處理一般要比前面討論的其他搜索所花時間更長。這裡給出一些使用通配符要記住的技巧。

不要過度使用通配符。如果其他操作符能達到相同的目的,應該 使用其他操作符。

在確實需要使用通配符時,除非絕對有必要,否則不要把它們用 在搜索模式的開始處。把通配符置於搜索模式的開始處,搜索起 來是最慢的。

仔細注意通配符的位置。如果放錯地方,可能不會返回想要的數.

"

本文內容較多,建議收藏閱讀。

一、基本概念

史上最全面的數據庫常見筆試面試題(附含答案)上

1.主鍵、外鍵、超鍵、候選鍵

超鍵:在關係中能唯一標識元組的屬性集稱為關係模式的超鍵。一個屬性可以為作為一個超鍵,多個屬性組合在一起也可以作為一個超鍵。超鍵包含候選鍵和主鍵。

候選鍵:是最小超鍵,即沒有冗餘元素的超鍵。

主鍵:數據庫表中對儲存數據對象予以唯一和完整標識的數據列或屬性的組合。一個數據列只能有一個主鍵,且主鍵的取值不能缺失,即不能為空值(Null)。

外鍵:在一個表中存在的另一個表的主鍵稱此表的外鍵。

2.為什麼用自增列作為主鍵

如果我們定義了主鍵(PRIMARY KEY),那麼InnoDB會選擇主鍵作為聚集索引、

如果沒有顯式定義主鍵,則InnoDB會選擇第一個不包含有NULL值的唯一索引作為主鍵索引、

如果也沒有這樣的唯一索引,則InnoDB會選擇內置6字節長的ROWID作為隱含的聚集索引(ROWID隨著行記錄的寫入而主鍵遞增,這個ROWID不像ORACLE的ROWID那樣可引用,是隱含的)。

數據記錄本身被存於主索引(一顆B+Tree)的葉子節點上。這就要求同一個葉子節點內(大小為一個內存頁或磁盤頁)的各條數據記錄按主鍵順序存放,因此每當有一條新的記錄插入時,MySQL會根據其主鍵將其插入適當的節點和位置,如果頁面達到裝載因子(InnoDB默認為15/16),則開闢一個新的頁(節點)

如果表使用自增主鍵,那麼每次插入新的記錄,記錄就會順序添加到當前索引節點的後續位置,當一頁寫滿,就會自動開闢一個新的頁

如果使用非自增主鍵(如果身份證號或學號等),由於每次插入主鍵的值近似於隨機,因此每次新紀錄都要被插到現有索引頁得中間某個位置,此時MySQL不得不為了將新記錄插到合適位置而移動數據,甚至目標頁面可能已經被回寫到磁盤上而從緩存中清掉,此時又要從磁盤上讀回來,這增加了很多開銷,同時頻繁的移動、分頁操作造成了大量的碎片,得到了不夠緊湊的索引結構,後續不得不通過OPTIMIZE TABLE來重建表並優化填充頁面。

3.觸發器的作用?

觸發器是一種特殊的存儲過程,主要是通過事件來觸發而被執行的。它可以強化約束,來維護數據的完整性和一致性,可以跟蹤數據庫內的操作從而不允許未經許可的更新和變化。可以聯級運算。如,某表上的觸發器上包含對另一個表的數據操作,而該操作又會導致該表觸發器被觸發。

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

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

調用:

1)可以用一個命令對象來調用存儲過程。

2)可以供外部程序調用,比如:java程序。

5.存儲過程的優缺點?

優點:

1)存儲過程是預編譯過的,執行效率高。

2)存儲過程的代碼直接存放於數據庫中,通過存儲過程名直接調用,減少網絡通訊。

3)安全性高,執行存儲過程需要有一定權限的用戶。

4)存儲過程可以重複使用,可減少數據庫開發人員的工作量。

缺點:

移植性差

6.存儲過程與函數的區別

史上最全面的數據庫常見筆試面試題(附含答案)上

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

視圖:

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

遊標:

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

史上最全面的數據庫常見筆試面試題(附含答案)上

8.視圖的優缺點

優點:

1對數據庫的訪問,因為視圖可以有選擇性的選取數據庫裡的一部分。

2)用戶通過簡單的查詢可以從複雜查詢中得到結果。

3)維護數據的獨立性,試圖可從多個表檢索數據。

4)對於相同的數據可產生不同的視圖。

缺點:

性能:查詢視圖時,必須把視圖的查詢轉化成對基本表的查詢,如果這個視圖是由一個複雜的多表查詢所定義,那麼,那麼就無法更改數據

9.drop、truncate、 delete區別

最基本:

drop直接刪掉表。

truncate刪除表中數據,再插入時自增長id又從1開始。

delete刪除表中數據,可以加where字句。

(1) DELETE語句執行刪除的過程是每次從表中刪除一行,並且同時將該行的刪除操作作為事務記錄在日誌中保存以便進行進行回滾操作。TRUNCATE TABLE 則一次性地從表中刪除所有的數據並不把單獨的刪除操作記錄記入日誌保存,刪除行是不能恢復的。並且在刪除的過程中不會激活與表有關的刪除觸發器。執行速度快。

(2) 表和索引所佔空間。當表被TRUNCATE 後,這個表和索引所佔用的空間會恢復到初始大小,而DELETE操作不會減少表或索引所佔用的空間。drop語句將表所佔用的空間全釋放掉。

(3) 一般而言,drop > truncate > delete

(4) 應用範圍。TRUNCATE 只能對TABLE;DELETE可以是table和view

(5) TRUNCATE 和DELETE只刪除數據,而DROP則刪除整個表(結構和數據)。

(6) truncate與不帶where的delete :只刪除數據,而不刪除表的結構(定義)drop語句將刪除表的結構被依賴的約束(constrain),觸發器(trigger)索引(index);依賴於該表的存儲過程/函數將被保留,但其狀態會變為:invalid。

(7) delete語句為DML(data maintain Language),這個操作會被放到 rollback segment中,事務提交後才生效。如果有相應的 tigger,執行的時候將被觸發。

(8) truncate、drop是DLL(data define language),操作立即生效,原數據不放到 rollback segment中,不能回滾。

(9) 在沒有備份情況下,謹慎使用 drop 與 truncate。要刪除部分數據行採用delete且注意結合where來約束影響範圍。回滾段要足夠大。要刪除表用drop;若想保留表而將表中數據刪除,如果於事務無關,用truncate即可實現。如果和事務有關,或老師想觸發trigger,還是用delete。

(10) Truncate table 表名 速度快,而且效率高,因為:?truncate table 在功能上與不帶 WHERE 子句的 DELETE 語句相同:二者均刪除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統和事務日誌資源少。DELETE 語句每次刪除一行,並在事務日誌中為所刪除的每行記錄一項。TRUNCATE TABLE 通過釋放存儲表數據所用的數據頁來刪除數據,並且只在事務日誌中記錄頁的釋放。

(11) TRUNCATE TABLE 刪除表中的所有行,但表結構及其列、約束、索引等保持不變。新行標識所用的計數值重置為該列的種子。如果想保留標識計數值,請改用 DELETE。如果要刪除表定義及其數據,請使用 DROP TABLE 語句。

(12) 對於由 FOREIGN KEY 約束引用的表,不能使用 TRUNCATE TABLE,而應使用不帶 WHERE 子句的 DELETE 語句。由於 TRUNCATE TABLE 不記錄在日誌中,所以它不能激活觸發器。

史上最全面的數據庫常見筆試面試題(附含答案)上

10.什麼是臨時表,臨時表什麼時候刪除?

臨時表可以手動刪除:

DROP TEMPORARY TABLE IF EXISTS temp_tb;

臨時表只在當前連接可見,當關閉連接時,MySQL會自動刪除表並釋放所有空間。因此在不同的連接中可以創建同名的臨時表,並且操作屬於本連接的臨時表。

創建臨時表的語法與創建表語法類似,不同之處是增加關鍵字TEMPORARY,

如:

CREATE TEMPORARY TABLE tmp_table (

NAME VARCHAR (10) NOT NULL,

time date NOT NULL

);

select * from tmp_table;

11.非關係型數據庫和關係型數據庫區別,優勢比較?

非關係型數據庫的優勢:

性能:NOSQL是基於鍵值對的,可以想象成表中的主鍵和值的對應關係,而且不需要經過SQL層的解析,所以性能非常高。

可擴展性:同樣也是因為基於鍵值對,數據之間沒有耦合性,所以非常容易水平擴展。

關係型數據庫的優勢:

複雜查詢:可以用SQL語句方便的在一個表以及多個表之間做非常複雜的數據查詢。

事務支持:使得對於安全性能很高的數據訪問要求得以實現。

其他:

1.對於這兩類數據庫,對方的優勢就是自己的弱勢,反之亦然。

2.NOSQL數據庫慢慢開始具備SQL數據庫的一些複雜查詢功能,比如MongoDB。

3.對於事務的支持也可以用一些系統級的原子操作來實現例如樂觀鎖之類的方法來曲線救國,比如Redis set nx。

12.數據庫範式,根據某個場景設計數據表?

第一範式:(確保每列保持原子性)所有字段值都是不可分解的原子值。

第一範式是最基本的範式。如果數據庫表中的所有字段值都是不可分解的原子值,就說明該數據庫表滿足了第一範式。

第一範式的合理遵循需要根據系統的實際需求來定。比如某些數據庫系統中需要用到“地址”這個屬性,本來直接將“地址”屬性設計成一個數據庫表的字段就行。但是如果系統經常會訪問“地址”屬性中的“城市”部分,那麼就非要將“地址”這個屬性重新拆分為省份、城市、詳細地址等多個部分進行存儲,這樣在對地址中某一部分操作的時候將非常方便。這樣設計才算滿足了數據庫的第一範式,如下表所示。

上表所示的用戶信息遵循了第一範式的要求,這樣在對用戶使用城市進行分類的時候就非常方便,也提高了數據庫的性能。

第二範式:(確保表中的每列都和主鍵相關)在一個數據庫表中,一個表中只能保存一種數據,不可以把多種數據保存在同一張數據庫表中。

第二範式在第一範式的基礎之上更進一層。第二範式需要確保數據庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。也就是說在一個數據庫表中,一個表中只能保存一種數據,不可以把多種數據保存在同一張數據庫表中。

比如要設計一個訂單信息表,因為訂單中可能會有多種商品,所以要將訂單編號和商品編號作為數據庫表的聯合主鍵。

第三範式:(確保每列都和主鍵列直接相關,而不是間接相關) 數據表中的每一列數據都和主鍵直接相關,而不能間接相關。

第三範式需要確保數據表中的每一列數據都和主鍵直接相關,而不能間接相關。

比如在設計一個訂單數據表的時候,可以將客戶編號作為一個外鍵和訂單表建立相應的關係。而不可以在訂單表中添加關於客戶其它信息(比如姓名、所屬公司等)的字段。

BCNF:符合3NF,並且,主屬性不依賴於主屬性。

若關係模式屬於第二範式,且每個屬性都不傳遞依賴於鍵碼,則R屬於BC範式。

通常BC範式的條件有多種等價的表述:每個非平凡依賴的左邊必須包含鍵碼;每個決定因素必須包含鍵碼。

BC範式既檢查非主屬性,又檢查主屬性。當只檢查非主屬性時,就成了第三範式。滿足BC範式的關係都必然滿足第三範式。

還可以這麼說:若一個關係達到了第三範式,並且它只有一個候選碼,或者它的每個候選碼都是單屬性,則該關係自然達到BC範式。

一般,一個數據庫設計符合3NF或BCNF就可以了。

第四範式:要求把同一表內的多對多關係刪除。

第五範式:從最終結構重新建立原始結構。

史上最全面的數據庫常見筆試面試題(附含答案)上

13.什麼是 內連接、外連接、交叉連接、笛卡爾積等?

內連接: 只連接匹配的行

左外連接: 包含左邊表的全部行(不管右邊的表中是否存在與它們匹配的行),以及右邊表中全部匹配的行

右外連接: 包含右邊表的全部行(不管左邊的表中是否存在與它們匹配的行),以及左邊表中全部匹配的行

例如1:

SELECT a.,b. FROM luntan LEFT JOIN usertable as b ON a.username=b.username

例如2:

SELECT a.,b. FROM city as a FULL OUTER JOIN user as b ON a.username=b.username

全外連接: 包含左、右兩個表的全部行,不管另外一邊的表中是否存在與它們匹配的行。

交叉連接: 生成笛卡爾積-它不使用任何匹配或者選取條件,而是直接將一個數據源中的每個行與另一個數據源的每個行都一一匹配

例如:

SELECT type,pub_name FROM titles CROSS JOIN publishers ORDER BY type

14.varchar和char的使用場景?

1.char的長度是不可變的,而varchar的長度是可變的。

定義一個char[10]和varchar[10]。

如果存進去的是‘csdn’,那麼char所佔的長度依然為10,除了字符‘csdn’外,後面跟六個空格,varchar就立馬把長度變為4了,取數據的時候,char類型的要用trim()去掉多餘的空格,而varchar是不需要的。

2.char的存取數度還是要比varchar要快得多,因為其長度固定,方便程序的存儲與查找。

char也為此付出的是空間的代價,因為其長度固定,所以難免會有多餘的空格佔位符佔據空間,可謂是以空間換取時間效率。

varchar是以空間效率為首位。

3.char的存儲方式是:對英文字符(ASCII)佔用1個字節,對一個漢字佔用兩個字節。

varchar的存儲方式是:對每個英文字符佔用2個字節,漢字也佔用2個字節。

4.兩者的存儲數據都非unicode的字符數據。

史上最全面的數據庫常見筆試面試題(附含答案)上

15.SQL語言分類

SQL語言共分為四大類:

數據查詢語言DQL

數據操縱語言DML

數據定義語言DDL

數據控制語言DCL。

1. 數據查詢語言DQL

數據查詢語言DQL基本結構是由SELECT子句,FROM子句,WHERE子句組成的查詢塊:

SELECT

FROM

WHERE

2 .數據操縱語言DML

數據操縱語言DML主要有三種形式:

1) 插入:INSERT

2) 更新:UPDATE

3) 刪除:DELETE

3. 數據定義語言DDL

數據定義語言DDL用來創建數據庫中的各種對象-----表、視圖、索引、同義詞、聚簇等如:

CREATE TABLE/VIEW/INDEX/SYN/CLUSTER

表 視圖 索引 同義詞 簇

DDL操作是隱性提交的!不能rollback

4. 數據控制語言DCL

數據控制語言DCL用來授予或回收訪問數據庫的某種特權,並控制數據庫操縱事務發生的時間及效果,對數據庫實行監視等。如:

1) GRANT:授權。

2) ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一點。回滾---ROLLBACK;回滾命令使數據庫狀態回到上次最後提交的狀態。其格式為:

SQL>ROLLBACK;

3) COMMIT [WORK]:提交。

在數據庫的插入、刪除和修改操作時,只有當事務在提交到數據庫時才算完成。在事務提交前,只有操作數據庫的這個人才能有權看到所做的事情,別人只有在最後提交完成後才可以看到。

提交數據有三種類型:顯式提交、隱式提交及自動提交。下面分別說明這三種類型。

(1) 顯式提交

用COMMIT命令直接完成的提交為顯式提交。其格式為:

SQL>COMMIT;

(2) 隱式提交

用SQL命令間接完成的提交為隱式提交。這些命令是:

ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,

EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。

(3) 自動提交

若把AUTOCOMMIT設置為ON,則在插入、修改、刪除語句執行後,

系統將自動進行提交,這就是自動提交。其格式為:

SQL>SET AUTOCOMMIT ON;

史上最全面的數據庫常見筆試面試題(附含答案)上

16.like %和-的區別

通配符的分類:

%百分號通配符: 表示任何字符出現任意次數(可以是0次).

_下劃線通配符: 表示只能匹配單個字符,不能多也不能少,就是一個字符.

like操作符: LIKE作用是指示mysql後面的搜索模式是利用通配符而不是直接相等匹配進行比較.

注意 : 如果在使用like操作符時,後面的沒有使用通用匹配符效果是和=一致的,SELECT * FROM products WHERE products.prod_name like '1000';

只能匹配的結果為1000,而不能匹配像JetPack 1000這樣的結果.

%通配符使用: 匹配以"yves"開頭的記錄:(包括記錄"yves") SELECT FROM products WHERE products.prod_name like 'yves%';

匹配包含"yves"的記錄(包括記錄"yves") SELECT FROM products WHERE products.prod_name like '%yves%';

匹配以"yves"結尾的記錄(包括記錄"yves",不包括記錄"yves ",也就是yves後面有空格的記錄,這裡需要注意) SELECT * FROM products WHERE products.prod_name like '%yves';

通配符使用: SELECT FROM products WHERE products.prod_name like '_yves'; 匹配結果為: 像"yyves"這樣記錄.

SELECT FROM products WHERE products.prod*name like 'yves*'; 匹配結果為: 像"yvesHe"這樣的記錄.(一個下劃線只能匹配一個字符,不能多也不能少)

注意事項:

注意大小寫,在使用模糊匹配時,也就是匹配文本時,mysql是可能區分大小的,也可能是不區分大小寫的,這個結果是取決於用戶對MySQL的配置方式.如果是區分大小寫,那麼像YvesHe這樣記錄是不能被"yves__"這樣的匹配條件匹配的.

注意尾部空格,"%yves"是不能匹配"heyves "這樣的記錄的.

注意NULL,%通配符可以匹配任意字符,但是不能匹配NULL,也就是說SELECT * FROM products WHERE products.prod_name like '%;是匹配不到products.prod_name為NULL的的記錄.

技巧與建議:

正如所見, MySQL的通配符很有用。但這種功能是有代價的:通配符搜索的處理一般要比前面討論的其他搜索所花時間更長。這裡給出一些使用通配符要記住的技巧。

不要過度使用通配符。如果其他操作符能達到相同的目的,應該 使用其他操作符。

在確實需要使用通配符時,除非絕對有必要,否則不要把它們用 在搜索模式的開始處。把通配符置於搜索模式的開始處,搜索起 來是最慢的。

仔細注意通配符的位置。如果放錯地方,可能不會返回想要的數.

史上最全面的數據庫常見筆試面試題(附含答案)上

17.count(*)、count(1)、count(column)的區別

count(*)對行的數目進行計算,包含NULL

count(column)對特定的列的值具有的行數進行計算,不包含NULL值。

count()還有一種使用方式,count(1)這個用法和count(*)的結果是一樣的。

性能問題:

1.任何情況下SELECT COUNT(*) FROM tablename是最優選擇;

2.儘量減少SELECT COUNT(*) FROM tablename WHERE COL = ‘value’ 這種查詢;

3.杜絕SELECT COUNT(COL) FROM tablename WHERE COL2 = ‘value’ 的出現。

如果表沒有主鍵,那麼count(1)比count(*)快。

如果有主鍵,那麼count(主鍵,聯合主鍵)比count(*)快。

如果表只有一個字段,count(*)最快。

count(1)跟count(主鍵)一樣,只掃描主鍵。count(*)跟count(非主鍵)一樣,掃描整個表。明顯前者更快一些。

18.最左前綴原則

多列索引:

ALTER TABLE people ADD INDEX lname_fname_age (lame,fname,age);

為了提高搜索效率,我們需要考慮運用多列索引,由於索引文件以B-Tree格式保存,所以我們不用掃描任何記錄,即可得到最終結果。

注: 在mysql中執行查詢時,只能使用一個索引,如果我們在lname,fname,age上分別建索引,執行查詢時,只能使用一個索引,mysql會選擇一個最嚴格(獲得結果集記錄數最少)的索引。

最左前綴原則:顧名思義,就是最左優先,上例中我們創建了lname_fname_age多列索引,相當於創建了(lname)單列索引,(lname,fname)組合索引以及(lname,fname,age)組合索引。

剩下的後續在下文中哦,請持續關注小編了解下文。

"

相關推薦

推薦中...