1.
SELECT Customer,SUM(OrderPrice)
FROM Orders
GROUP BY Customer.
2.
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.Id_P = Orders.Id_P
3.explain
Using temporary 看到這個(gè)的時(shí)候儿惫,查詢需要優(yōu)化了。這里多搀,MYSQL需要?jiǎng)?chuàng)建一個(gè)臨時(shí)表來存儲(chǔ)結(jié)果
Using index: 列數(shù)據(jù)是從僅僅使用了索引中的信息而沒有讀取實(shí)際的行動(dòng)的表返回的谬墙,這發(fā)生在對表的全部的請求列都是同一個(gè)索引的部分的時(shí)候
use filesort orderby 那一行建立索引
索引:(索引(Index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu))
1.選擇唯一性索引
唯一性索引的值是唯一的郑兴,可以更快速的通過該索引來確定某條記錄。
例如匈子,學(xué)生表中學(xué)號(hào)是具有唯一性的字段续室。為該字段建立唯一性索引可以很快的確定某個(gè)學(xué)生的信息。
如果使用姓名的話匀泊,可能存在同名現(xiàn)象优训,從而降低查詢速度朵你。
2.為經(jīng)常需要排序各聘、分組和聯(lián)合操作的字段建立索引
經(jīng)常需要ORDER BY、GROUP BY抡医、DISTINCT和UNION等操作的字段躲因,排序操作會(huì)浪費(fèi)很多時(shí)間。
如果為其建立索引忌傻,可以有效地避免排序操作大脉。
3.為常作為查詢條件的字段建立索引
如果某個(gè)字段經(jīng)常用來做查詢條件,那么該字段的查詢速度會(huì)影響整個(gè)表的查詢速度水孩。因此镰矿,
為這樣的字段建立索引,可以提高整個(gè)表的查詢速度俘种。
4.限制索引的數(shù)目
索引的數(shù)目不是越多越好秤标。每個(gè)索引都需要占用磁盤空間,索引越多宙刘,需要的磁盤空間就越大苍姜。
修改表時(shí),對索引的重構(gòu)和更新很麻煩悬包。越多的索引衙猪,會(huì)使更新表變得很浪費(fèi)時(shí)間。
5.盡量使用數(shù)據(jù)量少的索引
如果索引的值很長,那么查詢的速度會(huì)受到影響垫释。例如丝格,對一個(gè)CHAR(100)類型的字段進(jìn)行全文
檢索需要的時(shí)間肯定要比對CHAR(10)類型的字段需要的時(shí)間要多。
6.盡量使用前綴來索引
如果索引字段的值很長棵譬,最好使用值的前綴來索引铁追。例如,TEXT和BLOG類型的字段茫船,進(jìn)行全文檢索
會(huì)很浪費(fèi)時(shí)間琅束。如果只檢索字段的前面的若干個(gè)字符,這樣可以提高檢索速度算谈。
7.刪除不再使用或者很少使用的索引
表中的數(shù)據(jù)被大量更新涩禀,或者數(shù)據(jù)的使用方式被改變后,原有的一些索引可能不再需要然眼。數(shù)據(jù)庫管理
員應(yīng)當(dāng)定期找出這些索引艾船,將它們刪除,從而減少索引對更新操作的影響高每。
8.小表不應(yīng)建立索引屿岂;包含大量的列并且不需要搜索非空值的時(shí)候可以考慮不建索引
having:跟在統(tǒng)計(jì)函數(shù)后面
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value
mysql
1:基礎(chǔ)sql語句書寫(一般讓寫關(guān)聯(lián)和子查詢語句)
關(guān)聯(lián):SELECT?*?FROM?score,?student?WHERE?score.id?=?student.id?...
子查詢:where,having鲸匿,group by爷怀,order by,limit
#查詢每個(gè)欄目下價(jià)格最高的
select cat_id,max(goods_price) from goos group by cat_id;
#查出價(jià)格最高的商品編號(hào)
select goods_id,max(goods_price) from goods group by goods_id;
#求每個(gè)欄目的商品平均價(jià)格
select cat_id,avg(goods_price) from goods group by cat_id;
#查詢本店商品價(jià)格比市場價(jià)低多少錢带欢,輸出低200元以上的商品
select goods_id,good_name,market_price - shop_price as s from goods having s>200 ;
//這里不能用where因?yàn)閟是查詢結(jié)果运授,而where只能對表中的字段名篩選
如果用where的話則是:
select goods_id,goods_name from goods where market_price - shop_price > 200;
2:索引的創(chuàng)建,優(yōu)缺點(diǎn)乔煞,最左原則
3:存儲(chǔ)引擎吁朦,常用的幾個(gè),優(yōu)缺點(diǎn)渡贾,差別逗宜,原理(面試必出)
4:sql注入的處理方法
5:mysql處理函數(shù)(PHP中封裝的)
連接,預(yù)處理(編譯一次空骚,不同參數(shù)多次執(zhí)行)纺讲,執(zhí)行
6:PDO的使用方法,為什么使用
在php5.3.6之后府怯,pdo不會(huì)在本地對sql進(jìn)行拼接然后將拼接后的sql傳遞給mysql server處理(也就是不會(huì)在本地做轉(zhuǎn)義處理)刻诊。pdo的處理方法是在prepare函數(shù)調(diào)用時(shí),將預(yù)處理好的sql模板(包含占位符)通過mysql協(xié)議傳遞給mysql server牺丙,告訴mysql server模板的結(jié)構(gòu)以及語義则涯。當(dāng)調(diào)用execute時(shí)复局,將兩個(gè)參數(shù)傳遞給mysql server。由mysql server完成變量的轉(zhuǎn)移處理粟判。將sql模板和變量分兩次傳遞亿昏,即解決了sql注入問題。
7:mysql的優(yōu)化档礁,表拆分等
8:事務(wù)處理角钩,sql語句的處理效率等
一系列操作,要么全部成功呻澜,否則會(huì)到操作前
在 MySQL 中只有使用了 Innodb 數(shù)據(jù)庫引擎的數(shù)據(jù)庫或表才支持事務(wù)递礼。
事務(wù)處理可以用來維護(hù)數(shù)據(jù)庫的完整性,保證成批的 SQL 語句要么全部執(zhí)行羹幸,要么全部不執(zhí)行脊髓。
事務(wù)用來管理 insert,update,delete 語句
Atomicity(原子性)、Consistency(穩(wěn)定性)栅受、Isolation(隔離性)将硝、Durability(可靠性)
1、事務(wù)的原子性:一組事務(wù)屏镊,要么成功依疼;要么撤回。
2而芥、穩(wěn)定性 :有非法數(shù)據(jù)(外鍵約束之類)律罢,事務(wù)撤回。
3蔚出、隔離性:事務(wù)獨(dú)立運(yùn)行弟翘。一個(gè)事務(wù)處理后的結(jié)果虫腋,影響了其他事務(wù)骄酗,那么其他事務(wù)會(huì)撤回。事務(wù)的100%隔離悦冀,需要犧牲速度趋翻。
4、可靠性:軟盒蟆、硬件崩潰后踏烙,InnoDB數(shù)據(jù)表驅(qū)動(dòng)會(huì)利用日志文件重構(gòu)修改±龋可靠性和高速度不可兼得讨惩, innodb_flush_log_at_trx_commit 選項(xiàng) 決定什么時(shí)候吧事務(wù)保存到日志里。
9:數(shù)據(jù)表字段的類型寒屯,同類型間的區(qū)別荐捻,改如何選取黍少,int(10)與int(11)的區(qū)別等。
10:數(shù)據(jù)庫索引使用的那種數(shù)據(jù)結(jié)構(gòu)处面,畫出數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)庫事務(wù)的隔離級別有4種厂置,由低到高分別為Read uncommitted 、Read committed 魂角、Repeatable read 昵济、Serializable 。而且野揪,在事務(wù)的并發(fā)操作中可能會(huì)出現(xiàn)臟讀访忿,不可重復(fù)讀,幻讀斯稳。下面通過事例一一闡述它們的概念與聯(lián)系醉顽。
Read uncommitted
讀未提交,顧名思義平挑,就是一個(gè)事務(wù)可以讀取另一個(gè)未提交事務(wù)的數(shù)據(jù)游添。
事例:老板要給程序員發(fā)工資,程序員的工資是3.6萬/月通熄。但是發(fā)工資時(shí)老板不小心按錯(cuò)了數(shù)字唆涝,按成3.9萬/月,該錢已經(jīng)打到程序員的戶口唇辨,但是事務(wù)還沒有提交廊酣,就在這時(shí),程序員去查看自己這個(gè)月的工資赏枚,發(fā)現(xiàn)比往常多了3千元亡驰,以為漲工資了非常高興。但是老板及時(shí)發(fā)現(xiàn)了不對饿幅,馬上回滾差點(diǎn)就提交了的事務(wù)凡辱,將數(shù)字改成3.6萬再提交。
分析:實(shí)際程序員這個(gè)月的工資還是3.6萬栗恩,但是程序員看到的是3.9萬透乾。他看到的是老板還沒提交事務(wù)時(shí)的數(shù)據(jù)。這就是臟讀磕秤。
那怎么解決臟讀呢乳乌?Read committed!讀提交市咆,能解決臟讀問題汉操。
Read committed
讀提交,顧名思義蒙兰,就是一個(gè)事務(wù)要等另一個(gè)事務(wù)提交后才能讀取數(shù)據(jù)磷瘤。
事例:程序員拿著信用卡去享受生活(卡里當(dāng)然是只有3.6萬)其弊,當(dāng)他埋單時(shí)(程序員事務(wù)開啟),收費(fèi)系統(tǒng)事先檢測到他的卡里有3.6萬膀斋,就在這個(gè)時(shí)候K蠓ァ!程序員的妻子要把錢全部轉(zhuǎn)出充當(dāng)家用仰担,并提交糊识。當(dāng)收費(fèi)系統(tǒng)準(zhǔn)備扣款時(shí),再檢測卡里的金額摔蓝,發(fā)現(xiàn)已經(jīng)沒錢了(第二次檢測金額當(dāng)然要等待妻子轉(zhuǎn)出金額事務(wù)提交完)赂苗。程序員就會(huì)很郁悶,明明卡里是有錢的…
分析:這就是讀提交贮尉,若有事務(wù)對數(shù)據(jù)進(jìn)行更新(UPDATE)操作時(shí)拌滋,讀操作事務(wù)要等待這個(gè)更新操作事務(wù)提交后才能讀取數(shù)據(jù),可以解決臟讀問題猜谚。但在這個(gè)事例中败砂,出現(xiàn)了一個(gè)事務(wù)范圍內(nèi)兩個(gè)相同的查詢卻返回了不同數(shù)據(jù),這就是不可重復(fù)讀魏铅。
那怎么解決可能的不可重復(fù)讀問題昌犹?Repeatable read !
Repeatable read
重復(fù)讀览芳,就是在開始讀取數(shù)據(jù)(事務(wù)開啟)時(shí)斜姥,不再允許修改操作
事例:程序員拿著信用卡去享受生活(卡里當(dāng)然是只有3.6萬),當(dāng)他埋單時(shí)(事務(wù)開啟沧竟,不允許其他事務(wù)的UPDATE修改操作)铸敏,收費(fèi)系統(tǒng)事先檢測到他的卡里有3.6萬。這個(gè)時(shí)候他的妻子不能轉(zhuǎn)出金額了悟泵。接下來收費(fèi)系統(tǒng)就可以扣款了杈笔。
分析:重復(fù)讀可以解決不可重復(fù)讀問題。寫到這里魁袜,應(yīng)該明白的一點(diǎn)就是桩撮,不可重復(fù)讀對應(yīng)的是修改,即UPDATE操作峰弹。但是可能還會(huì)有幻讀問題。因?yàn)榛米x問題對應(yīng)的是插入INSERT操作芜果,而不是UPDATE操作鞠呈。
什么時(shí)候會(huì)出現(xiàn)幻讀?
事例:程序員某一天去消費(fèi)右钾,花了2千元蚁吝,然后他的妻子去查看他今天的消費(fèi)記錄(全表掃描FTS旱爆,妻子事務(wù)開啟),看到確實(shí)是花了2千元窘茁,就在這個(gè)時(shí)候怀伦,程序員花了1萬買了一部電腦,即新增INSERT了一條消費(fèi)記錄山林,并提交房待。當(dāng)妻子打印程序員的消費(fèi)記錄清單時(shí)(妻子事務(wù)提交),發(fā)現(xiàn)花了1.2萬元驼抹,似乎出現(xiàn)了幻覺桑孩,這就是幻讀。
那怎么解決幻讀問題框冀?Serializable流椒!
Serializable 序列化
Serializable 是最高的事務(wù)隔離級別,在該級別下明也,事務(wù)串行化順序執(zhí)行宣虾,可以避免臟讀、不可重復(fù)讀與幻讀温数。但是這種事務(wù)隔離級別效率低下安岂,比較耗數(shù)據(jù)庫性能,一般不使用帆吻。
共享鎖(S鎖):如果事務(wù)T對數(shù)據(jù)A加上共享鎖后域那,則其他事務(wù)只能對A再加共享鎖,不能加排他鎖猜煮,直到已釋放所有共享鎖次员。獲準(zhǔn)共享鎖的事務(wù)只能讀數(shù)據(jù),不能修改數(shù)據(jù)王带。
排他鎖(X鎖):如果事務(wù)T對數(shù)據(jù)A加上排他鎖后淑蔚,則其他事務(wù)不能再對A加任任何類型的鎖,直到在事務(wù)的末尾將資源上的鎖釋放為止愕撰。獲準(zhǔn)排他鎖的事務(wù)既能讀數(shù)據(jù)刹衫,又能修改數(shù)據(jù)。
數(shù)據(jù)類型
日期和時(shí)間數(shù)據(jù)類型
MySQL數(shù)據(jù)類型含義
date 3字節(jié)搞挣,日期带迟,格式:2014-09-18
time 3字節(jié),時(shí)間囱桨,格式:08:42:30
datetime 8字節(jié)仓犬,日期時(shí)間,格式:2014-09-18 08:42:30
timestamp 4字節(jié)舍肠,自動(dòng)存儲(chǔ)記錄修改的時(shí)間
year 1字節(jié)搀继,年份
數(shù)值數(shù)據(jù)類型
整型
MySQL數(shù)據(jù)類型含義(有符號(hào))
tinyint 1字節(jié)窘面,范圍(-128~127)
smallint 2字節(jié),范圍(-32768~32767)
mediumint 3字節(jié)叽躯,范圍(-8388608~8388607)
int 4字節(jié)财边,范圍(-2147483648~2147483647)
bigint 8字節(jié),范圍(+-9.22*10的18次方)
上面定義的都是有符號(hào)的点骑,當(dāng)然了酣难,也可以加上unsigned關(guān)鍵字,定義成無符號(hào)的類型畔况,那么對應(yīng)的取值范圍就要翻翻了鲸鹦,比如:
tinyint unsigned的取值范圍為0~255。
浮點(diǎn)型
MySQL數(shù)據(jù)類型含義
float(m, d) 4字節(jié)跷跪,單精度浮點(diǎn)型馋嗜,m總個(gè)數(shù),d小數(shù)位
double(m, d) 8字節(jié)吵瞻,雙精度浮點(diǎn)型葛菇,m總個(gè)數(shù),d小數(shù)位
decimal(m, d)decimal是存儲(chǔ)為字符串的浮點(diǎn)數(shù)
我在MySQL中建立了一個(gè)表橡羞,有一列為float(5, 3)眯停;做了以下試驗(yàn):
1.插入123.45678,最后查詢得到的結(jié)果為99.999卿泽;
2.插入123.456莺债,最后查詢結(jié)果為99.999;
3.插入12.34567签夭,最后查詢結(jié)果為12.346齐邦;
所以,在使用浮點(diǎn)型的時(shí)候第租,還是要注意陷阱的措拇,要以插入數(shù)據(jù)庫中的實(shí)際結(jié)果為準(zhǔn)。
字符串?dāng)?shù)據(jù)類型
MySQL數(shù)據(jù)類型含義
char(n)固定長度慎宾,最多255個(gè)字符
varchar(n)可變長度丐吓,最多65535個(gè)字符
tinytext可變長度,最多255個(gè)字符
text可變長度趟据,最多65535個(gè)字符
mediumtext可變長度券犁,最多2的24次方-1個(gè)字符
longtext可變長度,最多2的32次方-1個(gè)字符
1.char(n)和varchar(n)中括號(hào)中n代表字符的個(gè)數(shù)之宿,并不代表字節(jié)個(gè)數(shù)族操,所以當(dāng)使用了中文的時(shí)候(UTF8)意味著可以插入m個(gè)中文,但是實(shí)際會(huì)占用m*3個(gè)字節(jié)比被。
2.同時(shí)char和varchar最大的區(qū)別就在于char不管實(shí)際value都會(huì)占用n個(gè)字符的空間色难,而varchar只會(huì)占用實(shí)際字符應(yīng)該占用的空間+1,并且實(shí)際空間+1<=n等缀。
3.超過char和varchar的n設(shè)置后枷莉,字符串會(huì)被截?cái)唷?/p>
4.char的上限為255字節(jié),varchar的上限65535字節(jié)尺迂,text的上限為65535笤妙。
5.char在存儲(chǔ)的時(shí)候會(huì)截?cái)辔膊康目崭瘢瑅archar和text不會(huì)噪裕。
6.varchar會(huì)使用1-3個(gè)字節(jié)來存儲(chǔ)長度蹲盘,text不會(huì)。
其它類型
1.enum(“member1″, “member2″, … “member65535″)
enum數(shù)據(jù)類型就是定義了一種枚舉膳音,最多包含65535個(gè)不同的成員召衔。當(dāng)定義了一個(gè)enum的列時(shí),該列的值限制為列定義中聲明的值祭陷。如果列聲明包含NULL屬性苍凛,則NULL將被認(rèn)為是一個(gè)有效值,并且是默認(rèn)值兵志。如果聲明了NOT NULL醇蝴,則列表的第一個(gè)成員是默認(rèn)值。
2.set(“member”, “member2″, … “member64″)
set數(shù)據(jù)類型為指定一組預(yù)定義值中的零個(gè)或多個(gè)值提供了一種方法想罕,這組值最多包括64個(gè)成員悠栓。值的選擇限制為列定義中聲明的值。