MySQL基礎(chǔ):
- 數(shù)據(jù)庫的創(chuàng)建與刪除
CREATE DATABASE <數(shù)據(jù)庫名>;//創(chuàng)建數(shù)據(jù)庫
DROP DATABASE <數(shù)據(jù)庫名>;//刪除數(shù)據(jù)庫
- 數(shù)據(jù)庫表的創(chuàng)建與刪除
CREATE TABLE <數(shù)據(jù)表名>(column_name column_type);//創(chuàng)建表
DROP TABLE <數(shù)據(jù)表名>;//刪除表
- 增刪改查
- 查詢語句
SELECT [DISTINCT|ALL]<目標(biāo)列組>
FROM <基本表名>
[WHERE <行條件表達(dá)式>]
[GROUP BY <分組列名> [HAVING<組條件表達(dá)式>]]
[ORDER BY <排序列名> [ASC|DESC]]
//例:查詢學(xué)生成績表SC里平均成績低于80分的學(xué)生學(xué)號(hào)Snum和平均成績,并按平均成績降序排列
SELECT Snum AS 學(xué)號(hào),AVG(Score) AS 平均成績
FROM SC
GROUP BY Snum
HAVING AVG(Score)<80 DESC;
- 插入數(shù)據(jù)
INSERT INTO <表名>[(A1,A2,A3...)]
VALUES (v1,v2,v3...);
//例 :向表學(xué)生S中添加一位學(xué)生的數(shù)據(jù)
INSERT INTO S(Snum,Sname,Ssex,Sage,Sphone)
VALUES("0001","張三",18,"男","88888888");
- 更新數(shù)據(jù)
UPDATE <表名>
SET <列名>=<表達(dá)式>
[WHERE <條件>]
//例:將張三的年齡改為20
UPDATE S
SET Sage=20
WHERE Sname="張三";
- 刪除數(shù)據(jù)
DELETE FROM <表名>
[WHERE <條件>]
//例:刪除學(xué)生張三的信息
DELETE FROM S
WHERE Sname="張三";
MySQL基礎(chǔ)面試題
說一下MySQL執(zhí)行一條查詢語句的內(nèi)部執(zhí)行過程?
答:
1)客戶端先通過連接器連接到MySQL服務(wù)器
2)連接器權(quán)限驗(yàn)證通過后囤热,先查詢是否有查詢緩存瞳步,如果有緩存(之前執(zhí)行過此語句)則直接返回緩存數(shù)據(jù)袄秩,如果沒有則進(jìn)入分析器
3)分析器對(duì)查詢語句進(jìn)行語法分析和詞法分析现柠,判斷SQL語法是否正確苹享,如果查詢語法錯(cuò)誤會(huì)直接返回客戶端錯(cuò)誤信息双絮,如果語法正確則進(jìn)入優(yōu)化器
4)優(yōu)化器對(duì)查詢語句進(jìn)行優(yōu)化處理,例如一個(gè)表里有多個(gè)索引得问,優(yōu)化器會(huì)判別哪個(gè)索引性能更好
5)優(yōu)化器執(zhí)行完進(jìn)入執(zhí)行器囤攀,執(zhí)行器對(duì)語句進(jìn)行查詢對(duì)比,查到滿足條件的所有數(shù)據(jù)然后返回MySQL查詢緩存功能有何優(yōu)缺點(diǎn)宫纬?
答:
MySQL查詢緩存功能是在連接器之后發(fā)生的焚挠,它的優(yōu)點(diǎn)是效率高,如果已經(jīng)有緩存則直接返回結(jié)果漓骚。缺點(diǎn)是失效太頻繁導(dǎo)致緩存的命中率較低蝌衔,任何更新表操作都會(huì)清空查詢緩存,一次查詢緩存非常容易失效如何關(guān)閉MySQL的查詢緩存功能蝌蹂?
答:
MySQL查詢緩存功能是默認(rèn)開啟的噩斟,配置querycachetyoe參數(shù)為DEMAND(按需使用)關(guān)閉查詢緩存,MySQL8.0之后沒有查詢緩存功能MySQL可以針對(duì)表級(jí)別設(shè)置數(shù)據(jù)庫引擎嗎孤个?怎么設(shè)置剃允?
答:
可以針對(duì)不同的表設(shè)置不同的引擎。在CREATE TABLE語句中使用ENGINE=引擎名(比如Memory)來設(shè)置表的存儲(chǔ)引擎:
CREATE TABLE student(
id int PRIMARY KEY auto_increment,
username varchar(120),
age int
)ENGINE=Memory
常用的存儲(chǔ)引擎InnoDB和MyISAM有什么區(qū)別齐鲤?
答:
最大的區(qū)別是InnoDB支持事務(wù)斥废,而MyISAM不支持事務(wù)。主要區(qū)別如下:
1)InnoDB支持崩潰后安全恢復(fù)给郊,MyISAM不支持崩潰后安全恢復(fù)
2)InnoDB支持行級(jí)鎖牡肉,MyISAM不支持行級(jí)鎖,只支持到表鎖
3)InnoDB支持外鍵丑罪,MyISAM不支持外鍵
4)MyISAM性能比InnoDB高
5)MyISAM支持FULLTEXT類型的全文索引荚板,InnoDB不支持FULLTEXT類型的全文索引,但是InnoDB可以使用sphinx插件支持全文索引吩屹,并且效果更好
6)InnoDB主鍵查詢性能高于MyISAM什么是事務(wù)跪另?特性?
答:
事務(wù)是一系列的數(shù)據(jù)庫操作煤搜,是數(shù)據(jù)庫的基本單位
事務(wù)的四個(gè)特性:
1)原子性免绿。要么全部執(zhí)行,要么全部不執(zhí)行
2)一致性擦盾。事務(wù)的執(zhí)行使得數(shù)據(jù)庫從一種正確狀態(tài)轉(zhuǎn)化為另一種正確狀態(tài)
3)隔離型嘲驾。事務(wù)正確提交之前淌哟,不允許把該事務(wù)對(duì)數(shù)據(jù)的改變提供給其他事務(wù)
4)持久性。事務(wù)提交后辽故,結(jié)果永遠(yuǎn)保存于數(shù)據(jù)庫中一張自增表中有三條數(shù)據(jù)徒仓,刪除了兩條數(shù)據(jù)之后重啟數(shù)據(jù)庫,再新增一條數(shù)據(jù)誊垢,此時(shí)數(shù)據(jù)的ID是幾掉弛?
答:
如果這張表的引擎是MyISAM,那么ID=4喂走;如果是InnoDB殃饿,那么ID=2MySQL中什么情況會(huì)導(dǎo)致自增主鍵不能連續(xù)?
答:
1)唯一主鍵沖突會(huì)導(dǎo)致自增主鍵不連續(xù)
2)事務(wù)回滾也會(huì)導(dǎo)致自增主鍵不連續(xù)什么事獨(dú)立表空間和共享表空間芋肠?它們的區(qū)別是乎芳?
答:
獨(dú)立表空間:指的是數(shù)據(jù)庫中所有的數(shù)據(jù),索引文件全部放在一個(gè)文件中帖池,默認(rèn)這個(gè)共享表空間的文件路徑在data目錄下
獨(dú)立表空間:每一個(gè)表都會(huì)生成以獨(dú)立的文件方式來存儲(chǔ)
共享表空間和獨(dú)立表空間的最大區(qū)別是如果把表放在共享表空間奈惑,即使表刪除了空間也不會(huì)刪除,所以表依然很大碘裕,而獨(dú)立表空間如果刪除表就會(huì)清楚空間如何設(shè)置獨(dú)立表空間携取?
答:
獨(dú)立表空間是由參數(shù)innodb fileper_table控制的,把它設(shè)置成ON就是獨(dú)立表空間了帮孔。在MySQL5.6.6版本之后雷滋,這個(gè)值默認(rèn)為ON如何進(jìn)行表空間收縮?
答:
使用重建表的方式可以收縮表空間:
1)alter table t engine=InnoDB
2)optmize table t
3)truncate table t重建表的執(zhí)行流程文兢?
答:
1)建立一個(gè)臨時(shí)文件晤斩,掃描表t主鍵的所有數(shù)據(jù)頁
2)用數(shù)據(jù)頁中表t的記錄生成B+樹,存儲(chǔ)到臨時(shí)文件中
3)生成臨時(shí)文件的過程中姆坚,將所有對(duì)t的操作記錄在一個(gè)日志文件(row log)中
4)臨時(shí)文件生成后澳泵,將日志文件中的操作應(yīng)用到臨時(shí)文件,得到一個(gè)邏輯數(shù)據(jù)上與表t相同的數(shù)據(jù)文件
5)用臨時(shí)文件替換表t的數(shù)據(jù)文件表的結(jié)構(gòu)信息存在哪里兼呵?
答:
MySQL8之前兔辅,表結(jié)構(gòu)的定義信息存在以.frm為后綴的文件里;MySQL8之后击喂,允許把表結(jié)構(gòu)的定義信息存在系統(tǒng)數(shù)據(jù)表中什么是覆蓋索引维苔?
答:
覆蓋索引是指,索引上的信息足夠滿足查詢請(qǐng)求懂昂,不需要再回到主鍵上去取數(shù)據(jù)如果把一個(gè)InnoDB表的主鍵刪掉介时,是不是就沒有主鍵,就沒辦法進(jìn)行回表查詢了?
答:
可以回表查詢沸柔,如果把主鍵刪掉了循衰,那么InnoDB會(huì)自己生成一個(gè)長度為6字節(jié)的rowid作為主鍵內(nèi)存表和臨時(shí)表有什么區(qū)別?
答:
內(nèi)存表褐澎,指的是使用Memory引擎的表会钝,。這種表的數(shù)據(jù)都保存在內(nèi)存里工三,系統(tǒng)重啟的時(shí)候會(huì)被清空顽素,但是表結(jié)構(gòu)還在
臨時(shí)表,可以使用各種引擎類型徒蟆。如果是使用InnoDB引擎或者M(jìn)yISAM引擎的臨時(shí)表,寫數(shù)據(jù)的時(shí)候是寫到磁盤上的并發(fā)事務(wù)會(huì)帶來哪些問題型型?
答:
修改丟失段审、臟讀、不可重復(fù)讀闹蒜、幻讀VARCHAR和CHAR的區(qū)別是什么寺枉?
答:
VARCHAR和CHAR最大的區(qū)別是,VARCHAR的長度是可變的绷落,CHAR是固定長度姥闪。所以CHAR適合存儲(chǔ)長度較短的字段和固定長度的字段比如身份證號(hào)、手機(jī)號(hào)等砌烁。反之則適合用VARCHARMySQL 存儲(chǔ)金額應(yīng)該使用哪種數(shù)據(jù)類型筐喳?
答:
應(yīng)該使用decimal,因?yàn)槿绻鎯?chǔ)其他數(shù)據(jù)類型比如float函喉,有導(dǎo)致小數(shù)點(diǎn)后數(shù)據(jù)丟失
的風(fēng)險(xiǎn)刪除表的數(shù)據(jù)有幾張方式避归?區(qū)別是?
答:
有兩種方式:delete和truncate管呵,區(qū)別如下:
1)delete可以添加where條件刪除部分?jǐn)?shù)據(jù)梳毙,truncate不能添加where條件,只能刪除整張表
2)delete的刪除信息會(huì)在MySQL的日志中記錄捐下,而truncate的刪除信息不回被記錄账锹。因此delete的信息可以被找回,而truncate的信息無法被找回
3)truncate因?yàn)椴挥涗浫罩舅詧?zhí)行效率比delete快
delete from t where id=1;
truncate table t;
MySQL支持幾種模糊查詢坷襟?它們的區(qū)別是奸柬?
答:
支持兩種模糊查詢:regexp和like
like是對(duì)任意多字符匹配或任意單字符進(jìn)行模糊匹配,而regexp則支持正則表達(dá)式的匹配方式count(column)和count()有什么區(qū)別啤握?
答:
最大的區(qū)別是統(tǒng)計(jì)結(jié)果可能不一致鸟缕,count(column)統(tǒng)計(jì)不會(huì)統(tǒng)計(jì)列值為null的數(shù)據(jù),而count(*)則會(huì)統(tǒng)計(jì)所有信息