網(wǎng)頁(yè)游戲排行榜前十名wangyiseo培訓(xùn)班 有用嗎
聯(lián)結(jié)
SQL最強(qiáng)大的功能之一就是能在數(shù)據(jù)檢索查詢的執(zhí)行中聯(lián)結(jié)表;
關(guān)系表
為什么要使用關(guān)系表?
- 使用關(guān)系表可以儲(chǔ)存數(shù)據(jù)不重復(fù),從而不浪費(fèi)時(shí)間和空間;
- 如果有數(shù)據(jù)信息變動(dòng),只需更新一個(gè)表中的單個(gè)記錄,相關(guān)表中的數(shù)據(jù)不用改動(dòng);
- 由于數(shù)據(jù)無(wú)重復(fù),顯然數(shù)據(jù)是一致的,這使得處理數(shù)據(jù)更簡(jiǎn)單。
總之,關(guān)系表可以有效低存儲(chǔ)和方便的處理,因此,關(guān)系數(shù)據(jù)庫(kù)的可伸縮性遠(yuǎn)比非關(guān)系數(shù)據(jù)庫(kù)要好。
可伸縮性:能夠適應(yīng)不斷增加的工作量而不失敗。涉及良好的數(shù)據(jù)庫(kù)或應(yīng)用程序稱之為可伸縮性好;?
這是一個(gè)例子,他找出了群號(hào)為49289306112的群里面的所有群聊成員;
在使用聯(lián)結(jié)查詢的時(shí)候,一定要有where語(yǔ)句,如果沒(méi)有的話就會(huì)輸出巨多的沒(méi)用的數(shù)據(jù),有了where語(yǔ)句還不行,還要保證where語(yǔ)句的準(zhǔn)確性,如果你的where語(yǔ)句不準(zhǔn)確的話,不正確的過(guò)濾條件將導(dǎo)致MySQL返回不正確的數(shù)據(jù);
除了上面的語(yǔ)法,還有一種寫(xiě)法,能夠?qū)崿F(xiàn)一樣的功能;
?這里與前面的區(qū)別就是FROM子句不同,這里,兩個(gè)表之間的關(guān)系是from子句的組成部分,以INNER JOIN指定。在使用這種語(yǔ)法時(shí),聯(lián)結(jié)條件用特定的ON子句而不是WHERE子句給出。傳遞ON的實(shí)際條件與傳遞給WHERE的相同。
至于這兩種語(yǔ)法選擇哪一種,ANSI SQL規(guī)范首選INNER JOIN語(yǔ)法,此外,盡管使用WHERE子句定義聯(lián)結(jié)的確比較簡(jiǎn)單,但是使用明確的聯(lián)結(jié)語(yǔ)法能夠確保不會(huì)忘記聯(lián)結(jié)條件,有時(shí)候這樣做也能影響性能;
聯(lián)結(jié)多個(gè)表
SQL對(duì)一條SELECT語(yǔ)句中可以聯(lián)結(jié)的表的數(shù)目沒(méi)有限制。創(chuàng)建聯(lián)結(jié)的基本規(guī)則也相同,都是先列出所有表,然后定義表之間的關(guān)系;
性能考慮:MySQL在運(yùn)行時(shí)對(duì)聯(lián)結(jié)表的處理時(shí)非常的耗費(fèi)資源的,因此不要聯(lián)結(jié)不必要的表,聯(lián)結(jié)的表越多,性能下降越厲害。
?在之前的學(xué)習(xí)中我們學(xué)習(xí)了子查詢,子查詢和聯(lián)結(jié)都能達(dá)到目的,但是他們兩個(gè)不是說(shuō)哪個(gè)一定好,這個(gè)要看情況而定;
創(chuàng)建高級(jí)聯(lián)結(jié)
?之前學(xué)習(xí)的AS可以為列創(chuàng)建別名,但是其實(shí)AS也能夠給表建立別名;
注意:表別名只在查詢執(zhí)行中使用。與列別名不一樣,表別名不返回到客戶機(jī)。
聯(lián)結(jié)使用的某些要點(diǎn)
- 注意所使用的聯(lián)結(jié)類型,一般我們使用內(nèi)部聯(lián)結(jié),但使用外部聯(lián)結(jié)也是有效的。
- 保證使用正確的聯(lián)結(jié)條件,否則會(huì)返回不正確的數(shù)據(jù)。
- 應(yīng)該總是提取聯(lián)結(jié)條件,否者會(huì)得出迪卡爾積。(兩個(gè)表的所有組合情況,大量數(shù)據(jù))
- 在一個(gè)聯(lián)結(jié)中可以包含多個(gè)表,甚至對(duì)于每個(gè)聯(lián)結(jié)可以采用不同的聯(lián)結(jié)類型。雖然這樣做是合法的,一般也很有用,但是應(yīng)該在一起測(cè)試它們之前,分別測(cè)試每個(gè)聯(lián)結(jié)。這樣可以使得故障排除更為簡(jiǎn)單。
組合查詢
組合查詢就是利用UNION操作符將多條select語(yǔ)句組合成一個(gè)結(jié)果集
在下面兩個(gè)基本情況里面要用到組合查詢:
- 在單個(gè)查詢中從不同的表返回類似結(jié)構(gòu)的數(shù)據(jù);
- 對(duì)單個(gè)表執(zhí)行多個(gè)查詢,按單個(gè)查詢返回?cái)?shù)據(jù);
?在寫(xiě)qq聊天室項(xiàng)目時(shí),我用到了組合查詢,因?yàn)樵诤糜殃P(guān)系表里面A是B的好友,那么B也是A的好友,所以在查詢時(shí),我們即要查看自己在A時(shí)有多少個(gè)B好友,又要查找自己為B時(shí)有多少給A好友;
這個(gè)UNION就是查詢了存款大于2000和年齡小于19的結(jié)果;
UNION使用規(guī)則:
- UNION必須由兩條或者兩條以上的select語(yǔ)句組成,語(yǔ)句之間用關(guān)鍵字UNION分隔(因此,如果組合四條select語(yǔ)句,就要使用3個(gè)UNION語(yǔ)句)。
- UNION的每個(gè)查詢必須包含相同的列,表達(dá)式或者聚集函數(shù)(不過(guò)各個(gè)列不需要以相同的次序列出)
- 列數(shù)據(jù)類型必須兼容;類型不必完全相同,但必須時(shí)DBMS可以隱含的轉(zhuǎn)換的類型(例如:不同的數(shù)值或不同的日期類型)。
?小細(xì)節(jié):
使用UNION時(shí),它會(huì)默認(rèn)將多條select語(yǔ)句查詢到的重復(fù)的行去重,所以在使用UNION時(shí),重復(fù)的行會(huì)被去除,但是我們需要的話,也可以使用UNION ALL來(lái)獲得所有的匹配行;
當(dāng)我們想要對(duì)組合查詢結(jié)果進(jìn)行排序的時(shí)候,只能使用一條ORDER BY子句,它必須出現(xiàn)在最后一條select語(yǔ)句之后,對(duì)于結(jié)果集,不存在用一種方式排序一部分,而又用另一種方式排序?qū)幰徊糠值那闆r,因此不允許使用多條ORDER BY語(yǔ)句;
上面的例子中的組合查詢使用的均是demo1表,但是UNION可以用于組合查詢不同的表;
全文本搜索
并非所有的引擎都支持全文本搜索,兩個(gè)最常用的引擎為MyISAM和InnoDB,前者支持全文本搜索,而后者不支持。
在之前我們學(xué)習(xí)了使用LIKE和通配符來(lái)搜索文本,還有REGEXP操作符后面加正則表達(dá)式來(lái)搜索行;雖然這些搜索機(jī)制很有用,但是存在幾個(gè)重要的限制:
- 性能——通配符和正則表達(dá)式匹配通常要求MySQl嘗試匹配表中所有行(而且這些搜索極少使用表索引)。因此,由于被搜索行數(shù)不斷增加,這些搜索可能會(huì)非常耗時(shí);
- 明確控制——使用通配符和正則表達(dá)式匹配,很難(而且并不總是能)明確地控制匹配什么和不匹配什么。例如,指定一個(gè)詞必須匹配,一個(gè)詞必須不匹配,而一個(gè)詞僅在第一個(gè)詞確實(shí)匹配的情況下才可以匹配或者才可以不匹配。
- 智能化的結(jié)果——雖然基于通配符和正則表達(dá)式的搜索提供了非常靈活的搜索,但是它們都不能提供一種智能化的選擇結(jié)果的方法。例如,一個(gè)特殊值的搜索會(huì)返回包含該詞的所有行,而不區(qū)分包含單個(gè)匹配的行和包含多個(gè)匹配的行(按照可能是更好的匹配來(lái)排列它們)。類似,一個(gè)特殊詞的搜索將不會(huì)找出不包含該詞但是包含其他相關(guān)詞的行。
?首先,我們先建一個(gè)表:
?這里FULLTEXT(note_text)?表示將note_text設(shè)置為全文本查找的字段;
然后就是插入數(shù)據(jù):
?然后首先測(cè)試like模糊查詢
?查詢結(jié)果分析:應(yīng)為like模糊查詢是在整個(gè)數(shù)據(jù)中查看有沒(méi)有包含'fiction'這個(gè)單詞的,如果有就過(guò)濾出來(lái),而在我插入的數(shù)據(jù)中,1和5是有的;
?然后再是全文本搜索
結(jié)果:
再測(cè)試全文本搜索-布爾文本搜索
?在全文本搜索中常用的布爾運(yùn)算符
結(jié)果:
?使用擴(kuò)展查詢
?這個(gè)會(huì)根據(jù)包含fiction的兩條行中的數(shù)據(jù)中的其他單詞來(lái)對(duì)其他行進(jìn)行匹配,相當(dāng)與找到了正確答案還要找與正確答案類似的答案;
結(jié)果:
?全文本搜索-顯示排名字段,按照匹配度由高到低排序
?結(jié)果:
?細(xì)節(jié):Match( )和Against( )出現(xiàn)的位置對(duì)結(jié)果的影響較大,當(dāng)Match( )和Against( )出現(xiàn)在where子句中時(shí),只會(huì)返回匹配到的行,但是如果Match( )和Against( )出現(xiàn)在SELECT中的話,就會(huì)使得所有的行全部被返回,Match( )和Against( )用來(lái)建立一個(gè)計(jì)算列(別名為rank),此列包含全文本搜索計(jì)算出的等級(jí)值。等級(jí)由MySQL根據(jù)行中詞的數(shù)目,唯一詞的數(shù)目,整個(gè)索引中詞的總數(shù)以及包含該詞的行的數(shù)目計(jì)算出來(lái),并且這個(gè)值還與唯一詞所處的位置有關(guān),唯一詞靠前的值較高,靠后的值較低。