mysql中雖然有連接配接查詢實作多表連接配接查詢,但是連接配接查詢的性能很差,是以便出現了子查詢。
1、理論上,子查詢可以出現在查詢語句的任何位置,但實際應用中多出現在from後和where後。出現在from後的子查詢結果通常是多行多列的,充當臨時表;而出現在where後的子查詢結果通常是單行單列,充當條件:
2、where後作為條件的子查詢多與“=”、“!=”、“>”、“<”等比較運算符一起使用。結果雖然通常是單行單列,但是有的時候也會用單行多列,而且有的時候還會傳回多行單列。如果是多行單列的情況,則多與in、any、all、exists結合使用:
in和not in:
其中in表示包含于後邊子查詢結果集裡的任意一個,not in表示不包含于後邊結果集裡的任意一個。上圖子查詢的結果中,傳回depart_id為1、2、4,是以第一個查詢就會查出emp中所有depart_id是1或2或4的,第二個就會查出既不是1也不是2也不是4的。
any:
=any的用法和in的效果是一樣的;>any是說要大于子查詢結果集裡的任意一個就可以,簡單了解就是隻要大于結果集中最小的那個就可以;<any就是要小于子查詢結果集裡任意一個就可以,簡單了解就是隻要小于最大的一個就可以。是以這裡>any是隻要大于1就行,而<any則隻要小于4就行。
all:
>all就是說要大于子查詢結果集裡所有的,簡單了解就是要比最大的那個還大;<all就是要小于結果集裡所有的,簡單了解就是要比最小的還小。是以上邊的第一個查詢就是要大于4,第二個就是要小于1。
exists:
exists和not exists隻關心後邊的子查詢是否有結果,而不關心子查詢的結果是什麼;對于exists,如果後邊的子查詢有結果,那麼它的值就是true,反之如果沒有查到結果,則為false,而not exists正好和這個情況相反,有值為false,無值為true。當他們的值為true時,前邊查詢到的結果成立,會被加入到主查詢的結果集,否則不會被加入主查詢的結果集。
在上便的查詢中,查詢語句會先從emp中查詢一條資料,然後拿這條資料的depart_id和company中的depart_id比較,當存在兩個id相同的資料時,就會有結果傳回,然後最終傳回6條資料,而第二個查詢一樣的道理,當不存在兩個id相同的資料時,主查詢才有結果傳回,隻有一條資料。