<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          MySQL 給你問懵了?50 道 MySQL 高頻面試題詳解來了

          共 9978字,需瀏覽 20分鐘

           ·

          2020-09-23 23:17

          ??Java大聯(lián)盟

          ? 致力于最高效的Java學(xué)習(xí)

          關(guān)注



          B 站搜索:楠哥教你學(xué)Java

          獲取更多優(yōu)質(zhì)視頻教程


          1、MySQL 中有哪幾種鎖?

          (1)表級鎖:開銷小,加鎖快;不會出現(xiàn)死鎖;鎖定粒度大,發(fā)生鎖沖突概率最 高,并發(fā)度最低。

          (2)行級鎖:開銷大,加鎖慢;會出現(xiàn)死鎖;鎖定粒度最小,發(fā)生鎖沖突的概率最 低,并發(fā)度也最高。

          (3)頁面鎖:開銷和加鎖時間界于表鎖和行鎖之間;會出現(xiàn)死鎖;鎖定粒度界于表 鎖和行鎖之間,并發(fā)度一般。


          2、MySQL 中有哪些不同的表格?

          共有 5 種類型的表格:

          (1)MyISAM

          (2)Heap

          (3)Merge

          (4)INNODB

          (5)ISAM


          3、簡述在 MySQL 數(shù)據(jù)庫中 MyISAM 和 InnoDB 的區(qū)別

          MyISAM:

          (1)不支持事務(wù),但是每次查詢都是原子的;

          (2)支持表級鎖,即每次操作是對整個表加鎖;

          (3)存儲表的總行數(shù);

          (4)一個 MYISAM 表有三個文件:索引文件、表結(jié)構(gòu)文件、數(shù)據(jù)文件;

          (5)采用聚集索引,索引文件的數(shù)據(jù)域存儲指向數(shù)據(jù)文件的指針。輔索引與主索引基本一致,但是輔索引不用保證唯一性。

          InnoDb:

          (1)支持 ACID 的事務(wù),支持事務(wù)的四種隔離級別;

          (2)支持行級鎖及外鍵約束:因此可以支持寫并發(fā);

          (3)不存儲總行數(shù):

          (4)一個 InnoDb 引擎存儲在一個文件空間(共享表空間,表大小不受操作系統(tǒng)控制,一個表可能分布在多個文件里),也有可能為多個(設(shè)置為獨(dú)立表空,表大小受操作系統(tǒng)文件大小限制,一般為 2G),受操作系統(tǒng)文件大小的限制;

          (5)主鍵索引采用聚集索引(索引的數(shù)據(jù)域存儲數(shù)據(jù)文件本身),輔索引的數(shù)據(jù)域存儲主鍵的值;因此從輔索引查找數(shù)據(jù),需要先通過輔索引找到主鍵值,再訪問輔索引;最好使用自增主鍵,防止插入數(shù)據(jù)時,為維持 B+樹結(jié)構(gòu),文件的大調(diào)整。


          4、MySQL 中 InnoDB 支持的四種事務(wù)隔離級別名稱,以及逐級之間的區(qū)別

          SQL 標(biāo)準(zhǔn)定義的四個隔離級別為:

          (1)read uncommited :讀到未提交數(shù)據(jù)

          (2)read committed:臟讀,不可重復(fù)讀

          (3)repeatable read:可重讀

          (4)serializable :串行事物


          5、CHAR 和 VARCHAR 的區(qū)別?

          (1)CHAR 和 VARCHAR 類型在存儲和檢索方面有所不同

          (2)CHAR 列長度固定為創(chuàng)建表時聲明的長度,長度值范圍是 1 到 255 當(dāng) CHAR值被存儲時,它們被用空格填充到特定長度,檢索 CHAR 值時需刪除尾隨空格。


          6、主鍵和候選鍵有什么區(qū)別?

          表格的每一行都主鍵唯一標(biāo)識,一個表只有一個主鍵。

          主鍵也是候選鍵。按照慣例,候選鍵可以被指定為主鍵,并且可以用于任何外鍵引用。


          7、myisamchk 是用來做什么的?

          它用來壓縮 MyISAM 表,這減少了磁盤或內(nèi)存使用。

          MyISAM Static 和 MyISAM Dynamic 有什么區(qū)別?

          在 MyISAM Static 上的所有字段有固定寬度。動態(tài) MyISAM 表將具有像 TEXT,BLOB 等字段,以適應(yīng)不同長度的數(shù)據(jù)類型。

          MyISAM Static 在受損情況下更容易恢復(fù)。


          8、如果一個表有一列定義為 TIMESTAMP,將發(fā)生什么?

          每當(dāng)行被更改時,時間戳字段將獲當(dāng)前時間戳。

          列設(shè)置為 AUTO INCREMENT 時,如果在表中達(dá)到最大值,會發(fā)生什么情況?

          它會停止遞增,任何進(jìn)一步的插入都將產(chǎn)生錯誤,因?yàn)槊荑€已被使用。

          怎樣才能找出最后一次插入時分配了哪個自動增量?

          LAST_INSERT_ID 將返回由 Auto_increment 分配的最后一個值,并且不需要指定表名稱。


          9、你怎么看到為表格定義的所有索引?

          索引是通過以下方式為表格定義的:

          SHOW INDEX FROM ;


          10、LIKE 聲明中的%和_是什么意思?

          %對應(yīng)于 0 個或更多字符,_只是 LIKE 語句中的一個字符。

          如何在 Unix 和 MySQL 時間戳之間進(jìn)行轉(zhuǎn)換?

          UNIX_TIMESTAMP 是從 MySQL 時間戳轉(zhuǎn)換為 Unix 時間戳的命令

          FROM_UNIXTIME 是從 Unix 時間戳轉(zhuǎn)換為 MySQL 時間戳的命令


          11、列對比運(yùn)算符是什么?

          在 SELECT 語句的列比較中使用=,<>,<=,<,> =,>,<<,>>,<=>,AND,OR 或 LIKE 運(yùn)算符。


          12、BLOB 和 TEXT 有什么區(qū)別?

          BLOB 是一個二進(jìn)制對象,可以容納可變數(shù)量的數(shù)據(jù)。TEXT 是一個不區(qū)分大小寫的 BLOB。

          BLOB 和 TEXT 類型之間的唯一區(qū)別在于對 BLOB 值進(jìn)行排序和比較時區(qū)分大小寫,對 TEXT 值不區(qū)分大小寫。


          13、MySQL_fetch_array 和 MySQL_fetch_object 的區(qū)別是什么?

          以下是 MySQL_fetch_array 和 MySQL_fetch_object 的區(qū)別:

          MySQL_fetch_array() – 將結(jié)果行作為關(guān)聯(lián)數(shù)組或來自數(shù)據(jù)庫的常規(guī)數(shù)組返回。

          MySQL_fetch_object – 從數(shù)據(jù)庫返回結(jié)果行作為對象。


          14、MyISAM 表格將在哪里存儲,并且還提供其存儲格式?

          每個 MyISAM 表格以三種格式存儲在磁盤上:

          (1)·“.frm”文件存儲表定義

          (2)·數(shù)據(jù)文件具有“.MYD”(MYData)擴(kuò)展名

          (3)索引文件具有“.MYI”(MYIndex)擴(kuò)展名


          15、MySQL 如何優(yōu)化 DISTINCT?

          DISTINCT 在所有列上轉(zhuǎn)換為 GROUP BY,并與 ORDER BY 子句結(jié)合使用。

          SELECT DISTINCT t1.a FROM t1,t2 where t1.a=t2.a;


          16、如何顯示前 50 行?

          在 MySQL 中,使用以下代碼查詢顯示前 50 行:

          SELECT*FROM

          LIMIT 0,50;


          17、可以使用多少列創(chuàng)建索引?

          任何標(biāo)準(zhǔn)表最多可以創(chuàng)建 16 個索引列。


          18、NOW()和 CURRENT_DATE()有什么區(qū)別?

          NOW()命令用于顯示當(dāng)前年份,月份,日期,小時,分鐘和秒。

          CURRENT_DATE()僅顯示當(dāng)前年份,月份和日期。


          19、什么是非標(biāo)準(zhǔn)字符串類型?

          (1)TINYTEXT

          (2)TEXT

          (3)MEDIUMTEXT

          (4)LONGTEXT


          20、什么是通用 SQL 函數(shù)?

          (1)CONCAT(A, B) – 連接兩個字符串值以創(chuàng)建單個字符串輸出。通常用于將兩個或多個字段合并為一個字段。

          (2)FORMAT(X, D)- 格式化數(shù)字 X 到 D 有效數(shù)字。

          (3)CURRDATE(), CURRTIME()- 返回當(dāng)前日期或時間。

          (4)NOW() – 將當(dāng)前日期和時間作為一個值返回。

          (5)MONTH(),DAY(),YEAR(),WEEK(),WEEKDAY() – 從日期值中提取給定數(shù)據(jù)。

          (6)HOUR(),MINUTE(),SECOND() – 從時間值中提取給定數(shù)據(jù)。

          (7)DATEDIFF(A,B) – 確定兩個日期之間的差異,通常用于計(jì)算年齡

          (8)SUBTIMES(A,B) – 確定兩次之間的差異。

          (9)FROMDAYS(INT) – 將整數(shù)天數(shù)轉(zhuǎn)換為日期值。


          21、MySQL 支持事務(wù)嗎?

          在缺省模式下,MySQL 是 autocommit 模式的,所有的數(shù)據(jù)庫更新操作都會即時提交,所以在缺省情況下,MySQL 是不支持事務(wù)的。

          但是如果你的 MySQL 表類型是使用 InnoDB Tables 或 BDB tables 的話,你的MySQL 就可以使用事務(wù)處理,使用 SETAUTOCOMMIT=0 就可以使 MySQL 允許在非 autocommit 模式,在非autocommit 模式下,你必須使用 COMMIT 來提交你的更改,或者用 ROLLBACK來回滾你的更改。


          22、MySQL 里記錄貨幣用什么字段類型好

          NUMERIC 和 DECIMAL 類型MySQL 實(shí)現(xiàn)為同樣的類型,這在 SQL92 標(biāo)準(zhǔn)允許。他們被用于保存值,該值的準(zhǔn)確精度是極其重要的值,例如與金錢有關(guān)的數(shù)據(jù)。當(dāng)聲明一個類是這些類型之一時,精度和規(guī)模的能被(并且通常是)指定。

          例如:

          salary DECIMAL(9,2)

          在這個例子中,9(precision)代表將被用于存儲值的總的小數(shù)位數(shù),而 2(scale)代 表將被用于存儲小數(shù)點(diǎn)后的位數(shù)。

          因此,在這種情況下,能被存儲在 salary 列中的值的范圍是從-9999999.99 到9999999.99。


          23、MySQL 有關(guān)權(quán)限的表都有哪幾個?

          MySQL 服務(wù)器通過權(quán)限表來控制用戶對數(shù)據(jù)庫的訪問,權(quán)限表存放在 MySQL 數(shù)據(jù)庫里,由 MySQL_install_db 腳本初始化。這些權(quán)限表分別 user,db,table_priv,columns_priv 和 host。


          24、列的字符串類型可以是什么?

          字符串類型是:

          (1)SET2

          (2)BLOB

          (3)ENUM

          (4)CHAR

          (5)TEXT


          25、MySQL 數(shù)據(jù)庫作發(fā)布系統(tǒng)的存儲,一天五萬條以上的增量,預(yù)計(jì)運(yùn)維三年,怎么優(yōu)化?

          (1)設(shè)計(jì)良好的數(shù)據(jù)庫結(jié)構(gòu),允許部分?jǐn)?shù)據(jù)冗余,盡量避免 join 查詢,提高效率。

          (2)選擇合適的表字段數(shù)據(jù)類型和存儲引擎,適當(dāng)?shù)奶砑铀饕?/span>

          (3)MySQL 庫主從讀寫分離。

          (4)找規(guī)律分表,減少單表中的數(shù)據(jù)量提高查詢速度。

          (5)添加緩存機(jī)制,比如 memcached,apc 等。

          (6)不經(jīng)常改動的頁面,生成靜態(tài)頁面。

          (7)書寫高效率的 SQL。比如 SELECT * FROM TABEL 改為 SELECT field_1, field_2, field_3 FROM TABLE.


          26、鎖的優(yōu)化策略

          (1)讀寫分離

          (2)分段加鎖

          (3)減少持有的時間

          (4)多個線程盡量以相同的順序去獲取資源

          不能將鎖的粒度過于細(xì)化,不然可能會出現(xiàn)線程的加鎖和釋放次數(shù)過多,反而效率不如一次加一把大鎖。


          27、索引的底層實(shí)現(xiàn)原理和優(yōu)化

          B+樹,經(jīng)過優(yōu)化的 B+樹

          主要是在所有的葉子結(jié)點(diǎn)中增加了指向下一個葉子節(jié)點(diǎn)的指針,因此 InnoDB 建議為大部分表使用默認(rèn)自增的主鍵作為主索引。


          28、什么情況下設(shè)置了索引但無法使用

          (1)以“%”開頭的 LIKE 語句,模糊匹配

          (2)OR 語句前后沒有同時使用索引

          (3)數(shù)據(jù)類型出現(xiàn)隱式轉(zhuǎn)化(如 varchar 不加單引號的話可能會自動轉(zhuǎn)換為 int 型)


          29、實(shí)踐中如何優(yōu)化 MySQL

          最好是按照以下順序優(yōu)化:

          (1)SQL 語句及索引的優(yōu)化

          (2)數(shù)據(jù)庫表結(jié)構(gòu)的優(yōu)化

          (3)系統(tǒng)配置的優(yōu)化

          (4)硬件的優(yōu)化


          30、優(yōu)化數(shù)據(jù)庫的方法

          (1)選取最適用的字段屬性,盡可能減少定義字段寬度,盡量把字段設(shè)置 NOTNULL,例如’省份’、’性別’最好適用 ENUM

          (2)使用連接(JOIN)來代替子查詢

          (3)適用聯(lián)合(UNION)來代替手動創(chuàng)建的臨時表

          (4)事務(wù)處理

          (5)鎖定表、優(yōu)化事務(wù)處理

          (6)適用外鍵,優(yōu)化鎖定表

          (7)建立索引

          (8)優(yōu)化查詢語句


          31、簡單描述 MySQL 中,索引,主鍵,唯一索引,聯(lián)合索引的區(qū)別,對數(shù)據(jù)庫的性能有什么影響(從讀寫兩方面)

          索引是一種特殊的文件(InnoDB 數(shù)據(jù)表上的索引是表空間的一個組成部分),它們包含著對數(shù)據(jù)表里所有記錄的引用指針。

          普通索引(由關(guān)鍵字 KEY 或 INDEX 定義的索引)的唯一任務(wù)是加快對數(shù)據(jù)的訪問速度。

          普通索引允許被索引的數(shù)據(jù)列包含重復(fù)的值。如果能確定某個數(shù)據(jù)列將只包含彼此各不相同的值,在為這個數(shù)據(jù)列創(chuàng)建索引的時候就應(yīng)該用關(guān)鍵字 UNIQUE 把它定義為一個唯一索引。也就是說,唯一索引可以保證數(shù)據(jù)記錄的唯一性。

          主鍵,是一種特殊的唯一索引,在一張表中只能定義一個主鍵索引,主鍵用于唯一標(biāo)識一條記錄,使用關(guān)鍵字 PRIMARY KEY 來創(chuàng)建。

          索引可以覆蓋多個數(shù)據(jù)列,如像 INDEX(columnA, columnB)索引,這就是聯(lián)合索引。

          索引可以極大的提高數(shù)據(jù)的查詢速度,但是會降低插入、刪除、更新表的速度,因?yàn)樵趫?zhí)行這些寫操作時,還要操作索引文件。


          32、數(shù)據(jù)庫中的事務(wù)是什么?

          事務(wù)(transaction)是作為一個單元的一組有序的數(shù)據(jù)庫操作。如果組中的所有操作都成功,則認(rèn)為事務(wù)成功,即使只有一個操作失敗,事務(wù)也不成功。如果所有操作完成,事務(wù)則提交,其修改將作用于所有其他數(shù)據(jù)庫進(jìn)程。如果一個操作失敗,則事務(wù)將回滾,該事務(wù)所有操作的影響都將取消。

          事務(wù)特性:

          (1)原子性:即不可分割性,事務(wù)要么全部被執(zhí)行,要么就全部不被執(zhí)行。

          (2)一致性或可串性。事務(wù)的執(zhí)行使數(shù)據(jù)庫從一種正確狀態(tài)轉(zhuǎn)換成另一種正確狀態(tài)。

          (3)隔離性。在事務(wù)正確提交之前,不允許把該事務(wù)對數(shù)據(jù)的任何改變提供給任何其他事務(wù)。

          (4)持久性。事務(wù)正確提交后,其結(jié)果將永久保存在數(shù)據(jù)庫中,即使在事務(wù)提交后有了其他故障,事務(wù)的處理結(jié)果也會得到保存。

          或者這樣理解:

          事務(wù)就是被綁定在一起作為一個邏輯工作單元的 SQL 語句分組,如果任何一個語句操作失敗那么整個操作就被失敗,以后操作就會回滾到操作前狀態(tài),或者是上有個節(jié)點(diǎn)。為了確保要么執(zhí)行,要么不執(zhí)行,就可以使用事務(wù)。要將有組語句作為事務(wù)考慮,就需要通過 ACID 測試,即原子性,一致性,隔離性和持久性。


          33、SQL 注入漏洞產(chǎn)生的原因?如何防止?

          SQL 注入產(chǎn)生的原因:程序開發(fā)過程中不注意規(guī)范書寫 sql 語句和對特殊字符進(jìn)行過濾,導(dǎo)致客戶端可以通過全局變量 POST 和 GET 提交一些 sql 語句正常執(zhí)行。

          防止 SQL 注入的方式:

          開啟配置文件中的 magic_quotes_gpc 和 magic_quotes_runtime 設(shè)置

          執(zhí)行 sql 語句時使用 addslashes 進(jìn)行 sql 語句轉(zhuǎn)換

          Sql 語句書寫盡量不要省略雙引號和單引號。

          過濾掉 sql 語句中的一些關(guān)鍵詞:update、insert、delete、select、 * 。

          提高數(shù)據(jù)庫表和字段的命名技巧,對一些重要的字段根據(jù)程序的特點(diǎn)命名,取不易被猜到的。


          34、為表中得字段選擇合適得數(shù)據(jù)類型

          字段類型優(yōu)先級: 整形>date,time>enum,char>varchar>blob,text

          優(yōu)先考慮數(shù)字類型,其次是日期或者二進(jìn)制類型,最后是字符串類型,同級別得數(shù)據(jù)類型,應(yīng)該優(yōu)先選擇占用空間小的數(shù)據(jù)類型


          35、存儲時期

          Datatime:以 YYYY-MM-DD HH:MM:SS 格式存儲時期時間,精確到秒,占用 8 個字節(jié)得存儲空間,datatime 類型與時區(qū)無關(guān)Timestamp:以時間戳格式存儲,占用 4 個字節(jié),范圍小 1970-1-1 到 2038-1-19,顯示依賴于所指定時區(qū),默認(rèn)在第一個列行的數(shù)據(jù)修改時可以自動得修改timestamp 列得值

          Date:(生日)占用字節(jié)數(shù)比使用字符串.datatime.int 儲存要少,使用 date 只需要 3 個字節(jié),存儲日期月份,還可以利用日期時間函數(shù)進(jìn)行日期間計(jì)算

          Time:存儲時間部分數(shù)據(jù)

          注意:不要使用字符串類型來存儲日期時間數(shù)據(jù)(通常比字符串占用儲存空間小,在進(jìn)行查找過濾可以利用日期得函數(shù))

          使用 int 存儲日期時間不如使用 timestamp 類型


          36、對于關(guān)系型數(shù)據(jù)庫而言,索引是相當(dāng)重要的概念,請回答有關(guān)索引的幾個問題:

          (1)索引的目的是什么?

          快速訪問數(shù)據(jù)表中的特定信息,提高檢索速度

          創(chuàng)建唯一性索引,保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性。

          加速表和表之間的連接

          使用分組和排序子句進(jìn)行數(shù)據(jù)檢索時,可以顯著減少查詢中分組和排序的時間

          (2)索引對數(shù)據(jù)庫系統(tǒng)的負(fù)面影響是什么?

          負(fù)面影響:

          創(chuàng)建索引和維護(hù)索引需要耗費(fèi)時間,這個時間隨著數(shù)據(jù)量的增加而增加;索引需要占用物理空間,不光是表需要占用數(shù)據(jù)空間,每個索引也需要占用物理空間;當(dāng)對表進(jìn)行增、刪、改、的時候索引也要動態(tài)維護(hù),這樣就降低了數(shù)據(jù)的維護(hù)速度。

          (3)為數(shù)據(jù)表建立索引的原則有哪些?

          在最頻繁使用的、用以縮小查詢范圍的字段上建立索引。

          在頻繁使用的、需要排序的字段上建立索引

          (4)什么情況下不宜建立索引?

          對于查詢中很少涉及的列或者重復(fù)值比較多的列,不宜建立索引。

          對于一些特殊的數(shù)據(jù)類型,不宜建立索引,比如文本字段(text)等


          37、解釋 MySQL 外連接、內(nèi)連接與自連接的區(qū)別

          先說什么是交叉連接: 交叉連接又叫笛卡爾積,它是指不使用任何條件,直接將一個表的所有記錄和另一個表中的所有記錄一一匹配。

          內(nèi)連接 則是只有條件的交叉連接,根據(jù)某個條件篩選出符合條件的記錄,不符合條件的記錄不會出現(xiàn)在結(jié)果集中,即內(nèi)連接只連接匹配的行。

          外連接 其結(jié)果集中不僅包含符合連接條件的行,而且還會包括左表、右表或兩個表中的所有數(shù)據(jù)行,這三種情況依次稱之為左外連接,右外連接,和全外連接。

          左外連接,也稱左連接,左表為主表,左表中的所有記錄都會出現(xiàn)在結(jié)果集中,對于那些在右表中并沒有匹配的記錄,仍然要顯示,右邊對應(yīng)的那些字段值以NULL 來填充。右外連接,也稱右連接,右表為主表,右表中的所有記錄都會出現(xiàn)在結(jié)果集中。左連接和右連接可以互換,MySQL 目前還不支持全外連接。


          38、Myql 中的事務(wù)回滾機(jī)制概述

          事務(wù)是用戶定義的一個數(shù)據(jù)庫操作序列,這些操作要么全做要么全不做,是一個不可分割的工作單位,事務(wù)回滾是指將該事務(wù)已經(jīng)完成的對數(shù)據(jù)庫的更新操作撤銷。

          要同時修改數(shù)據(jù)庫中兩個不同表時,如果它們不是一個事務(wù)的話,當(dāng)?shù)谝粋€表修改完,可能第二個表修改過程中出現(xiàn)了異常而沒能修改,此時就只有第二個表依舊是未修改之前的狀態(tài),而第一個表已經(jīng)被修改完畢。而當(dāng)你把它們設(shè)定為一個事務(wù)的時候,當(dāng)?shù)谝粋€表修改完,第二表修改出現(xiàn)異常而沒能修改,第一個表和第二個表都要回到未修改的狀態(tài),這就是所謂的事務(wù)回滾


          39、SQL 語言包括哪幾部分?每部分都有哪些操作關(guān)鍵字?

          SQL 語言包括數(shù)據(jù)定義(DDL)、數(shù)據(jù)操縱(DML),數(shù)據(jù)控制(DCL)和數(shù)據(jù)查詢(DQL) 四個部分。

          數(shù)據(jù)定義:Create Table,Alter Table,Drop Table, Craete/Drop Index 等

          數(shù)據(jù)操縱:Select ,insert,update,delete,

          數(shù)據(jù)控制:grant,revoke

          數(shù)據(jù)查詢:select


          40、完整性約束包括哪些?

          數(shù)據(jù)完整性(Data Integrity)是指數(shù)據(jù)的精確(Accuracy)和可靠性(Reliability)。

          分為以下四類:

          (1)實(shí)體完整性:規(guī)定表的每一行在表中是惟一的實(shí)體。

          (2)域完整性:是指表中的列必須滿足某種特定的數(shù)據(jù)類型約束,其中約束又包括取值范圍、精度等規(guī)定。

          (3)參照完整性:是指兩個表的主關(guān)鍵字和外關(guān)鍵字的數(shù)據(jù)應(yīng)一致,保證了表之間的數(shù)據(jù)的一致性,防止了數(shù)據(jù)丟失或無意義的數(shù)據(jù)在數(shù)據(jù)庫中擴(kuò)散。

          (4)用戶定義的完整性:不同的關(guān)系數(shù)據(jù)庫系統(tǒng)根據(jù)其應(yīng)用環(huán)境的不同,往往還需要一些特殊的約束條件。用戶定義的完整性即是針對某個特定關(guān)系數(shù)據(jù)庫的約束條件,它反映某一具體應(yīng)用必須滿足的語義要求。

          與表有關(guān)的約束:包括列約束(NOT NULL(非空約束))和表約束(PRIMARY KEY、foreign key、check、UNIQUE) 。


          41、什么是鎖?

          數(shù)據(jù)庫是一個多用戶使用的共享資源。當(dāng)多個用戶并發(fā)地存取數(shù)據(jù)時,在數(shù)據(jù)庫中就會產(chǎn)生多個事務(wù)同時存取同一數(shù)據(jù)的情況。若對并發(fā)操作不加控制就可能會讀取和存儲不正確的數(shù)據(jù),破壞數(shù)據(jù)庫的一致性。

          加鎖是實(shí)現(xiàn)數(shù)據(jù)庫并發(fā)控制的一個非常重要的技術(shù)。當(dāng)事務(wù)在對某個數(shù)據(jù)對象進(jìn)行操作前,先向系統(tǒng)發(fā)出請求,對其加鎖。加鎖后事務(wù)就對該數(shù)據(jù)對象有了一定的控制,在該事務(wù)釋放鎖之前,其他的事務(wù)不能對此數(shù)據(jù)對象進(jìn)行更新操作。

          基本鎖類型:鎖包括行級鎖和表級鎖


          42、什么叫視圖?游標(biāo)是什么?

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

          游標(biāo):是對查詢出來的結(jié)果集作為一個單元來有效的處理。游標(biāo)可以定在該單元中的特定行,從結(jié)果集的當(dāng)前行檢索一行或多行??梢詫Y(jié)果集當(dāng)前行做修改。一般不使用游標(biāo),但是需要逐條處理數(shù)據(jù)的時候,游標(biāo)顯得十分重要。


          43、什么是存儲過程?用什么來調(diào)用?

          存儲過程是一個預(yù)編譯的 SQL 語句,優(yōu)點(diǎn)是允許模塊化的設(shè)計(jì),就是說只需創(chuàng)建一次,以后在該程序中就可以調(diào)用多次。如果某次操作需要執(zhí)行多次 SQL,使用存儲過程比單純 SQL 語句執(zhí)行要快??梢杂靡粋€命令對象來調(diào)用存儲過程。


          44、如何通俗地理解三個范式?

          第一范式:1NF 是對屬性的原子性約束,要求屬性具有原子性,不可再分解;

          第二范式:2NF 是對記錄的惟一性約束,要求記錄有惟一標(biāo)識,即實(shí)體的惟一性;

          第三范式:3NF 是對字段冗余性的約束,即任何字段不能由其他字段派生出來,它要求字段沒有冗余。。

          范式化設(shè)計(jì)優(yōu)缺點(diǎn):

          優(yōu)點(diǎn):可以盡量減少數(shù)據(jù)冗余,使得更新快,體積小

          缺點(diǎn):對于查詢需要多個表進(jìn)行關(guān)聯(lián),減少寫得效率增加讀得效率,更難進(jìn)行索引優(yōu)化

          反范式化:

          優(yōu)點(diǎn):可以減少表關(guān)聯(lián),可以更好得進(jìn)行索引優(yōu)化

          缺點(diǎn):數(shù)據(jù)冗余以及數(shù)據(jù)異常,數(shù)據(jù)修改需要更多的成本


          45、什么是基本表?什么是視圖?

          基本表是本身獨(dú)立存在的表,在 SQL 中一個關(guān)系就對應(yīng)一個表。視圖是從一個或幾個基本表導(dǎo)出的表。視圖本身不獨(dú)立存儲在數(shù)據(jù)庫中,是一個虛


          46、試述視圖的優(yōu)點(diǎn)?

          (1) 視圖能夠簡化用戶的操作

          (2) 視圖使用戶能以多種角度看待同一數(shù)據(jù);

          (3) 視圖為數(shù)據(jù)庫提供了一定程度的邏輯獨(dú)立性;

          (4)視圖能夠?qū)C(jī)密數(shù)據(jù)提供安全保護(hù)。


          47、 NULL 是什么意思

          NULL 這個值表示 UNKNOWN(未知):它不表示“”(空字符串)。對 NULL 這個值的任何比較都會生產(chǎn)一個 NULL 值。您不能把任何值與一個 NULL 值進(jìn)行比較,并在邏輯上希望獲得一個答案。

          使用 IS NULL 來進(jìn)行 NULL 判斷


          48、主鍵、外鍵和索引的區(qū)別?

          主鍵、外鍵和索引的區(qū)別

          定義:

          主鍵——唯一標(biāo)識一條記錄,不能有重復(fù)的,不允許為空

          外鍵——表的外鍵是另一表的主鍵, 外鍵可以有重復(fù)的, 可以是空值

          索引——該字段沒有重復(fù)值,但可以有一個空值

          作用:

          主鍵——用來保證數(shù)據(jù)完整性

          外鍵——用來和其他表建立聯(lián)系用的

          索引——是提高查詢排序的速度

          個數(shù):

          主鍵—— 主鍵只能有一個

          外鍵—— 一個表可以有多個外鍵

          索引—— 一個表可以有多個唯一索引


          49、你可以用什么來確保表格里的字段只接受特定范圍里的值?

          Check 限制,它在數(shù)據(jù)庫表格里被定義,用來限制輸入該列的值。

          觸發(fā)器也可以被用來限制數(shù)據(jù)庫表格里的字段能夠接受的值,但是這種辦法要求觸發(fā)器在表格里被定義,這可能會在某些情況下影響到性能。


          50、說說對 SQL 語句優(yōu)化有哪些方法?(選擇幾條)

          (1)Where 子句中:where 表之間的連接必須寫在其他 Where 條件之前,那些可以過濾掉最大數(shù)量記錄的條件必須寫在 Where 子句的末尾.HAVING 最后。

          (2)用 EXISTS 替代 IN、用 NOT EXISTS 替代 NOT IN。

          (3) 避免在索引列上使用計(jì)算

          (4)避免在索引列上使用 IS NULL 和 IS NOT NULL

          (5)對查詢進(jìn)行優(yōu)化,應(yīng)盡量避免全表掃描,首先應(yīng)考慮在 where 及 order by 涉及的列上建立索引。

          (6)應(yīng)盡量避免在 where 子句中對字段進(jìn)行 null 值判斷,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描

          (7)應(yīng)盡量避免在 where 子句中對字段進(jìn)行表達(dá)式操作,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描


          推薦閱讀

          1、Spring Boot+Vue項(xiàng)目實(shí)戰(zhàn)

          2、B站:4小時上手MyBatis Plus

          3、一文搞懂前后端分離

          4、快速上手Spring Boot+Vue前后端分離


          楠哥簡介

          資深 Java 工程師,微信號?southwindss

          《Java零基礎(chǔ)實(shí)戰(zhàn)》一書作者

          騰訊課程官方 Java 面試官,今日頭條認(rèn)證大V

          GitChat認(rèn)證作者,B站認(rèn)證UP主(楠哥教你學(xué)Java)

          致力于幫助萬千 Java 學(xué)習(xí)者持續(xù)成長。




          有收獲,就點(diǎn)在看?
          瀏覽 80
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人狼友网址 | 超碰97在线播放 | 色综合激情视频 | 国产精品97 | 天天色天天爽 |