日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

数据库常见笔试面试题及答案

發(fā)布時(shí)間:2023/12/20 数据库 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库常见笔试面试题及答案 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.主鍵、外鍵、超鍵、候選鍵
超鍵:在關(guān)系中能唯一標(biāo)識(shí)元組的屬性集稱為關(guān)系模式的超鍵。一個(gè)屬性可以為作為一個(gè)超鍵,多個(gè)屬性組合在一起也可以作為一個(gè)超鍵。超鍵包含候選鍵和主鍵。
候選鍵:是最小超鍵,即沒有冗余元素的超鍵。
主鍵:數(shù)據(jù)庫(kù)表中對(duì)儲(chǔ)存數(shù)據(jù)對(duì)象予以唯一和完整標(biāo)識(shí)的數(shù)據(jù)列或?qū)傩缘慕M合。一個(gè)數(shù)據(jù)列只能有一個(gè)主鍵,且主鍵的取值不能缺失,即不能為空值(Null)。
外鍵:在一個(gè)表中存在的另一個(gè)表的主鍵稱此表的外鍵。

2.為什么用自增列作為主鍵
如果我們定義了主鍵(PRIMARY KEY),那么InnoDB會(huì)選擇主鍵作為聚集索引、
如果沒有顯式定義主鍵,則InnoDB會(huì)選擇第一個(gè)不包含有NULL值的唯一索引作為主鍵索引、
如果也沒有這樣的唯一索引,則InnoDB會(huì)選擇內(nèi)置6字節(jié)長(zhǎng)的ROWID作為隱含的聚集索引(ROWID隨著行記錄的寫入而主鍵遞增,這個(gè)ROWID不像ORACLE的ROWID那樣可引用,是隱含的)。
數(shù)據(jù)記錄本身被存于主索引(一顆B+Tree)的葉子節(jié)點(diǎn)上。這就要求同一個(gè)葉子節(jié)點(diǎn)內(nèi)(大小為一個(gè)內(nèi)存頁(yè)或磁盤頁(yè))的各條數(shù)據(jù)記錄按主鍵順序存放,因此每當(dāng)有一條新的記錄插入時(shí),MySQL會(huì)根據(jù)其主鍵將其插入適當(dāng)?shù)墓?jié)點(diǎn)和位置,如果頁(yè)面達(dá)到裝載因子(InnoDB默認(rèn)為15/16),則開辟一個(gè)新的頁(yè)(節(jié)點(diǎn))
如果表使用自增主鍵,那么每次插入新的記錄,記錄就會(huì)順序添加到當(dāng)前索引節(jié)點(diǎn)的后續(xù)位置,當(dāng)一頁(yè)寫滿,就會(huì)自動(dòng)開辟一個(gè)新的頁(yè)
如果使用非自增主鍵(如果身份證號(hào)或?qū)W號(hào)等),由于每次插入主鍵的值近似于隨機(jī),因此每次新紀(jì)錄都要被插到現(xiàn)有索引頁(yè)得中間某個(gè)位置,此時(shí)MySQL不得不為了將新記錄插到合適位置而移動(dòng)數(shù)據(jù),甚至目標(biāo)頁(yè)面可能已經(jīng)被回寫到磁盤上而從緩存中清掉,此時(shí)又要從磁盤上讀回來(lái),這增加了很多開銷,同時(shí)頻繁的移動(dòng)、分頁(yè)操作造成了大量的碎片,得到了不夠緊湊的索引結(jié)構(gòu),后續(xù)不得不通過OPTIMIZE TABLE來(lái)重建表并優(yōu)化填充頁(yè)面。

3.觸發(fā)器的作用?
觸發(fā)器是一種特殊的存儲(chǔ)過程,主要是通過事件來(lái)觸發(fā)而被執(zhí)行的。它可以強(qiáng)化約束,來(lái)維護(hù)數(shù)據(jù)的完整性和一致性,可以跟蹤數(shù)據(jù)庫(kù)內(nèi)的操作從而不允許未經(jīng)許可的更新和變化。可以聯(lián)級(jí)運(yùn)算。如,某表上的觸發(fā)器上包含對(duì)另一個(gè)表的數(shù)據(jù)操作,而該操作又會(huì)導(dǎo)致該表觸發(fā)器被觸發(fā)

4.什么是存儲(chǔ)過程?用什么來(lái)調(diào)用?
存儲(chǔ)過程是一個(gè)預(yù)編譯的SQL語(yǔ)句,優(yōu)點(diǎn)是允許模塊化的設(shè)計(jì),就是說(shuō)只需創(chuàng)建一次,以后在該程序中就可以調(diào)用多次。如果某次操作需要執(zhí)行多次SQL,使用存儲(chǔ)過程比單純SQL語(yǔ)句執(zhí)行要快。
調(diào)用:
1)可以用一個(gè)命令對(duì)象來(lái)調(diào)用存儲(chǔ)過程。
2)可以供外部程序調(diào)用,比如:java程序。

5.存儲(chǔ)過程的優(yōu)缺點(diǎn)?
優(yōu)點(diǎn):
1)存儲(chǔ)過程是預(yù)編譯過的,執(zhí)行效率高。
2)存儲(chǔ)過程的代碼直接存放于數(shù)據(jù)庫(kù)中,通過存儲(chǔ)過程名直接調(diào)用,減少網(wǎng)絡(luò)通訊。
3)安全性高,執(zhí)行存儲(chǔ)過程需要有一定權(quán)限的用戶。
4)存儲(chǔ)過程可以重復(fù)使用,可減少數(shù)據(jù)庫(kù)開發(fā)人員的工作量。
缺點(diǎn):
移植性差

6.存儲(chǔ)過程與函數(shù)的區(qū)別
一、含義的不同
1、存儲(chǔ)du過程:存儲(chǔ)過程是 SQL 語(yǔ)句和可選控制流語(yǔ)句的預(yù)zhi編譯集合,以一個(gè)名稱存儲(chǔ)并dao作為一個(gè)單元處理。
2、函數(shù):是由一個(gè)或多個(gè) SQL 語(yǔ)句組成的子程序,可用于封裝代碼以便重新使用。 函數(shù)限制比較多,如不能用臨時(shí)表,只能用表變量等
二、使用條件不同
1、存儲(chǔ)過程:可以在單個(gè)存儲(chǔ)過程中執(zhí)行一系列 SQL 語(yǔ)句。而且可以從自己的存儲(chǔ)過程內(nèi)引用其它存儲(chǔ)過程,這可以簡(jiǎn)化一系列復(fù)雜語(yǔ)句。
2、函數(shù):自定義函數(shù)諸多限制,有許多語(yǔ)句不能使用,許多功能不能實(shí)現(xiàn)。函數(shù)可以直接引用返回值,用表變量返回記錄集。但是,用戶定義函數(shù)不能用于執(zhí)行一組修改全局?jǐn)?shù)據(jù)庫(kù)狀態(tài)的操作。
三、執(zhí)行方式不同
1、存儲(chǔ)過程:存儲(chǔ)過程可以返回參數(shù),如記錄集,函數(shù)只能返回值或者表對(duì)象。存儲(chǔ)過程的參數(shù)有in,out,inout三種,存儲(chǔ)過程聲明時(shí)不需要返回類型。

7.什么叫視圖?游標(biāo)是什么?
視圖:
是一種虛擬的表,具有和物理表相同的功能。可以對(duì)視圖進(jìn)行增,改,查,操作,試圖通常是有一個(gè)表或者多個(gè)表的行或列的子集。對(duì)視圖的修改會(huì)影響基本表。它使得我們獲取數(shù)據(jù)更容易,相比多表查詢。
游標(biāo):
是對(duì)查詢出來(lái)的結(jié)果集作為一個(gè)單元來(lái)有效的處理。游標(biāo)可以定在該單元中的特定行,從結(jié)果集的當(dāng)前行檢索一行或多行。可以對(duì)結(jié)果集當(dāng)前行做修改。一般不使用游標(biāo),但是需要逐條處理數(shù)據(jù)的時(shí)候,游標(biāo)顯得十分重要。

8.視圖的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1對(duì)數(shù)據(jù)庫(kù)的訪問,因?yàn)橐晥D可以有選擇性的選取數(shù)據(jù)庫(kù)里的一部分。
2)用戶通過簡(jiǎn)單的查詢可以從復(fù)雜查詢中得到結(jié)果。
3)維護(hù)數(shù)據(jù)的獨(dú)立性,試圖可從多個(gè)表檢索數(shù)據(jù)。
4)對(duì)于相同的數(shù)據(jù)可產(chǎn)生不同的視圖。
缺點(diǎn):
性能:查詢視圖時(shí),必須把視圖的查詢轉(zhuǎn)化成對(duì)基本表的查詢,如果這個(gè)視圖是由一個(gè)復(fù)雜的多表查詢所定義,那么,那么就無(wú)法更改數(shù)據(jù)

9.drop、truncate、 delete區(qū)別
最基本:
drop直接刪掉表。
truncate刪除表中數(shù)據(jù),再插入時(shí)自增長(zhǎng)id又從1開始。
delete刪除表中數(shù)據(jù),可以加where字句。
(1) DELETE語(yǔ)句執(zhí)行刪除的過程是每次從表中刪除一行,并且同時(shí)將該行的刪除操作作為事務(wù)記錄在日志中保存以便進(jìn)行進(jìn)行回滾操作。TRUNCATE TABLE 則一次性地從表中刪除所有的數(shù)據(jù)并不把單獨(dú)的刪除操作記錄記入日志保存,刪除行是不能恢復(fù)的。并且在刪除的過程中不會(huì)激活與表有關(guān)的刪除觸發(fā)器。執(zhí)行速度快。
(2) 表和索引所占空間。當(dāng)表被TRUNCATE 后,這個(gè)表和索引所占用的空間會(huì)恢復(fù)到初始大小,而DELETE操作不會(huì)減少表或索引所占用的空間。drop語(yǔ)句將表所占用的空間全釋放掉。
(3) 一般而言,drop > truncate > delete
(4) 應(yīng)用范圍。TRUNCATE 只能對(duì)TABLE;DELETE可以是table和view
(5) TRUNCATE 和DELETE只刪除數(shù)據(jù),而DROP則刪除整個(gè)表(結(jié)構(gòu)和數(shù)據(jù))。
(6) truncate與不帶where的delete :只刪除數(shù)據(jù),而不刪除表的結(jié)構(gòu)(定義)drop語(yǔ)句將刪除表的結(jié)構(gòu)被依賴的約束(constrain),觸發(fā)器(trigger)索引(index);依賴于該表的存儲(chǔ)過程/函數(shù)將被保留,但其狀態(tài)會(huì)變?yōu)?#xff1a;invalid。
(7) delete語(yǔ)句為DML(data maintain Language),這個(gè)操作會(huì)被放到 rollback segment中,事務(wù)提交后才生效。如果有相應(yīng)的 tigger,執(zhí)行的時(shí)候?qū)⒈挥|發(fā)。
(8) truncate、drop是DLL(data define language),操作立即生效,原數(shù)據(jù)不放到 rollback segment中,不能回滾。
(9) 在沒有備份情況下,謹(jǐn)慎使用 drop 與 truncate。要?jiǎng)h除部分?jǐn)?shù)據(jù)行采用delete且注意結(jié)合where來(lái)約束影響范圍。回滾段要足夠大。要?jiǎng)h除表用drop;若想保留表而將表中數(shù)據(jù)刪除,如果于事務(wù)無(wú)關(guān),用truncate即可實(shí)現(xiàn)。如果和事務(wù)有關(guān),或老師想觸發(fā)trigger,還是用delete。
(10) Truncate table 表名 速度快,而且效率高,因?yàn)??truncate table 在功能上與不帶 WHERE 子句的 DELETE 語(yǔ)句相同:二者均刪除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統(tǒng)和事務(wù)日志資源少。DELETE 語(yǔ)句每次刪除一行,并在事務(wù)日志中為所刪除的每行記錄一項(xiàng)。TRUNCATE TABLE 通過釋放存儲(chǔ)表數(shù)據(jù)所用的數(shù)據(jù)頁(yè)來(lái)刪除數(shù)據(jù),并且只在事務(wù)日志中記錄頁(yè)的釋放。
(11) TRUNCATE TABLE 刪除表中的所有行,但表結(jié)構(gòu)及其列、約束、索引等保持不變。新行標(biāo)識(shí)所用的計(jì)數(shù)值重置為該列的種子。如果想保留標(biāo)識(shí)計(jì)數(shù)值,請(qǐng)改用 DELETE。如果要?jiǎng)h除表定義及其數(shù)據(jù),請(qǐng)使用 DROP TABLE 語(yǔ)句。
(12) 對(duì)于由 FOREIGN KEY 約束引用的表,不能使用 TRUNCATE TABLE,而應(yīng)使用不帶 WHERE 子句的 DELETE 語(yǔ)句。由于 TRUNCATE TABLE 不記錄在日志中,所以它不能激活觸發(fā)器。

10.什么是臨時(shí)表,臨時(shí)表什么時(shí)候刪除?
臨時(shí)表可以手動(dòng)刪除:
DROP TEMPORARY TABLE IF EXISTS temp_tb;
臨時(shí)表只在當(dāng)前連接可見,當(dāng)關(guān)閉連接時(shí),MySQL會(huì)自動(dòng)刪除表并釋放所有空間。因此在不同的連接中可以創(chuàng)建同名的臨時(shí)表,并且操作屬于本連接的臨時(shí)表。
創(chuàng)建臨時(shí)表的語(yǔ)法與創(chuàng)建表語(yǔ)法類似,不同之處是增加關(guān)鍵字TEMPORARY,
如:
CREATE TEMPORARY TABLE tmp_table (
NAME VARCHAR (10) NOT NULL,
time date NOT NULL
);
select * from tmp_table;

11.非關(guān)系型數(shù)據(jù)庫(kù)和關(guān)系型數(shù)據(jù)庫(kù)區(qū)別,優(yōu)勢(shì)比較?
非關(guān)系型數(shù)據(jù)庫(kù)的優(yōu)勢(shì):
性能:NOSQL是基于鍵值對(duì)的,可以想象成表中的主鍵和值的對(duì)應(yīng)關(guān)系,而且不需要經(jīng)過SQL層的解析,所以性能非常高。
可擴(kuò)展性:同樣也是因?yàn)榛阪I值對(duì),數(shù)據(jù)之間沒有耦合性,所以非常容易水平擴(kuò)展。
關(guān)系型數(shù)據(jù)庫(kù)的優(yōu)勢(shì):
復(fù)雜查詢:可以用SQL語(yǔ)句方便的在一個(gè)表以及多個(gè)表之間做非常復(fù)雜的數(shù)據(jù)查詢。
事務(wù)支持:使得對(duì)于安全性能很高的數(shù)據(jù)訪問要求得以實(shí)現(xiàn)。
其他:
1.對(duì)于這兩類數(shù)據(jù)庫(kù),對(duì)方的優(yōu)勢(shì)就是自己的弱勢(shì),反之亦然。
2.NOSQL數(shù)據(jù)庫(kù)慢慢開始具備SQL數(shù)據(jù)庫(kù)的一些復(fù)雜查詢功能,比如MongoDB。
3.對(duì)于事務(wù)的支持也可以用一些系統(tǒng)級(jí)的原子操作來(lái)實(shí)現(xiàn)例如樂觀鎖之類的方法來(lái)曲線救國(guó),比如Redis set nx。

12.數(shù)據(jù)庫(kù)范式,根據(jù)某個(gè)場(chǎng)景設(shè)計(jì)數(shù)據(jù)表?
第一范式:(確保每列保持原子性)所有字段值都是不可分解的原子值。
第一范式是最基本的范式。如果數(shù)據(jù)庫(kù)表中的所有字段值都是不可分解的原子值,就說(shuō)明該數(shù)據(jù)庫(kù)表滿足了第一范式。
第一范式的合理遵循需要根據(jù)系統(tǒng)的實(shí)際需求來(lái)定。比如某些數(shù)據(jù)庫(kù)系統(tǒng)中需要用到“地址”這個(gè)屬性,本來(lái)直接將“地址”屬性設(shè)計(jì)成一個(gè)數(shù)據(jù)庫(kù)表的字段就行。但是如果系統(tǒng)經(jīng)常會(huì)訪問“地址”屬性中的“城市”部分,那么就非要將“地址”這個(gè)屬性重新拆分為省份、城市、詳細(xì)地址等多個(gè)部分進(jìn)行存儲(chǔ),這樣在對(duì)地址中某一部分操作的時(shí)候?qū)⒎浅7奖恪_@樣設(shè)計(jì)才算滿足了數(shù)據(jù)庫(kù)的第一范式,如下表所示。
上表所示的用戶信息遵循了第一范式的要求,這樣在對(duì)用戶使用城市進(jìn)行分類的時(shí)候就非常方便,也提高了數(shù)據(jù)庫(kù)的性能。
第二范式:(確保表中的每列都和主鍵相關(guān))在一個(gè)數(shù)據(jù)庫(kù)表中,一個(gè)表中只能保存一種數(shù)據(jù),不可以把多種數(shù)據(jù)保存在同一張數(shù)據(jù)庫(kù)表中。
第二范式在第一范式的基礎(chǔ)之上更進(jìn)一層。第二范式需要確保數(shù)據(jù)庫(kù)表中的每一列都和主鍵相關(guān),而不能只與主鍵的某一部分相關(guān)(主要針對(duì)聯(lián)合主鍵而言)。也就是說(shuō)在一個(gè)數(shù)據(jù)庫(kù)表中,一個(gè)表中只能保存一種數(shù)據(jù),不可以把多種數(shù)據(jù)保存在同一張數(shù)據(jù)庫(kù)表中。
比如要設(shè)計(jì)一個(gè)訂單信息表,因?yàn)橛唵沃锌赡軙?huì)有多種商品,所以要將訂單編號(hào)和商品編號(hào)作為數(shù)據(jù)庫(kù)表的聯(lián)合主鍵。
第三范式:(確保每列都和主鍵列直接相關(guān),而不是間接相關(guān)) 數(shù)據(jù)表中的每一列數(shù)據(jù)都和主鍵直接相關(guān),而不能間接相關(guān)。
第三范式需要確保數(shù)據(jù)表中的每一列數(shù)據(jù)都和主鍵直接相關(guān),而不能間接相關(guān)。
比如在設(shè)計(jì)一個(gè)訂單數(shù)據(jù)表的時(shí)候,可以將客戶編號(hào)作為一個(gè)外鍵和訂單表建立相應(yīng)的關(guān)系。而不可以在訂單表中添加關(guān)于客戶其它信息(比如姓名、所屬公司等)的字段。
BCNF:符合3NF,并且,主屬性不依賴于主屬性。
若關(guān)系模式屬于第二范式,且每個(gè)屬性都不傳遞依賴于鍵碼,則R屬于BC范式。
通常BC范式的條件有多種等價(jià)的表述:每個(gè)非平凡依賴的左邊必須包含鍵碼;每個(gè)決定因素必須包含鍵碼。
BC范式既檢查非主屬性,又檢查主屬性。當(dāng)只檢查非主屬性時(shí),就成了第三范式。滿足BC范式的關(guān)系都必然滿足第三范式。
還可以這么說(shuō):若一個(gè)關(guān)系達(dá)到了第三范式,并且它只有一個(gè)候選碼,或者它的每個(gè)候選碼都是單屬性,則該關(guān)系自然達(dá)到BC范式。
一般,一個(gè)數(shù)據(jù)庫(kù)設(shè)計(jì)符合3NF或BCNF就可以了。
第四范式:要求把同一表內(nèi)的多對(duì)多關(guān)系刪除。
第五范式:從最終結(jié)構(gòu)重新建立原始結(jié)構(gòu)。

13.什么是 內(nèi)連接、外連接、交叉連接、笛卡爾積等?
內(nèi)連接: 只連接匹配的行
左外連接: 包含左邊表的全部行(不管右邊的表中是否存在與它們匹配的行),以及右邊表中全部匹配的行
右外連接: 包含右邊表的全部行(不管左邊的表中是否存在與它們匹配的行),以及左邊表中全部匹配的行
例如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
全外連接: 包含左、右兩個(gè)表的全部行,不管另外一邊的表中是否存在與它們匹配的行。
交叉連接: 生成笛卡爾積-它不使用任何匹配或者選取條件,而是直接將一個(gè)數(shù)據(jù)源中的每個(gè)行與另一個(gè)數(shù)據(jù)源的每個(gè)行都一一匹配
例如:
SELECT type,pub_name FROM titles CROSS JOIN publishers ORDER BY type

14.varchar和char的使用場(chǎng)景?
1.char的長(zhǎng)度是不可變的,而varchar的長(zhǎng)度是可變的。
定義一個(gè)char[10]和varchar[10]。
如果存進(jìn)去的是‘csdn’,那么char所占的長(zhǎng)度依然為10,除了字符‘csdn’外,后面跟六個(gè)空格,varchar就立馬把長(zhǎng)度變?yōu)?了,取數(shù)據(jù)的時(shí)候,char類型的要用trim()去掉多余的空格,而varchar是不需要的。
2.char的存取數(shù)度還是要比varchar要快得多,因?yàn)槠溟L(zhǎng)度固定,方便程序的存儲(chǔ)與查找。
char也為此付出的是空間的代價(jià),因?yàn)槠溟L(zhǎng)度固定,所以難免會(huì)有多余的空格占位符占據(jù)空間,可謂是以空間換取時(shí)間效率。
varchar是以空間效率為首位。
3.char的存儲(chǔ)方式是:對(duì)英文字符(ASCII)占用1個(gè)字節(jié),對(duì)一個(gè)漢字占用兩個(gè)字節(jié)。
varchar的存儲(chǔ)方式是:對(duì)每個(gè)英文字符占用2個(gè)字節(jié),漢字也占用2個(gè)字節(jié)。
4.兩者的存儲(chǔ)數(shù)據(jù)都非unicode的字符數(shù)據(jù)。

15.SQL語(yǔ)言分類
SQL語(yǔ)言共分為四大類:
數(shù)據(jù)查詢語(yǔ)言DQL
數(shù)據(jù)操縱語(yǔ)言DML
數(shù)據(jù)定義語(yǔ)言DDL
數(shù)據(jù)控制語(yǔ)言DCL。

  • 數(shù)據(jù)查詢語(yǔ)言DQL
    數(shù)據(jù)查詢語(yǔ)言DQL基本結(jié)構(gòu)是由SELECT子句,FROM子句,WHERE子句組成的查詢塊:
    SELECT
    FROM
    WHERE
    2 .數(shù)據(jù)操縱語(yǔ)言DML
    數(shù)據(jù)操縱語(yǔ)言DML主要有三種形式:
  • 插入:INSERT
  • 更新:UPDATE
  • 刪除:DELETE
  • 數(shù)據(jù)定義語(yǔ)言DDL
    數(shù)據(jù)定義語(yǔ)言DDL用來(lái)創(chuàng)建數(shù)據(jù)庫(kù)中的各種對(duì)象-----表、視圖、索引、同義詞、聚簇等如:
    CREATE TABLE/VIEW/INDEX/SYN/CLUSTER
    表 視圖 索引 同義詞 簇
    DDL操作是隱性提交的!不能rollback
  • 數(shù)據(jù)控制語(yǔ)言DCL
    數(shù)據(jù)控制語(yǔ)言DCL用來(lái)授予或回收訪問數(shù)據(jù)庫(kù)的某種特權(quán),并控制數(shù)據(jù)庫(kù)操縱事務(wù)發(fā)生的時(shí)間及效果,對(duì)數(shù)據(jù)庫(kù)實(shí)行監(jiān)視等。如:
  • GRANT:授權(quán)。
  • ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一點(diǎn)。回滾—ROLLBACK;回滾命令使數(shù)據(jù)庫(kù)狀態(tài)回到上次最后提交的狀態(tài)。其格式為:
    SQL>ROLLBACK;
  • COMMIT [WORK]:提交。
    在數(shù)據(jù)庫(kù)的插入、刪除和修改操作時(shí),只有當(dāng)事務(wù)在提交到數(shù)據(jù)庫(kù)時(shí)才算完成。在事務(wù)提交前,只有操作數(shù)據(jù)庫(kù)的這個(gè)人才能有權(quán)看到所做的事情,別人只有在最后提交完成后才可以看到。
    提交數(shù)據(jù)有三種類型:顯式提交、隱式提交及自動(dòng)提交。下面分別說(shuō)明這三種類型。
    (1) 顯式提交
    用COMMIT命令直接完成的提交為顯式提交。其格式為:
    SQL>COMMIT;
    (2) 隱式提交
    用SQL命令間接完成的提交為隱式提交。這些命令是:
    ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,
    EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。
    (3) 自動(dòng)提交
    若把AUTOCOMMIT設(shè)置為ON,則在插入、修改、刪除語(yǔ)句執(zhí)行后,
    系統(tǒng)將自動(dòng)進(jìn)行提交,這就是自動(dòng)提交。其格式為:
    SQL>SET AUTOCOMMIT ON;
  • 16.like %和-的區(qū)別
    通配符的分類:
    %百分號(hào)通配符: 表示任何字符出現(xiàn)任意次數(shù)(可以是0次).
    下劃線通配符: 表示只能匹配單個(gè)字符,不能多也不能少,就是一個(gè)字符.
    like操作符: LIKE作用是指示mysql后面的搜索模式是利用通配符而不是直接相等匹配進(jìn)行比較.
    注意 : 如果在使用like操作符時(shí),后面的沒有使用通用匹配符效果是和=一致的,SELECT * FROM products WHERE products.prod_name like ‘1000’;
    只能匹配的結(jié)果為1000,而不能匹配像JetPack 1000這樣的結(jié)果.
    %通配符使用: 匹配以"yves"開頭的記錄:(包括記錄"yves") SELECT FROM products WHERE products.prod_name like ‘yves%’;
    匹配包含"yves"的記錄(包括記錄"yves") SELECT FROM products WHERE products.prod_name like ‘%yves%’;
    匹配以"yves"結(jié)尾的記錄(包括記錄"yves",不包括記錄"yves ",也就是yves后面有空格的記錄,這里需要注意) SELECT * FROM products WHERE products.prod_name like ‘%yves’;
    通配符使用: SELECT FROM products WHERE products.prod_name like 'yves’; 匹配結(jié)果為: 像"yyves"這樣記錄.
    SELECT FROM products WHERE products.prodname like 'yves’; 匹配結(jié)果為: 像"yvesHe"這樣的記錄.(一個(gè)下劃線只能匹配一個(gè)字符,不能多也不能少)
    注意事項(xiàng):
    注意大小寫,在使用模糊匹配時(shí),也就是匹配文本時(shí),mysql是可能區(qū)分大小的,也可能是不區(qū)分大小寫的,這個(gè)結(jié)果是取決于用戶對(duì)MySQL的配置方式.如果是區(qū)分大小寫,那么像YvesHe這樣記錄是不能被"yves"這樣的匹配條件匹配的.
    注意尾部空格,"%yves"是不能匹配"heyves "這樣的記錄的.
    注意NULL,%通配符可以匹配任意字符,但是不能匹配NULL,也就是說(shuō)SELECT * FROM products WHERE products.prod_name like '%;是匹配不到products.prod_name為NULL的的記錄.
    技巧與建議:
    正如所見, MySQL的通配符很有用。但這種功能是有代價(jià)的:通配符搜索的處理一般要比前面討論的其他搜索所花時(shí)間更長(zhǎng)。這里給出一些使用通配符要記住的技巧。
    不要過度使用通配符。如果其他操作符能達(dá)到相同的目的,應(yīng)該 使用其他操作符。
    在確實(shí)需要使用通配符時(shí),除非絕對(duì)有必要,否則不要把它們用 在搜索模式的開始處。把通配符置于搜索模式的開始處,搜索起 來(lái)是最慢的。
    仔細(xì)注意通配符的位置。如果放錯(cuò)地方,可能不會(huì)返回想要的數(shù).

    17.count(*)、count(1)、count(column)的區(qū)別
    count()對(duì)行的數(shù)目進(jìn)行計(jì)算,包含NULL
    count(column)對(duì)特定的列的值具有的行數(shù)進(jìn)行計(jì)算,不包含NULL值。
    count()還有一種使用方式,count(1)這個(gè)用法和count()的結(jié)果是一樣的。
    性能問題:
    1.任何情況下SELECT COUNT() FROM tablename是最優(yōu)選擇;
    2.盡量減少SELECT COUNT() FROM tablename WHERE COL = ‘value’ 這種查詢;
    3.杜絕SELECT COUNT(COL) FROM tablename WHERE COL2 = ‘value’ 的出現(xiàn)。
    如果表沒有主鍵,那么count(1)比count()快。
    如果有主鍵,那么count(主鍵,聯(lián)合主鍵)比count()快。
    如果表只有一個(gè)字段,count()最快。
    count(1)跟count(主鍵)一樣,只掃描主鍵。count()跟count(非主鍵)一樣,掃描整個(gè)表。明顯前者更快一些。

    18.最左前綴原則
    多列索引:
    ALTER TABLE people ADD INDEX lname_fname_age (lame,fname,age);
    為了提高搜索效率,我們需要考慮運(yùn)用多列索引,由于索引文件以B-Tree格式保存,所以我們不用掃描任何記錄,即可得到最終結(jié)果。
    注:在mysql中執(zhí)行查詢時(shí),只能使用一個(gè)索引,如果我們?cè)趌name,fname,age上分別建索引,執(zhí)行查詢時(shí),只能使用一個(gè)索引,mysql會(huì)選擇一個(gè)最嚴(yán)格(獲得結(jié)果集記錄數(shù)最少)的索引。
    最左前綴原則:顧名思義,就是最左優(yōu)先,上例中我們創(chuàng)建了lname_fname_age多列索引,相當(dāng)于創(chuàng)建了(lname)單列索引,(lname,fname)組合索引以及(lname,fname,age)組合索引。

    總結(jié)

    以上是生活随笔為你收集整理的数据库常见笔试面试题及答案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。