Mysql之IN 和 Exists 用法

2022-02-03 05:34:21 字數 3037 閱讀 7677

1.基本用法

in:後面的子查詢 是返回結果集的,換句話說執行次序和exists()不一樣.子查詢先產生結果集,然後主查詢再去結果集裡去找符合要求的字段列表去.符合要求的輸出,反之則不輸出.

exists:後面的子查詢被稱做相關子查詢, 他是不返回列表的值的.只是返回乙個ture或false的結果(這也是為什麼子查詢裡是 "select   1 "的原因,當然也可以select任何東西) 其執行方式是先執行主查詢一次。再去子查詢裡查詢與其對應的結果,如果是ture則輸出,反之則不輸出.再根據主查詢中的每一行去子查詢裡去查詢。

2.執行過程

exists執行順序如下: 

1.首先執行一次外部查詢 

2.對於外部查詢中的每一行分別執行一次子查詢,而且每次執行子查詢時都會引用外部查詢中當前行的值。 

3.使用子查詢的結果來確定外部查詢的結果集。(如果外部查詢返回100行,sql   就將執行101次查詢,一次執行外部查詢,然後為外部查詢返回的每一行執行一次子查詢。但實際上,sql的查詢 優化器有可能會找到一種更好的方法來執行相關子查詢,而不需要實際執行101次查詢。)

in的執行過程如下:

1.首先執行子查詢,獲取子結果集

2.主查詢再去結果集裡去找符合要求的字段列表,.符合要求的輸出,反之則不輸出。

3.區別

3.1 in和exists

in是把外表和內錶作hash 連線,而exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。一直以來認為exists比in效率高的說法是不準確的。

如果查詢的兩個表大小相當,那麼用in和exists差別不大。如果兩個表中乙個較小,乙個是大表,則子查詢表大的用exists,子查詢錶小的用in

例如:表a(小表),表b(大表):

select*fromawhereccin(selectccfromb)

效率低,用到了a表上cc列的索引;

select*fromawhereexists(selectccfrombwherecc=a.cc)

效率高,用到了b表上cc列的索引。

相反的:

select*frombwhereccin(selectccfroma)

效率高,用到了b表上cc列的索引;

select*frombwhereexists(selectccfromawherecc=b.cc)

效率低,用到了a表上cc列的索引。

3.2notinnotexists

notinnotexists如果查詢語句使用了notin那麼內外表都進行全表掃瞄,沒有用到索引;而notextsts 的子查詢依然能用到表上的索引。所以無論那個表大,用notexists都比notin要快。

3.3 in與 = 的區別

selectnamefromstudentwherenamein('a','s','d','f');

selectnamefromstudentwherename='a'orname='s'orname='d'orname='f'

的結果是相同的。

MySQL高階之in和exists

in是把外表和內錶作hash連線,而exists是對外表作loop迴圈,每次loop迴圈一次對內表進行一次查詢。如果查詢的兩個表大小相當,那麼用in和exists差別不大 如果兩個表中乙個較小乙個較大,則子查詢表大的用exists,子查詢錶小的用in 注意 a表與b表的id欄位應建立索引 selec...

mysql之exists子查詢和in查詢的對比

exists和not exists對應 in 和not in 不同在於,在select 查詢中,exists和in的執行順序不同。sql mysql select from category id c name 1 ios 2 android 3 sb 3 rows in set 商品表 www.2...

MySql中in和exists效率

詳見 mysql中的in語句是把外表和內錶作hash 連線,而exists語句是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。一直大家都認為exists比in語句的效率要高,這種說法其實是不準確的。這個是要區分環境的。如果查詢的兩個表大小相當,那麼用in和exists差別不大。如果兩個表中...