1映胁、數(shù)據(jù)庫三大范式你能說一下嗎木羹?
第一范式:1NF是對屬性的原子性約束,要求字段具有原子性解孙,不可再分解汇跨;比如有一張學生表(學號,學生姓名妆距,聯(lián)系方式)穷遂,表主鍵為學號,因為學生的聯(lián)系方式又可以拆分為手機號和家庭座機娱据,這時候為了滿足1NF蚪黑,需要將聯(lián)系方式字段拆分為手機號和家庭座機兩個字段。
第二范式:2NF是在滿足第一范式的前提下中剩,非主鍵字段不能出現(xiàn)部分依賴主鍵忌穿;比如有一張學生表(學號,學生姓名结啼,年齡)掠剑,表主鍵為(學號,學生姓名)郊愧,此時表設(shè)計是不滿足2NF的朴译,因為年齡部分依賴于主鍵,主鍵可以決定年齡属铁,但是復(fù)合主鍵內(nèi)的學號也可以決定年齡眠寿,為了滿足2NF,需要將復(fù)合主鍵拆分為以學號為主鍵的表設(shè)計焦蘑。
第三范式:3NF是在滿足第二范式的前提下盯拱,非主鍵字段不能出現(xiàn)傳遞依賴,比如有一張學生表(學號,姓名狡逢, 年齡宁舰, 學院編號, 學院地點)奢浑,表主鍵為學號蛮艰,此時表設(shè)計是滿足2NF的,(學號) → (姓名, 年齡, 所在學院, 學院地點)殷费,但是是不滿足3NF的印荔,因為存在著(學號) → (學院編號) → (學院地點)的傳遞依賴關(guān)系低葫,學院地點不是直接依賴于學號详羡,而是通過學院編號依賴于學號,為了滿足3NF嘿悬,應(yīng)該將表拆分实柠,學號,姓名善涨, 年齡窒盐, 學院編號),(學院編號钢拧, 學院地點)蟹漓。
2、sql語句分類:
DDL:數(shù)據(jù)定義語言(create drop)
DML:數(shù)據(jù)操作語句(insert update delete)
DQL:數(shù)據(jù)查詢語句(select )
DCL:數(shù)據(jù)控制語句源内,進行授權(quán)和權(quán)限回收(grant revoke)
TPL:數(shù)據(jù)事務(wù)語句(commit collback savapoint)
3葡粒、SQL 的 select 語句完整的執(zhí)行順序
1、from 子句組裝來自不同數(shù)據(jù)源的數(shù)據(jù)膜钓;
2嗽交、where 子句基于指定的條件對記錄行進行篩選;
3颂斜、group by 子句將數(shù)據(jù)劃分為多個分組夫壁;
4、使用聚集函數(shù)進行計算沃疮;
5盒让、使用 having 子句篩選分組;
6司蔬、計算所有的表達式糯彬;
7、select 的字段葱她;
8撩扒、使用 order by 對結(jié)果集進行排序。
4、delete搓谆、drop炒辉、truncate區(qū)別
truncate 和 delete只刪除數(shù)據(jù),不刪除表結(jié)構(gòu) ,drop刪除表結(jié)構(gòu)泉手,并且釋放所占的空間黔寇。
刪除數(shù)據(jù)的速度,drop> truncate > delete
delete屬于DML語言斩萌,需要事務(wù)管理缝裤,commit之后才能生效。drop和truncate屬于DDL語言颊郎,操作立刻生效憋飞,不可回滾。
使用場合:
當你不再需要該表時姆吭, 用 drop;
當你仍要保留該表榛做,但要刪除所有記錄時, 用 truncate;
當你要刪除部分記錄時(always with a where clause), 用 delete.
注意: 對于有主外鍵關(guān)系的表内狸,不能使用truncate而應(yīng)該使用不帶where子句的delete語句检眯,由于truncate不記錄在日志中,不能夠激活觸發(fā)器昆淡。
5锰瘸、char和varchar的區(qū)別?
char 是一種固定長度的字符串類型昂灵,(如果數(shù)據(jù)類型不足固定長度的話避凝,會自動用0補齊)
varchar 是一種可變長度的字符串類型,(如果數(shù)據(jù)類型不足長度的話倔既,自動將長度縮放成我們所輸入的數(shù)據(jù)類型的長度)
6恕曲、事務(wù)是什么?事務(wù)的四大特性是什么渤涌?
??事務(wù)是一組原子性的 SQL 語句佩谣,或者說一個獨立的工作單元。如果數(shù)據(jù)庫引擎能夠成功地對數(shù)據(jù)庫應(yīng)用該組操作的全部語句实蓬,那么就執(zhí)行該組查詢茸俭。如果其中任何一條語句因為崩潰或其他原因無法執(zhí)行,那么所有的語句都不會執(zhí)行安皱。也就是說调鬓,事務(wù)內(nèi)的語句,要么全部執(zhí)行成功酌伊,要么全部執(zhí)行失敗腾窝。
原子性:不可分割的操作單元,事務(wù)中所有操作,要么全部成功虹脯;要么撤回到執(zhí)行事務(wù)之前的狀態(tài)驴娃;
一致性:如果在執(zhí)行事務(wù)之前數(shù)據(jù)庫是一致的,那么在執(zhí)行事務(wù)之后數(shù)據(jù)庫也還是一致的循集;
隔離性:事務(wù)操作之間彼此獨立和透明互不影響唇敞。事務(wù)獨立運行。這通常使用鎖來實現(xiàn)咒彤。一個事務(wù)處理后的結(jié)果疆柔,影響了其他事務(wù),那么其他事務(wù)會撤回镶柱。事務(wù)的100%隔離旷档,需要犧牲速度。
持久性:事務(wù)一旦提交奸例,其結(jié)果就是永久的彬犯。即便發(fā)生系統(tǒng)故障向楼,也能恢復(fù)查吊。
7、事務(wù)的隔離級別湖蜕,mysql默認的隔離級別是什么逻卖?
讀未提交(Read uncommitted),一個事務(wù)可以讀取另一個未提交事務(wù)的數(shù)據(jù)昭抒,最低級別评也,任何情況都無法保證。
讀已提交(Read committed)灭返,一個事務(wù)要等另一個事務(wù)提交后才能讀取數(shù)據(jù)盗迟,可避免臟讀的發(fā)生。
可重復(fù)讀(Repeatable read)熙含,就是在開始讀取數(shù)據(jù)(事務(wù)開啟)時罚缕,不再允許修改操作,可避免臟讀怎静、不可重復(fù)讀的發(fā)生邮弹。
串行(Serializable),是最高的事務(wù)隔離級別蚓聘,在該級別下腌乡,事務(wù)串行化順序執(zhí)行,可以避免臟讀夜牡、不可重復(fù)讀與幻讀与纽。但是這種事務(wù)隔離級別效率低下,比較耗數(shù)據(jù)庫性能,一般不使用急迂。
MySQL的默認隔離級別是Repeatable read硝岗。
8、索引是什么袋毙?它是如何加快查詢性能的型檀?
索引是對數(shù)據(jù)庫表中一列或多列的值進行排序的一種數(shù)據(jù)結(jié)構(gòu),也就是說索引是一種數(shù)據(jù)結(jié)構(gòu)听盖。數(shù)據(jù)庫在執(zhí)行一條Sql語句的時候胀溺,默認的方式是根據(jù)搜索條件進行全表掃描,遇到匹配條件的就加入搜索結(jié)果集合皆看。如果我們對某一字段增加索引仓坞,查詢時就會先去索引列表中通過二分法等高效率算法一次定位到特定值的行數(shù),大大減少遍歷匹配的行數(shù)腰吟,所以能明顯增加查詢性能无埃。類似新華字典的目錄,如果沒有目錄的話毛雇,我們想要查找一個漢字的話嫉称,就必須檢索整本字典,而正因為有了目錄灵疮,我們只要知道我們所要查找的偏旁或者拼音首字母织阅,就可以快速地定位到我們想要查找漢字的所在頁碼。
9震捣、MySQL主要的索引類型
普通索引:是最基本的索引荔棉,它沒有任何限制;
唯一索引:索引列的值必須唯一蒿赢,但允許有空值润樱。如果是組合索引,則列值的組合必須唯一羡棵;
主鍵索引:是一種特殊的唯一索引壹若,一個表只能有一個主鍵,不允許有空值晾腔;
組合索引:指多個字段上創(chuàng)建的索引舌稀,只有在查詢條件中使用了創(chuàng)建索引時的第一個字段,索引才會被使用灼擂。使用組合索引時遵循最左前綴集合壁查;
全文索引:主要用來查找文本中的關(guān)鍵字,而不是直接與索引中的值相比較剔应,MySQL中MyISAM支持全文索引而InnoDB不支持睡腿;
10语御、說一說什么是外鍵?它的優(yōu)缺點是什么席怪?
??外鍵指的是外鍵約束应闯,目的是保持數(shù)據(jù)一致性,完整性挂捻,控制存儲在外鍵表中的數(shù)據(jù),使兩張表形成關(guān)聯(lián)碉纺,外鍵只能引用外表中列的值;
優(yōu)點:由數(shù)據(jù)庫自身保證數(shù)據(jù)一致性刻撒,完整性骨田,更可靠,因為程序很難100%保證數(shù)據(jù)的完整性声怔,而用外鍵即使在數(shù)據(jù)庫服務(wù)器當機或者出現(xiàn)其他問題的時候态贤,也能夠最大限度的保證數(shù)據(jù)的一致性和完整性。有主外鍵的數(shù)據(jù)庫設(shè)計可以增加ER圖的可讀性醋火,這點在數(shù)據(jù)庫設(shè)計時非常重要悠汽。外鍵在一定程度上說明的業(yè)務(wù)邏輯,會使設(shè)計周到具體全面芥驳。
缺點:可以用觸發(fā)器或應(yīng)用程序保證數(shù)據(jù)的完整性柿冲;過分強調(diào)或者說使用外鍵會平添開發(fā)難度,導(dǎo)致表過多晚树,更改業(yè)務(wù)困難姻采,擴展困難等問題雅采;不用外鍵時數(shù)據(jù)管理簡單爵憎,操作方便,性能高(導(dǎo)入導(dǎo)出等操作婚瓜,在insert, update, delete 數(shù)據(jù)的時候更快)宝鼓;
11、在什么時候你會選擇使用外鍵巴刻,為什么愚铡?
??在我的業(yè)務(wù)邏輯非常簡單,業(yè)務(wù)一旦確定不會輕易更改胡陪,表結(jié)構(gòu)簡單沥寥,業(yè)務(wù)量小的時候我會選擇使用外鍵。因為當不符合以上條件的時候柠座,外鍵會影響業(yè)務(wù)的擴展和修改邑雅,當數(shù)據(jù)量龐大時,會嚴重影響增刪改查的效率妈经。
12淮野、說一說你能想到的sql語句優(yōu)化捧书,至少五種
1)避免select *,將需要查找的字段列出來骤星;
2)使用連接(join)來代替子查詢经瓷;
3)拆分大的delete或insert語句;
4)使用limit對查詢結(jié)果的記錄進行限定洞难;
5)用 exists 代替 in 是一個好的選擇舆吮;
6)用Where子句替換HAVING 子句 因為HAVING 只會在檢索出所有記錄之后才對結(jié)果集進行過濾;
7)不要在 where 子句中的“=”左邊進行函數(shù)队贱、算術(shù)運算或其他表達式運算歪泳,否則系統(tǒng)將可能無法正確使用索引盡量避免在where 子句中對字段進行 null 值判斷,否則將導(dǎo)致引擎放棄使用索引而進行全表掃描露筒;
8)盡量避免在 where 子句中使用 or 來連接條件呐伞,否則將導(dǎo)致引擎放棄使用索引而進行全表掃描;
9)盡量避免在 where 子句中使用!=或<>操作符慎式,否則將引擎放棄使用索引而進行全表掃描伶氢;
13、MyISAM與InnoDB的區(qū)別瘪吏?
1)InnoDB 支持事務(wù)癣防;MyISAM 不支持事務(wù);
2)InnoDB 支持行級鎖掌眠;MyISAM 支持表級鎖蕾盯;
3)InnoDB 支持 MVCC(多版本并發(fā)控制);MyISAM 不支持蓝丙;
4)InnoDB 支持外鍵级遭,MyISAM 不支持;
5)InnoDB 不支持全文索引渺尘;MyISAM 支持挫鸽;
6)InnoDB 不保存表的總行數(shù),執(zhí)行 select count(*) from table 時需要全表掃描鸥跟;MyISAM 用一個變量保存表的總行數(shù)丢郊,查總行數(shù)速度很快;
7)InnoDB 是聚集索引医咨,數(shù)據(jù)文件是和索引綁在一起的枫匾,必須要有主鍵,通過主鍵索引效率很高拟淮。輔助索引需要兩次查詢干茉,先查詢到主鍵,再通過主鍵查詢到數(shù)據(jù)惩歉。主鍵太大等脂,其他索引也會很大俏蛮;MyISAM 是非聚集索引,數(shù)據(jù)文件是分離的上遥,索引保存的是數(shù)據(jù)文件的指針搏屑,主鍵索引和輔助索引是獨立的。
后續(xù)補充