MySQL数据库面试题(2022年最新版45题)
1、什么是SQL?
????????結構化查詢語言(Structured Query Language)簡稱SQL,是一種數據庫查詢語言。
作用:用于存取數據、查詢、更新和管理關系數據庫系統。
2、什么是MySQL?
????????MySQL是一個關系型數據庫管理系統,由瑞典MySQL AB 公司開發,屬于 Oracle 旗下產品。MySQL 是最流行的關系型數據庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RDBMS (Relational Database Management System,關系數據庫管理系統) 應用軟件之一。在Java企業級開發中非常常用,因為 MySQL 是開源免費的,并且方便擴展。
3、什么是主鍵?
????????主鍵是表格里的(一個或多個)字段,只用來定義表格里的行;主鍵里的值總是唯一的。
4、什么是外鍵?
????????外鍵是一個用來建立兩個表格之間關系的約束。這種關系一般都涉及一個表格里的主鍵字段與另外一個表格(可能是同一個表格)里的一系列相連的字段。那么這些相連的字段就是外鍵。
5、什么是觸發器?
????????觸發器是一種專用類型的存儲過程,它被捆綁到SQL Server 的表格或者視圖上。
6、觸發器的作用?
????????觸發器是一個特殊的存儲過程,主要是通過事件來觸發而被執行的。它可以強化約束,來維護數據的完整性和一致性,可以跟蹤數據庫內的操作從而不允許未經許可的更新和變化。可以聯級運算。如,某表上的觸發器上包含對另一個表的數據操作,而該操作又會導致該表觸發器被觸發。
7、什么是存儲過程?用什么來調用?
????????存儲過程是一個預編譯的SQL語句,優點是允許模塊化的設計,就是說只需創建一次,以后在程序中就可以調用多次。如果某次操作需要執行多次SQL,使用存儲過程比單純SQL語句執行要快。可以用一個“execute?存儲過程名?參數”命令來調用存儲過程。
8、索引的作用?和它的優點缺點是什么?
????????索引就一種特殊的查詢表,數據庫的搜索引擎可以利用它加速對數據的檢索。它很類似與現實生活中書的目錄,不需要查詢整本書內容就可以找到想要的數據。索引可以是唯一的,創建索引允許指定單個列或者是多個列。缺點是它減慢了數據錄入的速度,同時也增加了數據庫的尺寸大小。
9、主鍵和索引的區別?
1、主鍵是為了標識數據庫記錄的唯一性,不允許記錄重復,且鍵值不能為空,主鍵也是一個特殊索引;?
2、數據表中只允許有一個主鍵,但是可以有多個索引;?
3、使用主鍵數據庫會自動創建主索引,也可以在非主鍵上創建索引,方便查詢效率;?
4、索引可以提高查詢速度,它就相當于字典的目錄,可以通過它很快查詢到想要的結果,而不需要進行全表掃描;?
5、唯一索引則標識該索引值唯一,可以由一個或幾個字段組成,一個表可以有多個唯一索引。
10、什么是內存泄漏?
????????一般我們所說的內存泄漏指的是堆內存的泄漏。當應用程序用關鍵字new等創建對象時,就從堆中為它分配一塊內存,使用完后由于某種原因程序未釋放或無法釋放,造成系統內存的浪費。導致程序運行速度減慢甚至系統崩潰等嚴重后果。
11、維護數據庫的完整性和一致性,你喜歡用觸發器還是自寫業務邏輯?為什么?
????????我是這樣做的,盡可能使用約束,如check,主鍵,外鍵,非空字段等來約束,這樣做效率最高,也最方便。其次是使用觸發器,這種方法可以保證,無論什么業務系統訪問數據庫都可以保證數據的完整新和一致性。最后考慮的是自寫業務邏輯,但這樣做麻煩,編程復雜,效率低下。
12、什么是事務?
????????事務就是被綁定在一起作為一個邏輯工作單元的SQL語句組,如果任何一個語句操作失敗那么整個操作就被失敗,進而回滾到操作前狀態,或者是上個節點。為了確保要么執行,要么不執行,就可以使用事務。要將一組語句作為事務考慮,就需要通過ACID測試,即原子性,一致性,隔離性和持久性。
13、什么是鎖?
????????在所有的DBMS中,鎖是實現事務的關鍵,鎖可以保證事務的完整性和并發性。與現實生活中鎖一樣,它可以使某些數據的擁有者,在某段時間內不能使用某些數據或數據結構。當然鎖還分級別的。
14、什么叫視圖?
????????視圖是一種虛擬的表,具有和物理表相同的功能。可以對視圖進行增,改,查,操作,視圖通常是由一個表或者多個表的行或列的子集。它使得我們獲取數據更容易,相比多表查詢。
15、視圖創建和使用語法?
1、首先判斷是否存在
if exists (select * from sysobjects where name = '視圖名')drop view View_EdsProdGo2、創建視圖
create view v_schedule_info as select movieName 電影名,filmLength 片長,screenDate 放映日期,screenTime 放映時間,screeningHall 放映廳名 from movie m left join t_schedule s on m.id=s.movieId left join screening_hall sh on s.hallId=sh.id order by screenDate,screenTime3、?使用視圖
SELECT*from v_schedule_info;16、游標是什么?
????????游標是SQL 的一種數據訪問機制。可以將游標簡單的看成是查詢的結果集的一個指針,可以根據需要在結果集上面來回滾動,瀏覽需要的數據。
17、NULL是什么意思?
????????NULL(空)這個值表示UNKNOWN(未知):它不表示“”(空字符串)。不能把任何值與一個 UNKNOWN值進行比較,都會生產一個NULL值。您必須使用IS NULL操作符。
18、什么是索引,有哪些索引,具體怎么用?
????????索引是與表或視圖關聯的磁盤上結構,可以加快從表或視圖中檢索行的速度。索引包含由表或視圖中的一列或多列生成的鍵。更通俗的說,索引就相當于目錄。為了方便查找書中的內容,通過對內容建立索引形成目錄。索引是一個文件,它是要占據物理空間的。
在數據庫系統中建立索引主要有以下作用:
(1)、快速取數據;
(2)、保證數據記錄的唯一性;
(3)、實現表與表之間的參照完整性;
(4)、在使用ORDER by、group by子句進行數據檢索時,利用索引可以減少排序和分組的時間。
索引分為聚集索引和非聚集索引。
19、聚集索引和非聚集索引區別?
聚集索引,數據按索引順序存儲,中子結點存儲真實的物理數據?
非聚集索引,存儲指向真正數據行的指針
20、您如何確保一個帶有名為Fld1字段的TableB表格里只具有Fld1字段里的那些值,而這些值同時在名為TableA的表格的Fld1字段里?
????????第一個答案是使用外鍵限制。外鍵限制用來維護引用的完整性。它被用來確保表格里的字段只允許有已經在另一表格里的某個字段里定義了的值。通常是另外一個表格的主鍵。
另外一種答案是觸發器。觸發器可以被用來保證以另外一種方式實現與限制相同的作用,但是它非常難設置與維護,而且性能一般都很糟糕。
21、對一個投入使用的在線事務處理表格有過多索引需要有什么樣的性能考慮?
????????對一個表格的索引越多,數據庫引擎用來更新、插入或者刪除數據所需要的時間就越多,因為在數據操控發生的時候索引也必須要維護。
22、你可以用什么來確保表格里的字段只接受特定范圍里的值??
????????可以使用Check約束,它在數據庫表格里定義,用來限制輸入該列的值。
觸發器也可以被用來限制數據庫表格里的字段能夠接受的值,但是這種辦法要求觸發器在表格里被定義,可能會在某些情況下影響到性能。
23、概述存儲過程及其優缺點。
????????存儲過程是一個預編譯的sql語句 ,編譯后可多次使用
優勢:響應時間上來說有優勢,可以給我們帶來運行效率提高的好處,且使用存儲過程的系統更加穩定
缺點:維護性較差,相對于簡單sql,存儲過程并沒有什么優勢,并且在進行調試時比較困難。
24、什么是相關子查詢?如何使用這些查詢?
????????相關子查詢是一種包含子查詢的特殊類型的查詢。查詢里包含的子查詢會請求外部查詢的值,從而形成一個類似于循環的狀況。
25、什么是SQL注入式攻擊?
????????所謂SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁面請求的查詢字符串,欺騙服務器執行惡意的SQL命令。比如:攻擊者在用戶名字和密碼輸入框中輸入"'或'1'='1"之類的內容。最后得到的SQL命令可能變成:SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'。這時,已經不能真正驗證用戶身份,所以系統會錯誤地授權給攻擊者。
26、如何防范SQL注入式攻擊?
????????只要在利用表單輸入的內容構造SQL命令之前,把所有輸入內容過濾一番就可以了。過濾輸入內容可以按多種方式進行。
⑴ 、對于動態構造SQL查詢的場合,可以使用下面的技術:
第一:替換單引號,即把所有單獨出現的單引號改成兩個單引號,防止攻擊者修改SQL命令的含義。
第二:刪除用戶輸入內容中的所有連字符。
第三:對于用來執行查詢的數據庫帳戶,限制其權限。
⑵、 用存儲過程來執行所有的查詢。
⑶ 、限制表單或查詢字符串輸入的長度。
⑷、 檢查用戶輸入的合法性,確信輸入的內容只包含合法的數據。
⑸、 將用戶登錄名稱、密碼等數據加密保存。
⑹ 、檢查提取數據的查詢所返回的記錄數量。
27、默認的系統數據庫有哪些?
(1)、master數據庫(主);(2)、tempdb數據庫(臨時);(3)、model 數據庫(模板);(4)、msdb數據庫(計劃任務);
28、默認創建一個數據庫,會生成哪些文件?
(1)、主文件(.mdf),(2)、日志文件(.ldf),無次要文件(.ndf)。
29、創建數據庫時,能不能把數據文件和日志文件分開?
????????可以分開,起到優化作用。把數據文件放到高速讀寫區,把日志文件放到低速讀寫區。
30、什么是索引覆蓋(Index Covering)查詢?
????????索引覆蓋(Index Covering)查詢是指數據可以只通過索引獲取,而不用接觸表。
31、存儲過程和觸發器的區別?
?????????觸發器與存儲過程的主要區別在于觸發器的運行方式。存儲過程必須有用戶、應用程序或者觸發器來顯示的調用并執行,而觸發器是當特定時間出現的時候,自動執行或者激活的,與連接用數據庫中的用戶、或者應用程序無關
32、存儲過程和函數的區別?
????????存儲過程是用戶定義的一系列SQL語句的集合,,而函數通常是數據庫已定義的方法,具體區別如下:?
1.對于存儲過程來說可以返回參數,而函數只能返回值或者表對象;
2.函數必須有返回值,存儲過程可有可無 ;
3.存儲過程一般是作為一個獨立的部分來執行,而函數可以作為查詢語句的一部分來調用。
33、索引的優缺點,什么時候使用索引,什么時候不能使用索引?
索引最大的好處是提高查詢速度,?
缺點是更新數據時效率低,因為要同時更新索引 ;
對數據進行頻繁查詢進建立索引,如果要頻繁更改數據不建議使用索引。
34、數據庫的優化
1.創建適當的索引?
2.對sql語句優化?
使用exists或not exists代替in或not in
?? 使用存儲過程????
用union替換or(適用于索引列)?
where代替having,having 檢索完所有記錄,才進行過濾?
使用select top或set rowcount來限制操作的行
避免嵌套查詢?
對多個字段進行等值查詢時,聯合索引
35、數據庫的主從復制?
????????默認異步復制,容易造成主庫數據和從庫不一致?
一個數據庫為Master,一個數據庫為slave,通過Binlog日志來實現
slave兩個線程,一個線程去讀master binlog日志,寫到自己的中繼日志?
一個線程解析日志,執行sql?
master啟動一個線程,給slave傳遞binlog日志
半同步復制?
只有把master發送的binlog日志寫到slave的中繼日志,這時主庫才返回操作完成的反饋,性能有一定降低
并行復制?
slave 多個線程去請求binlog日志
36、long_query怎么解決?
????????設置參數,開啟慢日志功能,得到耗時超過一定時間的sql
(1)、slow_query_log 這句是開啟記錄慢查詢功能,slow_query_log=0關閉;slow_query_log=1開啟(這個1可以不寫)
(2)、long_query_time = 1 這句是記錄超過1秒的SQL執行語句
37、varchar和char的使用場景?
(1)、用來存儲字符 ;
(2)、varchar適用字符長度經常變的 ;
(3)、char適用字符長度固定的。
38、數據庫連接池的作用?
(1)、維護一定數量的連接,減少創建連接的時間?;
(2)、更快的響應時間?;
(3)、統一的管理。
39、分庫分表,主從復制,讀寫分離?
讀寫分離,讀從庫,寫主庫?
spring配置兩個數據庫,通過AOP(面向切面編程),在寫或讀方法前面進行判斷得到動態切換數據源。
40、數據庫三范式?
(1)、1NF 屬性不可分?;
(2)、2NF 非主鍵屬性,完全依賴于主鍵屬性?;
(3)、3NF 非主鍵屬性無傳遞依賴。
41、數據庫中join的inner join, outer join, cross join?
以A,B兩張表為例?A left join B?
選出A的所有記錄,B表中沒有的以null 代替?
right join 同理
inner join?
A,B的所有記錄都選出,沒有的記錄以null代替
cross join (笛卡爾積)?
A中的每一條記錄和B中的每一條記錄生成一條記錄?
例如A中有4條,B中有4條,cross join 就有16條記錄
42、有哪些鎖,select時怎么加排它鎖?
樂觀鎖,悲觀鎖,排它鎖,共享鎖,更新鎖,表鎖,行級鎖。
樂觀鎖:樂觀鎖不會鎖住任何東西,也就是說,它不依賴數據庫的事務機制,樂觀鎖完全是應用系統層面的東西。
悲觀鎖:悲觀鎖是指假設并發更新沖突會發生,所以不管沖突是否真的發生,都會使用鎖機制
排它鎖: 可以防止并發事務對資源進行訪問。
共享鎖: 允許并發事務在封閉式并發控制下讀取資源。
更新鎖:是共享鎖和排他鎖的結合。
行級鎖:單獨的一行記錄加鎖
表鎖:鎖住整個表,可以同時讀,寫不行
在Select語句中加for update是給相應的行增加排他鎖。Select出來的數據別的事務不能讀取,不能修改、不能刪除。
43、死鎖怎么解決?
找到進程號,kill 進程
產生死鎖的原因:
一是系統提供的資源數量有限,不能滿足每個進程的使用;二是多道程序運行時,進程推進順序不合理。
產生死鎖的必要條件是:
1、互斥條件;
2、不可剝奪條件(不可搶占);
3、部分分配;
4、循環等待。
根據產生死鎖的四個必要條件,只要使其中之一不能成立,死鎖就不會出現。為此,可以采取下列三種預防措施:
1、采用資源靜態分配策略,破壞"部分分配"條件;
2、允許進程剝奪使用其他進程占有的資源,從而破壞"不可剝奪"條件;
3、采用資源有序分配法,破壞"環路"條件。
解除死鎖常常采用下面兩種方法:1、資源剝奪法;2、撤消進程法
44、最左匹配原則?
????????最左匹配原則是針對索引的?,舉例來說:兩個字段(name,age)建立聯合索引,如果where age=12這樣的話,是沒有利用到索引的,這里我們可以簡單的理解為先是對name字段的值排序,然后對age的數據排序,如果直接查age的話,這時就沒有利用到索引了,查詢條件where name=’xxx’ and age=xx 這時的話,就利用到索引了。因為創建復合索引的規則是首先會對復合索引的最左邊的,也就是第一個name字段的數據進行排序,在第一個字段的排序基礎上,然后再對后面第二個的age字段進行排序。其實就相當于實現了類似 order by name age這樣一種排序規則。所以:第一個name字段是絕對有序的,而第二字段就是無序的了。所以通常情況下,直接使用第二個age字段進行條件判斷是用不到索引的,當然,可能會出現上面的使用index類型的索引。這就是所謂的為什么要強調最左匹配原則的原因。
45、數據庫主鍵、外鍵、約束、索引的作用是什么?有幾種連表查詢方式?
(1)、主鍵、外鍵及約束的作用:保證數據的完整性;
(2)、索引的作用:索引是一個數據結構,用來快速訪問數據庫表格或者視圖里的數據,加快數據庫的搜索引擎對數據的檢索效率;
(3)、方式:左連接、右連接、內連接、自連接。
總結
以上是生活随笔為你收集整理的MySQL数据库面试题(2022年最新版45题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle vm中的xp添加共享文件夹
- 下一篇: mysql增加修改字段