數(shù)據(jù)庫(kù)_基本概念

一、基本概念

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

超鍵:在關(guān)系中能唯一標(biāo)識(shí)元組的屬性集稱(chēng)為關(guān)系模式的超鍵。一個(gè)屬性可以為作為一個(gè)超鍵,多個(gè)屬性組合在一起也可以作為一個(gè)超鍵。超鍵包含候選鍵和主鍵。

候選鍵:是最小超鍵,即沒(méi)有冗余元素的超鍵。

主鍵:數(shù)據(jù)庫(kù)表中對(duì)儲(chǔ)存數(shù)據(jù)對(duì)象予以唯一和完整標(biāo)識(shí)的數(shù)據(jù)列或?qū)傩缘慕M合。一個(gè)數(shù)據(jù)列只能有一個(gè)主鍵,且主鍵的取值不能缺失,即不能為空值(Null)。

外鍵:在一個(gè)表中存在的另一個(gè)表的主鍵稱(chēng)此表的外鍵。

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

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

如果沒(méi)有顯式定義主鍵,則InnoDB會(huì)選擇第一個(gè)不包含有NULL值的唯一索引作為主鍵索引、

如果也沒(méi)有這樣的唯一索引,則InnoDB會(huì)選擇內(nèi)置6字節(jié)長(zhǎng)的ROWID作為隱含的聚集索引(ROWID隨著行記錄的寫(xiě)入而主鍵遞增,這個(gè)ROWID不像ORACLE的ROWID那樣可引用,是隱含的)。

數(shù)據(jù)記錄本身被存于主索引(一顆B+Tree)的葉子節(jié)點(diǎn)上。這就要求同一個(gè)葉子節(jié)點(diǎn)內(nèi)(大小為一個(gè)內(nèi)存頁(yè)或磁盤(pán)頁(yè))的各條數(shù)據(jù)記錄按主鍵順序存放,因此每當(dāng)有一條新的記錄插入時(shí),MySQL會(huì)根據(jù)其主鍵將其插入適當(dāng)?shù)墓?jié)點(diǎn)和位置,如果頁(yè)面達(dá)到裝載因子(InnoDB默認(rèn)為15/16),則開(kāi)辟一個(gè)新的頁(yè)(節(jié)點(diǎn))

如果表使用自增主鍵,那么每次插入新的記錄,記錄就會(huì)順序添加到當(dāng)前索引節(jié)點(diǎn)的后續(xù)位置,當(dāng)一頁(yè)寫(xiě)滿(mǎn),就會(huì)自動(dòng)開(kāi)辟一個(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)被回寫(xiě)到磁盤(pán)上而從緩存中清掉,此時(shí)又要從磁盤(pán)上讀回來(lái),這增加了很多開(kāi)銷(xiāo),同時(shí)頻繁的移動(dòng)、分頁(yè)操作造成了大量的碎片,得到了不夠緊湊的索引結(jié)構(gòu),后續(xù)不得不通過(guò)OPTIMIZE TABLE來(lái)重建表并優(yōu)化填充頁(yè)面。

3.觸發(fā)器的作用?

觸發(fā)器是一種特殊的存儲(chǔ)過(guò)程,主要是通過(guò)事件來(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ǔ)過(guò)程?用什么來(lái)調(diào)用?

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

調(diào)用:

1)可以用一個(gè)命令對(duì)象來(lái)調(diào)用存儲(chǔ)過(guò)程。

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

5.存儲(chǔ)過(guò)程的優(yōu)缺點(diǎn)?

優(yōu)點(diǎn):

1)存儲(chǔ)過(guò)程是預(yù)編譯過(guò)的,執(zhí)行效率高。

2)存儲(chǔ)過(guò)程的代碼直接存放于數(shù)據(jù)庫(kù)中,通過(guò)存儲(chǔ)過(guò)程名直接調(diào)用,減少網(wǎng)絡(luò)通訊。

3)安全性高,執(zhí)行存儲(chǔ)過(guò)程需要有一定權(quán)限的用戶(hù)。

4)存儲(chǔ)過(guò)程可以重復(fù)使用,可減少數(shù)據(jù)庫(kù)開(kāi)發(fā)人員的工作量。

缺點(diǎn):移植性差

6.存儲(chǔ)過(guò)程與函數(shù)的區(qū)別

[圖片上傳失敗...(image-c82d40-1575081345860)]

7.什么叫視圖?游標(biāo)是什么?

視圖:

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

游標(biāo):

是對(duì)查詢(xún)出來(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ù)的訪(fǎng)問(wèn),因?yàn)橐晥D可以有選擇性的選取數(shù)據(jù)庫(kù)里的一部分。

2)用戶(hù)通過(guò)簡(jiǎn)單的查詢(xún)可以從復(fù)雜查詢(xún)中得到結(jié)果。

3)維護(hù)數(shù)據(jù)的獨(dú)立性,試圖可從多個(gè)表檢索數(shù)據(jù)。

4)對(duì)于相同的數(shù)據(jù)可產(chǎn)生不同的視圖。

缺點(diǎn):

性能:查詢(xún)視圖時(shí),必須把視圖的查詢(xún)轉(zhuǎn)化成對(duì)基本表的查詢(xún),如果這個(gè)視圖是由一個(gè)復(fù)雜的多表查詢(xún)所定義,那么,那么就無(wú)法更改數(shù)據(jù)

9.drop、truncate、 delete區(qū)別

最基本:

  • drop直接刪掉表。
  • truncate刪除表中數(shù)據(jù),再插入時(shí)自增長(zhǎng)id又從1開(kāi)始。
  • delete刪除表中數(shù)據(jù),可以加where字句。

(1) DELETE語(yǔ)句執(zhí)行刪除的過(guò)程是每次從表中刪除一行,并且同時(shí)將該行的刪除操作作為事務(wù)記錄在日志中保存以便進(jìn)行進(jìn)行回滾操作。TRUNCATE TABLE 則一次性地從表中刪除所有的數(shù)據(jù)并不把單獨(dú)的刪除操作記錄記入日志保存,刪除行是不能恢復(fù)的。并且在刪除的過(guò)程中不會(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)被依賴(lài)的約束(constrain),觸發(fā)器(trigger)索引(index);依賴(lài)于該表的存儲(chǔ)過(guò)程/函數(shù)將被保留,但其狀態(tài)會(huì)變?yōu)椋篿nvalid。

(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) 在沒(méi)有備份情況下,謹(jǐn)慎使用 drop 與 truncate。要?jiǎng)h除部分?jǐn)?shù)據(jù)行采用delete且注意結(jié)合where來(lái)約束影響范圍?;貪L段要足夠大。要?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 通過(guò)釋放存儲(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)前連接可見(jiàn),當(dāng)關(guān)閉連接時(shí),MySQL會(huì)自動(dòng)刪除表并釋放所有空間。因此在不同的連接中可以創(chuàng)建同名的臨時(shí)表,并且操作屬于本連接的臨時(shí)表。
創(chuàng)建臨時(shí)表的語(yǔ)法與創(chuàng)建表語(yǔ)法類(lèi)似,不同之處是增加關(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)過(guò)SQL層的解析,所以性能非常高。
  • 可擴(kuò)展性:同樣也是因?yàn)榛阪I值對(duì),數(shù)據(jù)之間沒(méi)有耦合性,所以非常容易水平擴(kuò)展。

關(guān)系型數(shù)據(jù)庫(kù)的優(yōu)勢(shì):

  • 復(fù)雜查詢(xún):可以用SQL語(yǔ)句方便的在一個(gè)表以及多個(gè)表之間做非常復(fù)雜的數(shù)據(jù)查詢(xún)。
  • 事務(wù)支持:使得對(duì)于安全性能很高的數(shù)據(jù)訪(fǎng)問(wèn)要求得以實(shí)現(xiàn)。

其他:

1.對(duì)于這兩類(lèi)數(shù)據(jù)庫(kù),對(duì)方的優(yōu)勢(shì)就是自己的弱勢(shì),反之亦然。

2.NOSQL數(shù)據(jù)庫(kù)慢慢開(kāi)始具備SQL數(shù)據(jù)庫(kù)的一些復(fù)雜查詢(xún)功能,比如MongoDB。

3.對(duì)于事務(wù)的支持也可以用一些系統(tǒng)級(jí)的原子操作來(lái)實(shí)現(xiàn)例如樂(lè)觀鎖之類(lèi)的方法來(lái)曲線(xiàn)救國(guó),比如Redis set nx。

12.數(shù)據(jù)庫(kù)范式,根據(jù)某個(gè)場(chǎng)景設(shè)計(jì)數(shù)據(jù)表?

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

第一范式是最基本的范式。如果數(shù)據(jù)庫(kù)表中的所有字段值都是不可分解的原子值,就說(shuō)明該數(shù)據(jù)庫(kù)表滿(mǎn)足了第一范式。
第一范式的合理遵循需要根據(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ì)訪(fǎng)問(wèn)“地址”屬性中的“城市”部分,那么就非要將“地址”這個(gè)屬性重新拆分為省份、城市、詳細(xì)地址等多個(gè)部分進(jìn)行存儲(chǔ),這樣在對(duì)地址中某一部分操作的時(shí)候?qū)⒎浅7奖恪_@樣設(shè)計(jì)才算滿(mǎn)足了數(shù)據(jù)庫(kù)的第一范式,如下表所示。
上表所示的用戶(hù)信息遵循了第一范式的要求,這樣在對(duì)用戶(hù)使用城市進(jìn)行分類(lèi)的時(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ù)編號(hào)作為一個(gè)外鍵和訂單表建立相應(yīng)的關(guān)系。而不可以在訂單表中添加關(guān)于客戶(hù)其它信息(比如姓名、所屬公司等)的字段。

BCNF:符合3NF,并且,主屬性不依賴(lài)于主屬性。

若關(guān)系模式屬于第二范式,且每個(gè)屬性都不傳遞依賴(lài)于鍵碼,則R屬于BC范式。
通常BC范式的條件有多種等價(jià)的表述:每個(gè)非平凡依賴(lài)的左邊必須包含鍵碼;每個(gè)決定因素必須包含鍵碼。
BC范式既檢查非主屬性,又檢查主屬性。當(dāng)只檢查非主屬性時(shí),就成了第三范式。滿(mǎn)足BC范式的關(guān)系都必然滿(mǎ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

注意:

很多公司都只是考察是否知道其概念,但是也有很多公司需要不僅僅知道概念,還需要?jiǎng)邮謱?xiě)sql,一般都是簡(jiǎn)單的連接查詢(xún),具體關(guān)于連接查詢(xún)的sql練習(xí),參見(jiàn)以下鏈接:

??途W(wǎng)數(shù)據(jù)庫(kù)SQL實(shí)戰(zhàn)

leetcode中文網(wǎng)站數(shù)據(jù)庫(kù)練習(xí)

我的另一篇文章,常用sql練習(xí)50題

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類(lèi)型的要用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ǔ)言分類(lèi)

SQL語(yǔ)言共分為四大類(lèi):

  • 數(shù)據(jù)查詢(xún)語(yǔ)言DQL
  • 數(shù)據(jù)操縱語(yǔ)言DML
  • 數(shù)據(jù)定義語(yǔ)言DDL
  • 數(shù)據(jù)控制語(yǔ)言DCL。

1. 數(shù)據(jù)查詢(xún)語(yǔ)言DQL

數(shù)據(jù)查詢(xún)語(yǔ)言DQL基本結(jié)構(gòu)是由SELECT子句,F(xiàn)ROM子句,WHERE子句組成的查詢(xún)塊:

SELECT
FROM
WHERE

2 .數(shù)據(jù)操縱語(yǔ)言DML

數(shù)據(jù)操縱語(yǔ)言DML主要有三種形式:

  1. 插入:INSERT

  2. 更新:UPDATE

  3. 刪除:DELETE

3. 數(shù)據(jù)定義語(yǔ)言DDL

數(shù)據(jù)定義語(yǔ)言DDL用來(lái)創(chuàng)建數(shù)據(jù)庫(kù)中的各種對(duì)象-----表、視圖、索引、同義詞、聚簇等如:
CREATE TABLE/VIEW/INDEX/SYN/CLUSTER

表 視圖 索引 同義詞 簇

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

4. 數(shù)據(jù)控制語(yǔ)言DCL

數(shù)據(jù)控制語(yǔ)言DCL用來(lái)授予或回收訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的某種特權(quán),并控制數(shù)據(jù)庫(kù)操縱事務(wù)發(fā)生的時(shí)間及效果,對(duì)數(shù)據(jù)庫(kù)實(shí)行監(jiān)視等。如:

  1. GRANT:授權(quán)。

  2. ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一點(diǎn)?;貪L---ROLLBACK;回滾命令使數(shù)據(jù)庫(kù)狀態(tài)回到上次最后提交的狀態(tài)。其格式為:
    SQL>ROLLBACK;

  3. COMMIT [WORK]:提交。

在數(shù)據(jù)庫(kù)的插入、刪除和修改操作時(shí),只有當(dāng)事務(wù)在提交到數(shù)據(jù)
庫(kù)時(shí)才算完成。在事務(wù)提交前,只有操作數(shù)據(jù)庫(kù)的這個(gè)人才能有權(quán)看
到所做的事情,別人只有在最后提交完成后才可以看到。
提交數(shù)據(jù)有三種類(lèi)型:顯式提交、隱式提交及自動(dòng)提交。下面分
別說(shuō)明這三種類(lèi)型。

(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;

參考文章:
https://www.cnblogs.com/study-s/p/5287529.html

16.like %和-的區(qū)別

通配符的分類(lèi):

%百分號(hào)通配符:表示任何字符出現(xiàn)任意次數(shù)(可以是0次).

_下劃線(xiàn)通配符:表示只能匹配單個(gè)字符,不能多也不能少,就是一個(gè)字符.

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

注意: 如果在使用like操作符時(shí),后面的沒(méi)有使用通用匹配符效果是和=一致的,SELECT * FROM products WHERE products.prod_name like '1000';
只能匹配的結(jié)果為1000,而不能匹配像JetPack 1000這樣的結(jié)果.

  • %通配符使用: 匹配以"yves"開(kāi)頭的記錄:(包括記錄"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è)下劃線(xiàn)只能匹配一個(gè)字符,不能多也不能少)

注意事項(xiàng):

  • 注意大小寫(xiě),在使用模糊匹配時(shí),也就是匹配文本時(shí),mysql是可能區(qū)分大小的,也可能是不區(qū)分大小寫(xiě)的,這個(gè)結(jié)果是取決于用戶(hù)對(duì)MySQL的配置方式.如果是區(qū)分大小寫(xiě),那么像YvesHe這樣記錄是不能被"yves__"這樣的匹配條件匹配的.
  • 注意尾部空格,"%yves"是不能匹配"heyves "這樣的記錄的.
  • 注意NULL,%通配符可以匹配任意字符,但是不能匹配N(xiāo)ULL,也就是說(shuō)SELECT * FROM products WHERE products.prod_name like '%;是匹配不到products.prod_name為NULL的的記錄.

技巧與建議:

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

  • 不要過(guò)度使用通配符。如果其他操作符能達(dá)到相同的目的,應(yīng)該 使用其他操作符。
  • 在確實(shí)需要使用通配符時(shí),除非絕對(duì)有必要,否則不要把它們用 在搜索模式的開(kāi)始處。把通配符置于搜索模式的開(kāi)始處,搜索起 來(lái)是最慢的。
  • 仔細(xì)注意通配符的位置。如果放錯(cuò)地方,可能不會(huì)返回想要的數(shù).

參考博文:https://blog.csdn.net/u011479200/article/details/78513632

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é)果是一樣的。

性能問(wèn)題:

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

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

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

  • 如果表沒(méi)有主鍵,那么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í)行查詢(xún)時(shí),只能使用一個(gè)索引,如果我們?cè)趌name,fname,age上分別建索引,執(zhí)行查詢(xún)時(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)組合索引。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容