(敲黑板重點來了官帘,前面的內(nèi)容學過的可以不用溫習了盼铁,但接下來的內(nèi)容就非學不可啦
一醋粟、使用子查詢
1.利用子查詢進行過濾
例如與IN操作符結(jié)合使用,列出訂購物品TNT2的所有客戶
輸出:
2.作為計算字段使用子查詢
例如需要顯示customers表中每個客戶的訂單總數(shù)昌讲,訂單與相互的客戶ID存儲在orders表中国夜。
輸入:
輸出:
相關(guān)子查詢(涉及外部查詢的子查詢)
WHERE orders.cust_id=customers.cust_id,(完全限定列名)告訴SQL比較orders表中的cust_id與當前正從customers表中檢索的cust_id短绸。
二车吹、聯(lián)結(jié)表
SQL最強大的功能之一就是能在數(shù)據(jù)檢索查詢的執(zhí)行中聯(lián)結(jié)表。聯(lián)結(jié)是利用SQL的SELECT能執(zhí)行的最重要的操作醋闭。
聯(lián)結(jié)(join)
聯(lián)結(jié)是一種機制窄驹,用來在一條select語句中關(guān)聯(lián)表,因此稱之為聯(lián)結(jié)证逻。使用特殊的語法乐埠,可以聯(lián)結(jié)多個表返回一組輸出,聯(lián)結(jié)在運行時關(guān)聯(lián)表中正確的行囚企。
1.關(guān)系表里的概念
關(guān)系表的設(shè)計是要保證把信息分解成多個表丈咐,一類數(shù)據(jù)一個表,各表通過一定的關(guān)系互相關(guān)聯(lián)龙宏。
外鍵:外鍵為某個表中的一列棵逊,它包含另一個表的主鍵值,定義了兩個表之間的關(guān)系烦衣。
可伸縮性:能夠適應(yīng)不斷增加的工作量而不失敗歹河。
2.創(chuàng)建聯(lián)結(jié)(必須使用WHERE創(chuàng)建等值聯(lián)結(jié)不然會出現(xiàn)笛卡爾積)
與前面select語句不同的是vend_name在一個表掩浙,而prod_name和prod_price在另一個表花吟。
3.內(nèi)部聯(lián)結(jié)
基于兩個表之間相等測試的聯(lián)結(jié)稱為等值聯(lián)結(jié),也叫內(nèi)部聯(lián)結(jié)厨姚。
(使用INNER JOIN創(chuàng)建等值聯(lián)結(jié))
4.連接多個表
三衅澈、創(chuàng)建高級聯(lián)結(jié)
1.使用表別名
2.使用不同類型的聯(lián)結(jié)
自聯(lián)結(jié),自然聯(lián)結(jié)和外部聯(lián)結(jié)
2.1自聯(lián)結(jié)
自聯(lián)結(jié)通常作為外部語句用來替代從相同表中檢索數(shù)據(jù)時使用的子查詢語句谬墙。雖然最終的結(jié)果是相同的今布,但有時候處理聯(lián)結(jié)遠比處理子查詢快得多。
2.2自然聯(lián)結(jié)
標準的聯(lián)結(jié)返回所有數(shù)據(jù)拭抬,甚至相同的列多次出現(xiàn)部默。自然聯(lián)結(jié)排除多次出現(xiàn),使每個列值返回一次造虎。
2.3外部聯(lián)結(jié)
與內(nèi)部聯(lián)結(jié)關(guān)聯(lián)兩個表中的行不同的是外部聯(lián)結(jié)還包括沒有關(guān)聯(lián)的行傅蹂。在使用OUTER JOIN時,必須使用RIGHT或LEFT關(guān)鍵字指定包括其所有行的表(RIGHT指出OUTER JOIN右邊的表,LEFT指出OUTER JOIN左邊的表)份蝴。
3.使用帶聚集函數(shù)的聯(lián)結(jié)
為說明這一點犁功,請看下面的例子,如果要檢索所有客戶及每個客戶所下的訂單數(shù)婚夫。
3.1INNER JOIN 內(nèi)部聯(lián)結(jié)
輸出結(jié)果:
3.2LEFT OUTER JOIN 外部聯(lián)結(jié)
輸出結(jié)果:
對比發(fā)現(xiàn):左外部聯(lián)結(jié)的結(jié)果顯示也包含了客戶Mouse House浸卦,它有0個訂單。
4.使用聯(lián)結(jié)和聯(lián)結(jié)條件
四案糙、組合查詢
1.組合查詢也通常稱為并(union)或復合查詢限嫌。
有兩種基本情況,其中需要使用組合查詢:
1)在單個查詢中從不同的表返回類似結(jié)構(gòu)的數(shù)據(jù)
2)對單個表執(zhí)行多個查詢侍筛,按單個查詢返回數(shù)據(jù)
2.創(chuàng)建組合查詢
將UNION換成UNION ALL可以包含不同SELECT子句選中的重復的列
UNION規(guī)則
1)UNION必須由兩條或兩條以上的SELECT語句組成萤皂,語句之間用關(guān)鍵字UNION分隔。
2)UNION中的 每個查詢必須包含相同的列匣椰、表達式或聚集函數(shù)
3)列數(shù)據(jù)類型可以不完全相同裆熙,但必須兼容
3.對組合查詢結(jié)果排序
ORDER BY必須出現(xiàn)在最后一條SELECT語句之后
五、全文本搜索
1.為了進行全文本搜索禽笑,必須索引被搜索的列入录,而且要隨著數(shù)據(jù)的改變不斷地重新索引; 1.1啟用全文本搜索支持:一般在創(chuàng)建表時啟用全文本搜索佳镜;create table 語句接收fulltext 子句僚稿,它給出被索引列的一個逗號分隔的列表;
1.2MySQL根據(jù)子句fulltext(note_text)的指示對它進行索引蟀伸。這里的fulltext索引單個列蚀同,如果需要也可以索引多個列;在定義之后啊掏,MySQL自動維護該索引蠢络。在增加、更新或刪除行時迟蜜,索引隨之自動更新刹孔;
2.進行全文本搜索:使用match()函數(shù)和against()函數(shù)執(zhí)行全文本搜索,其中Match()指定被搜索的列娜睛,Against()指定要使用的搜索表達式髓霞。
3.使用查詢擴展
查詢擴展(with query expansion)不止返回包含搜索詞的行,還返回與該行相關(guān)的行畦戒。
select note_text from productnotes where match(note_text) against('anvils' with query expansion) 方库;
4.布爾文本搜索
布爾搜索可以指定以下搜索條件:
1 要匹配的詞 2 要排斥的詞(包含該詞的行不返回,即使包含指定的詞)3 排列提示(詞的重要等級)4表達式分組
文本布爾操作符:
如匹配包含heavy但不包含任意以rope開始的詞的行:
全文本搜索的使用說明:
1)在索引全文本數(shù)據(jù)時障斋,短詞被忽略且從索引中排除纵潦。短詞定義為具有3個或3個以下字符的詞(可以更改)
2)mysql帶有一個內(nèi)建的非用詞表,這些詞在全文本搜索中被忽略,
3)mysql規(guī)定了一條50%規(guī)則酪穿,如果一個詞出現(xiàn)在50%以上的行中凳干,則將它忽略,不使用與in boolean mode
4)如果表中的行少于3行被济,全文本搜索不返回結(jié)果(因為每次詞或者不出現(xiàn)箫柳,或者至少50%出現(xiàn))
5)忽略詞中的個單引號