連接
交叉連接
連接的最簡(jiǎn)單類型就是交叉連接,它是對(duì)涉及到表相乘創(chuàng)建一個(gè)包含所有內(nèi)容的產(chǎn)物。
例子:
select * from student,person;//結(jié)果是兩張表的結(jié)合體
兩張表的所有列結(jié)合起來(lái)產(chǎn)生了一個(gè)包含所有可能組合的結(jié)果集。這種類型成為交叉連接,而且連接后的結(jié)果表的行數(shù)和用于 連接的每個(gè)表的行數(shù)乘積相同。
上面那樣的交叉連接會(huì)對(duì)數(shù)據(jù)庫(kù)服務(wù)器的性能產(chǎn)生很大的影響,所以在連接中使用where子句過(guò)濾掉一些記錄是不錯(cuò)的選擇。
內(nèi)連接/外連接
內(nèi)連接是最普通的連接類型,而且是最均勻的,因?yàn)樗髽?gòu)成連接的每一部分的每個(gè)表的匹配,不匹配的行將會(huì)被 排除在最后的結(jié)果集之外
內(nèi)連接最常見(jiàn)的的例子是相等連接,也就是連接后的表中的某個(gè)字段與每個(gè)表中的都相同。這種情況,最后的結(jié)果集只包含 參加連接的表中與指定字段相符的行。
外連接是不對(duì)稱的,連接的一方的所有行都包含在最后的記錄中,不管它們是否與連接的另外一方的行匹配
根據(jù)連接的哪一方被保留,sql定義了左外連接和右外連接。在左外連接中,與where子句相匹配的連接左部的表的所有記錄 都將出現(xiàn)在最后結(jié)果集中。在右外連接中,與where子句相匹配的連接的右部的表的所有記錄都將出現(xiàn)在最后結(jié)果集中。
左外連接:解釋為“從連接的左部選擇所有的行,對(duì)于選中的每一行,或者從右部顯示相匹配的值,或者顯示為null的一行”。 這種類型的連接稱為左連接,或者稱為左外連接。右連接或者右外連接剛好與次相反。
自連接
這種類型的連接把一個(gè)表與它自身進(jìn)行連接 ,它通常用來(lái)取出表中彼此包含內(nèi)連接的記錄。
除了連接,MySQL4.0以及更高的版本還支持union運(yùn)算符,它用來(lái)把多個(gè)select查詢的輸出連接成一個(gè)單獨(dú)的結(jié)果集。 大多數(shù)情況下,這個(gè)運(yùn)算符用來(lái)把查詢產(chǎn)生的結(jié)果集添加到不同的表中,同時(shí)創(chuàng)建包括所有結(jié)果的一個(gè)單獨(dú)表。
使用union運(yùn)算符組合盡可能多的select查詢,但是必須具備兩個(gè)基本條件:
首先,每個(gè)select查詢返回的字段 的個(gè)數(shù)必須相同。
其次,每個(gè)select查詢的字段的數(shù)據(jù)類型必須互相符合。
union運(yùn)算符將會(huì)自動(dòng)從組合結(jié)果集中消除重復(fù)的行!
子查詢
where/having查詢
MySQL可以在where子句或者h(yuǎn)aving子句中包含子查詢。包含在圓括號(hào)內(nèi)的子查詢,優(yōu)先級(jí)高于比較和邏輯操作符、in操作符或者 exists操作符。
也可以在一個(gè)having子句中的比較運(yùn)算符前使用子查詢,從而用它對(duì)父查詢創(chuàng)建的組進(jìn)行過(guò)濾。
in/exists/from查詢
只有子查詢返回的結(jié)果列包含一個(gè)值時(shí),比較運(yùn)算符才適用。假如一個(gè)子查詢返回的結(jié)果集是值的列表, 這時(shí)比較運(yùn)算符就必須用in運(yùn)算符代替。
in運(yùn)算符可以檢測(cè)結(jié)果集中是否存在某個(gè)特定的值,如果檢測(cè)成功就執(zhí)行外部的查詢。
exists運(yùn)算符可以用來(lái)查詢一個(gè)子查詢是否產(chǎn)生了結(jié)果,這使得可以只在exists檢測(cè)返回真時(shí)才執(zhí)行外部的查詢
還可以在一個(gè)select語(yǔ)句的from子句中把子查詢產(chǎn)生的結(jié)果作為一個(gè)表。
所以,內(nèi)查詢產(chǎn)生的結(jié)果表用在外查詢的from子句中。這樣的表在sql中成為到導(dǎo)出表。
需要注意的是,當(dāng)以這種方式使用子查詢的結(jié)果時(shí),內(nèi)查詢產(chǎn)生的結(jié)果表必須首先另取一個(gè)表名,否則MySQL不知道如何參照其中的列。