1.SELECT語句的語法:
SELECT
column_1,column_2,...
FROM table_1?
[INNER|LEFT|RIGHT] JOIN table_2 ON conditions
WHERE conditions?
GROUPBY column_1
HAVING group_conditions
ORDERBY column_1
LIMIT offset,length;
SQL
SELECT語句由以下列表中所述的幾個子句組成:
SELECT之后是逗號分隔列或星號(*)的列表,表示要返回所有列迂尝。
FROM指定要查詢數(shù)據(jù)的表或視圖脱茉。
JOIN根據(jù)某些連接條件從其他表中獲取數(shù)據(jù)。
WHERE過濾結(jié)果集中的行垄开。
GROUP BY將一組行組合成小分組琴许,并對每個小分組應(yīng)用聚合函數(shù)。
HAVING過濾器基于GROUP BY子句定義的小分組溉躲。
ORDER BY指定用于排序的列的列表榜田。
LIMIT限制返回行的數(shù)量。
語句中的SELECT和FROM語句是必須的锻梳,其他部分是可選的箭券。
2.在SELECT語句中使用LIMIT子句來約束結(jié)果集中的行數(shù)。LIMIT子句接受一個或兩個參數(shù)疑枯。兩個參數(shù)的值必須為零或正整數(shù)辩块。
下面說明了兩個參數(shù)的LIMIT子句語法:
SELECT column1,column2,...
FROM table
LIMIT offset,count;
SQL
我們來查看LIMIT子句參數(shù):
offset參數(shù)指定要返回的第一行的偏移量。第一行的偏移量為0荆永,而不是1废亭。
count指定要返回的最大行數(shù)。
LIMIT子句經(jīng)常與ORDER BY子句一起使用具钥。首先豆村,使用ORDER BY子句根據(jù)特定條件對結(jié)果集進(jìn)行排序,然后使用LIMIT子句來查找最小或最大值骂删。
注意:ORDER BY子句按指定字段排序的使用掌动。
使用MySQL LIMIT獲得第n個最高值
首先,按照降序對結(jié)果集進(jìn)行排序桃漾。
第二步坏匪,使用LIMIT子句獲得第n貴的產(chǎn)品。
SELECT column1,column2,...
FROM table?
ORDERBY column1 DESC
LIMIT nth-1,count;
當(dāng)使用BETWEEN運算符與日期類型值時撬统,要獲得最佳結(jié)果适滓,應(yīng)該使用類型轉(zhuǎn)換將列或表達(dá)式的類型顯式轉(zhuǎn)換為DATE類型。
例如恋追,要查詢獲取所需日期(requiredDate)從2013-01-01到2013-01-31的所有訂單凭迹,請使用以下查詢:
SELECT
orderNumber,requiredDate,status
FROM orders?
WHERE requireddate
BETWEEN CAST('2013-01-01'ASDATE)
AND CAST('2013-01-31'ASDATE);
MySQL提供兩個通配符罚屋,用于與LIKE運算符一起使用,它們分別是:百分比符號 -%和下劃線 -_嗅绸。
百分比(%)通配符允許匹配任何字符串的零個或多個字符脾猛。
下劃線(_)通配符允許匹配任何單個字符
有時想要匹配的模式包含通配符,例如10%鱼鸠,_20等這樣的字符串時猛拴。在這種情況下,您可以使用ESCAPE子句指定轉(zhuǎn)義字符蚀狰,以便MySQL將通配符解釋為文字字符愉昆。如果未明確指定轉(zhuǎn)義字符,則反斜杠字符\是默認(rèn)轉(zhuǎn)義字符麻蹋。
UPDATE[LOW_PRIORITY][IGNORE]table_nameSETcolumn_name1=expr1,column_name2=expr2,...WHEREcondition;
SQL
在上面UPDATE語句中:
首先跛溉,在UPDATE關(guān)鍵字后面指定要更新數(shù)據(jù)的表名。
其次扮授,SET子句指定要修改的列和新值芳室。要更新多個列,請使用以逗號分隔的列表刹勃。以字面值堪侯,表達(dá)式或子查詢的形式在每列的賦值中來提供要設(shè)置的值。
第三深夯,使用WHERE子句中的條件指定要更新的行抖格。WHERE子句是可選的。 如果省略WHERE子句咕晋,則UPDATE語句將更新表中的所有行。
請注意收奔,WHERE子句非常重要掌呜,所以不應(yīng)該忘記指定更新的條件。 有時坪哄,您可能只想改變一行; 但是质蕉,可能會忘記寫上WHERE子句,導(dǎo)致意外更新表中的所有行翩肌。
MySQL在UPDATE語句中支持兩個修飾符模暗。
LOW_PRIORITY修飾符指示UPDATE語句延遲更新,直到?jīng)]有從表中讀取數(shù)據(jù)的連接念祭。LOW_PRIORITY對僅使用表級鎖定的存儲引擎(例如MyISAM兑宇,MERGE,MEMORY)生效粱坤。
即使發(fā)生錯誤隶糕,IGNORE修飾符也可以使UPDATE語句繼續(xù)更新行瓷产。導(dǎo)致錯誤(如重復(fù)鍵沖突)的行不會更新。
1枚驻、主鍵:
若某一個屬性組(注意是組)能唯一標(biāo)識一條記錄濒旦,該屬性組就是一個主鍵。主鍵不能重復(fù)再登,且只能有一個尔邓,也不允許為空。定義主鍵主要是為了維護(hù)關(guān)系數(shù)據(jù)庫的完整性锉矢。
2梯嗽、外鍵:
外鍵用于與另一張表的關(guān)聯(lián),是能確定另一張表記錄的字段沈撞。外鍵是另一個表的主鍵慷荔,可以重復(fù),可以有多個缠俺,也可以是空值显晶。定義外鍵主要是為了保持?jǐn)?shù)據(jù)的一致性。
3壹士、索引:
索引是對表中一個或多個列的值進(jìn)行排序的結(jié)構(gòu)磷雇。
1)?應(yīng)該創(chuàng)建索引的列的特點:
① 在經(jīng)常需要搜索的列上創(chuàng)建索引,可以加快搜索的速度躏救;
② 在作為主鍵的列上創(chuàng)建索引唯笙,強制該列的唯一性;
③ 在經(jīng)常用在連接的列上創(chuàng)建索引盒使,主要是一些外鍵崩掘,可以加快連接的速度;
④ 在經(jīng)常需要根據(jù)范圍進(jìn)行搜索的列上創(chuàng)建索引少办,因為索引已經(jīng)排序苞慢,其指定的范圍是連續(xù)的;在經(jīng)常需要排序的列上創(chuàng)建索引英妓,因為索引已經(jīng)排序挽放,可以利用索引的排序加快查詢;
⑤ 在經(jīng)常使用在WHERE子句中的列上創(chuàng)建索引蔓纠,加快條件的判斷速度辑畦。
2)?不應(yīng)該創(chuàng)建索引的列的特點:
① 在查詢中很少使用的列上不應(yīng)該創(chuàng)建索引,因為這些列很少使用到腿倚,因此有索引或無索引纯出,并不能提高查詢速度,相反由于增加了索引,反而降低了系統(tǒng)維護(hù)速度潦刃,增大了空間需求侮措;
② 在只有很少數(shù)據(jù)值的列上不應(yīng)該創(chuàng)建索引,很少數(shù)據(jù)值的列如性別等乖杠,在查詢的結(jié)果中分扎,結(jié)果集的數(shù)據(jù)行占了表中數(shù)據(jù)行的很大比例,即需要在表中搜索的數(shù)據(jù)行的比例很大胧洒,增加索引畏吓,并不能明顯加快檢索速度;
③ 當(dāng)修改性能遠(yuǎn)遠(yuǎn)大于檢索性能時卫漫,不應(yīng)該創(chuàng)建索引菲饼,因為改性能和檢索性能是互相矛盾的,當(dāng)增加索引時列赎,會提高檢索性能宏悦,但會降低修改性能,當(dāng)減少索引時包吝,會提高修改性能饼煞,但會降低檢索性能。因此诗越,當(dāng)修改性能遠(yuǎn)大于檢索性能時砖瞧,不應(yīng)該創(chuàng)建索引。
3)?可以在數(shù)據(jù)庫設(shè)計器中創(chuàng)建三種索引:
① 唯一索引:
不允許其中任何兩行具有相同索引值的索引嚷狞。
② 主鍵索引:
表的某一列或列組合块促,其值唯一標(biāo)識表中的每一行,該列或列組合稱為表的主鍵床未。為表定義主鍵將自動創(chuàng)建主鍵索引竭翠,主鍵索引是唯一索引的特定類型。該索引要求主鍵中的每個值都唯一薇搁。
③ 聚集索引:
聚集索引:聚集索引表示表中存儲的數(shù)據(jù)按照索引的順序存儲逃片。由于聚集索引規(guī)定數(shù)據(jù)在表中的物理存儲順序,因此一個表只能包含一個聚集索引只酥。
聚集索引實例:字典默認(rèn)按字母順序排序,如知道某個字的讀音可根據(jù)字母順序快速定位呀狼。
非聚集索引:非聚集索引表示數(shù)據(jù)存儲在一個地方裂允,索引存儲在另一個地方,索引帶有指針指向數(shù)據(jù)的存儲位置哥艇,需要查詢兩個地方才能查找到數(shù)據(jù)绝编。一個表可以包含多個非聚集索引,可以為查找數(shù)據(jù)時常用的每個列創(chuàng)建一個非聚集索引。
非聚集索引實例:如需查詢某個生僻字十饥,則需按字典前面的索引窟勃,如按偏旁進(jìn)行定位,找到該字對應(yīng)的頁數(shù)逗堵,再打開對應(yīng)頁數(shù)找到該字秉氧。
與非聚集索引相比,聚集索引通常提供更快的數(shù)據(jù)訪問速度蜒秤,但對數(shù)據(jù)更新影響較大汁咏。
4)索引的優(yōu)點:
加快對數(shù)據(jù)的檢索。
5)索引的缺點:
①減慢數(shù)據(jù)錄入的速度作媚;
②增加了數(shù)據(jù)庫的尺寸大小攘滩。
4、主鍵和外鍵的關(guān)系:
外鍵是另一個表的主鍵纸泡,主鍵是可以被外鍵有效引用的對象漂问。若A表中的一個字段,是B表的主鍵女揭,則它可以是A表的外鍵蚤假。
5、主鍵和外鍵以及索引的區(qū)別:
定義作用個數(shù)
主鍵唯一標(biāo)識一條記錄田绑,不能有重復(fù)勤哗,不允許為空保證數(shù)據(jù)完整性只能有一個主鍵
外鍵另一表的主鍵,可以重復(fù)掩驱,允許為空和其他表建立聯(lián)系可以有多個外鍵
索引沒有重復(fù)值芒划,但可以有一個空值提高查詢排序的速度可以有多個唯一索引
mysql索引原理:
索引的目的在于提高查詢效率;
磁盤讀取數(shù)據(jù)靠的是機(jī)械運動欧穴,每次讀取數(shù)據(jù)花費的時間可以分為尋道時間民逼、旋轉(zhuǎn)延遲、傳輸時間三個部分涮帘。那么訪問一次磁盤的時間拼苍,即一次磁盤IO的時間約等于5+4.17 = 9ms左右〉饔В考慮到磁盤IO是非常高昂的操作疮鲫,計算機(jī)操作系統(tǒng)做了一些優(yōu)化,當(dāng)一次IO時弦叶,不光把當(dāng)前磁盤地址的數(shù)據(jù)俊犯,而是把相鄰的數(shù)據(jù)也都讀取到內(nèi)存緩沖區(qū)內(nèi),因為局部預(yù)讀性原理告訴我們伤哺,當(dāng)計算機(jī)訪問一個地址的數(shù)據(jù)的時候燕侠,與其相鄰的數(shù)據(jù)也會很快被訪問到者祖。每一次IO讀取的數(shù)據(jù)我們稱之為一頁(page)。具體一頁有多大數(shù)據(jù)跟操作系統(tǒng)有關(guān)绢彤,一般為4k或8k七问,也就是我們讀取一頁內(nèi)的數(shù)據(jù)時候,實際上才發(fā)生了一次IO茫舶,這個理論對于索引的數(shù)據(jù)結(jié)構(gòu)設(shè)計非常有幫助械巡。
建索引的幾大原則
1.最左前綴匹配原則,非常重要的原則奇适,mysql會一直向右匹配直到遇到范圍查詢(>坟比、<、between嚷往、like)就停止匹配葛账,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的皮仁,如果建立(a,b,d,c)的索引則都可以用到籍琳,a,b,d的順序可以任意調(diào)整。
2.=和in可以亂序贷祈,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序趋急,mysql的查詢優(yōu)化器會幫你優(yōu)化成索引可以識別的形式
3.盡量選擇區(qū)分度高的列作為索引,區(qū)分度的公式是count(distinct col)/count(*),表示字段不重復(fù)的比例势誊,比例越大我們掃描的記錄數(shù)越少呜达,唯一鍵的區(qū)分度是1,而一些狀態(tài)粟耻、性別字段可能在大數(shù)據(jù)面前區(qū)分度就是0查近,那可能有人會問,這個比例有什么經(jīng)驗值嗎挤忙?使用場景不同霜威,這個值也很難確定,一般需要join的字段我們都要求是0.1以上册烈,即平均1條掃描10條記錄
4.索引列不能參與計算戈泼,保持列“干凈”,比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引赏僧,原因很簡單大猛,b+樹中存的都是數(shù)據(jù)表中的字段值,但進(jìn)行檢索時淀零,需要把所有元素都應(yīng)用函數(shù)才能比較胎署,顯然成本太大。所以語句應(yīng)該寫成create_time = unix_timestamp(’2014-05-29’);
5.盡量的擴(kuò)展索引窑滞,不要新建索引。比如表中已經(jīng)有a的索引剩辟,現(xiàn)在要加(a,b)的索引扩然,那么只需要修改原來的索引即可
視圖
什么是視圖:視圖就是一條SELECT語句執(zhí)行后返回的結(jié)果集垮抗。所以我們在創(chuàng)建視圖的時候藻懒,主要的工作就落在創(chuàng)建這條SQL查詢語句上培漏。
視圖的特性:視圖是對若干張基本表的引用患久,一張?zhí)摫砜裕樵冋Z句執(zhí)行的結(jié)果施籍,不存儲具體的數(shù)據(jù)(基本表數(shù)據(jù)發(fā)生了改變共啃,視圖也會跟著改變)占调;
可以跟基本表一樣,進(jìn)行增刪改查操作(ps:增刪改操作有條件限制)移剪;
視圖的作用:方便操作究珊,特別是查詢操作,減少復(fù)雜的SQL語句纵苛,增強可讀性剿涮;
更加安全,數(shù)據(jù)庫授權(quán)命令不能限定到特定行和特定列攻人,但是通過合理創(chuàng)建視圖取试,可以把權(quán)限限定到行列級別;
使用場合:權(quán)限控制的時候怀吻,不希望用戶訪問表中某些含敏感信息的列瞬浓,比如salary...
關(guān)鍵信息來源于多個復(fù)雜關(guān)聯(lián)表,可以創(chuàng)建視圖提取我們需要的信息蓬坡,簡化操作猿棉;