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