【1】使用子查詢 1)查詢定義:任何sql 語句都是查詢。但此術(shù)語一般指 select語句;SQL 還允許創(chuàng)建子查詢,即嵌套在其他查詢中的查詢; 2)利用子查詢進(jìn)行過濾(where子句,in子句)
2.1)可以把一條select語句返回的結(jié)果用于另一條select語句的where子句;
3)作為計算字段使用子查詢 3.1)使用子查詢的另一種方式是創(chuàng)建計算字段:如需要顯式供應(yīng)商的訂單總數(shù)和供應(yīng)商的id和name;
Attention)顯然, select id,name,(select count(*) from product p where p.vendor=v.id group by vendor) as my_count from vendor v;與其他的SQL不同,因為 where p.vendor=v.id group by vendor) as my_count from vendor v 子句 使用了完全限定名比較 內(nèi)部表和外部表的id是否相等;
【2】聯(lián)結(jié)表 1)主鍵+外鍵: 1.1)主鍵:能夠唯一標(biāo)識每一行數(shù)據(jù); 1.2)外鍵:外鍵為某個表中的一列,它包含另一個表的主鍵值,定義了兩個表之間的關(guān)系; 2)創(chuàng)建聯(lián)結(jié):
3)笛卡爾積:由沒有聯(lián)結(jié)條件的表關(guān)系返回的結(jié)果為笛卡爾積。檢索出的行的數(shù)目是第一個表中的行數(shù)乘以第二個表中的行數(shù);
Attention)不要忘記where子句:應(yīng)該保證所有聯(lián)結(jié)都有where 子句,否則MySQL 將返回比想要的數(shù)據(jù)多得多的數(shù)據(jù);
4)內(nèi)部聯(lián)結(jié)(=等值聯(lián)結(jié)) 4.1)定義:目前為止使用的聯(lián)結(jié)稱為等值聯(lián)結(jié),它基于兩個表之間的相等測試。這種聯(lián)結(jié)也稱為內(nèi)部聯(lián)結(jié);
select v.id,v.name from product p, vendor v where p.vendor = v.id; select v.id,v.name from product p inner join vendor v on p.vendor = v.id;
5)聯(lián)結(jié)多個表
5.1)我們需要找出購買wang供應(yīng)商的生產(chǎn)商品的客戶id;
select customer_id from t_order o,product p,vendor v where o.prod_id=p.id and p.vendor = v.id and v.name='wang';
【3】創(chuàng)建高級聯(lián)結(jié) for spec info,please visit MySQL的自然聯(lián)結(jié)+外部聯(lián)結(jié)(左外連接,右外連接)+內(nèi)部聯(lián)結(jié)
【4】組合查詢 1)MySQL允許執(zhí)行多個查詢(多條select),并將結(jié)果作為單個查詢結(jié)果集返回。這些組合查詢通常稱為并(union)或復(fù)合查詢; 2)有兩種case,需要使用組合查詢; case1)在單個查詢中從不同的表返回類似結(jié)構(gòu)的數(shù)據(jù); case2)對單個表執(zhí)行多個查詢,按單個查詢返回數(shù)據(jù); 3)創(chuàng)建組合查詢:可用union 操作符來組合數(shù)條SQL 查詢;利用union, 可給出多條select 語句,將它們的結(jié)果組成成單個結(jié)果集; 4)使用union
5)使用union規(guī)則(rules) r1)union必須由兩條或兩條以上的select 語句組成,語句之間用關(guān)鍵字 union分割; r2)union 中的每個查詢必須包含系統(tǒng)的列,表達(dá)式或聚集函數(shù)(不過各個列不需要以相同的次序給出); r3)列數(shù)量類型必須兼容:類型不必完全相同,但必須是 DBMS可以隱含地轉(zhuǎn)換的類型; 6)包含或取消重復(fù)的行 6.1)problem+solution: problem)第一條select語句返回4行,第二條select語句返回3行,而在用union組合兩條select語句后,只返回了6行而不是7行;原因是 union從查詢結(jié)果集中自動去除了重復(fù)的行(在使用union時,重復(fù)的行被自動取消); solution)如果想要返回所有匹配行,可以使用 union all 而不是 union; 7)對組合查詢結(jié)果排序:在使用union 組合查詢時,只能使用一條 order by 語句,它必須出現(xiàn)在最后一條select 語句之后。
?Attention)使用union時,也可以使用不同的表進(jìn)行組合;
【5】全文本搜索 1)只有 myisam 引擎支持全文本搜索; 2)為了進(jìn)行全文本搜索,必須索引被搜索的列,而且要隨著數(shù)據(jù)的改變不斷地重新索引; 2.1)啟用全文本搜索支持:一般在創(chuàng)建表時啟用全文本搜索;create table 語句接收fulltext 子句,它給出被索引列的一個逗號分隔的列表; 看個荔枝)通過create演示fulltext子句的使用:
?對以上代碼的分析(Analysis):
A1)MySQL根據(jù)子句fulltext(note_text)的指示對它進(jìn)行索引。這里的fulltext索引單個列,如果需要也可以索引多個列; A2)在定義之后,MySQL自動維護(hù)該索引。在增加、更新或刪除行時,索引隨之自動更新; Attention)不要在導(dǎo)入數(shù)據(jù)時使用fulltext: 更新索引要花時間,雖然不是很多,但畢竟要花時間。如果正在導(dǎo)入數(shù)據(jù)到一個新表,此時不應(yīng)該啟用fulltext索引。應(yīng)該首先導(dǎo)入所有數(shù)據(jù),然后再修改表,定義 fulltext,這樣有助于更快地導(dǎo)入數(shù)據(jù);
2.2)進(jìn)行全文本搜索:使用match()函數(shù)和against()函數(shù)質(zhì)心全文本搜索,match()函數(shù)指定被搜索的列,而against()指定要使用的搜索表達(dá)式; Attention)以下荔枝轉(zhuǎn)自:http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/functions.html#fulltext-search
2.3)全文搜索帶查詢擴展
全文搜索支持查詢擴展功能 (特別是其多變的“盲查詢擴展功能” )。若搜索短語的長度過短, 那么用戶則需要依靠全文搜索引擎通常缺乏的內(nèi)隱知識進(jìn)行查詢。這時,查詢擴展功能通常很有用。例如, 某位搜索 “database” 一詞的用戶,可能認(rèn)為“mysql”、“oracle”、“db2” and “rdbms”均為符合 “databases”的項,因此都應(yīng)被返回。這既為內(nèi)隱知識。
在下列搜索短語后添加WITH QUERY EXPANSION,激活盲查詢擴展功能(即通常所說的自動相關(guān)性反饋)。它將執(zhí)行兩次搜索,其中第二次搜索的搜索短語是同第一次搜索時找到的少數(shù)頂層文件連接的原始搜索短語。這樣,假如這些文件中的一個 含有單詞 “databases” 以及單詞 “MySQL”, 則第二次搜索會尋找含有單詞“MySQL” 的文件,即使這些文件不包含單詞 “database”。下面的例子顯示了這個不同之處:
2.4)布爾全文索引:利用IN BOOLEAN MODE修改程序, MySQL 也可以執(zhí)行布爾全文搜索,提供關(guān)于如下內(nèi)容的細(xì)節(jié)(Details) D1)要匹配的詞; D2)要排斥的詞; D3)排列提示(某些詞比其他詞更重要,更重要的詞等級更高); D4)表達(dá)式分組; ?關(guān)于全文本搜索的使用說明(specification)s1)在索引全文本數(shù)據(jù)時,短詞被忽略且從索引中排除。短詞定義為那些具有3個或3個以下字符的詞(如果需要,這個數(shù)字3可以修改); s2)MySQL 帶有一個內(nèi)建的非用詞列表,這些詞在索引全文本數(shù)據(jù)時總是被忽略。如果需要,可以覆蓋這個列表; s3)許多詞出現(xiàn)的頻率很高,搜索它們沒有用處,因此,MySQL規(guī)定了一條50%規(guī)則,如果一個詞出現(xiàn)在 50% 以上的行中, 則將它作為一個非用詞忽略,50%規(guī)則不用于 in boolean mode 中; s4)如果表中的行數(shù)少于3行,則全文本搜索不返回結(jié)果(因為每個次或者不出現(xiàn),或者至少出現(xiàn)在50%的行中); s5)忽略詞中的單引號,如,don’t == dont; s6)不具有詞分隔符的語言(包括日文和中文)不能恰當(dāng)?shù)胤祷厝谋舅阉鹘Y(jié)果; s7)僅在 MyISAM數(shù)據(jù)庫引擎中支持全文本搜索;