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
*
from
a
where
cc
in
(
select
cc
from
b)
效率低,用到了a表上cc列的索引;
select
*
from
a
where
exists(
select
cc
from
b
where
cc=a.cc)
效率高,用到了b表上cc列的索引。
相反的:
select
*
from
b
where
cc
in
(
select
cc
from
a)
效率高,用到了b表上cc列的索引;
select
*
from
b
where
exists(
select
cc
from
a
where
cc=b.cc)
效率低,用到了a表上cc列的索引。
3.2not
in和
not
exists
not
in和
not
exists如果查詢語句使用了
not
in
那麼內外表都進行全表掃瞄,沒有用到索引;而
not
extsts 的子查詢依然能用到表上的索引。所以無論那個表大,用
not
exists都比
not
in要快。
3.3 in
與 = 的區別
select
name
from
student
where
name
in
(
'a'
,
's'
,
'd'
,
'f'
);
與
select
name
from
student
where
name
=
'a'
or
name
=
's'
or
name
=
'd'
or
name
=
'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差別不大。如果兩個表中...