mysql中的in與exists區別

2021-10-01 03:43:22 字數 3090 閱讀 5838

建立兩張表並為其新增一些資料

一張會員表,一張會員下單表。

會員表資料

iduser

email

1abei

[email protected]

[email protected]

3liuhuan

[email protected]

訂單表id

user_id

create_time

...1

11489579802

...2

21489579802

...3

11489579802

...4

31489579802

...5

21489579802

...6

11489579802

...我們將用這兩張表做演示。

exists表示存在,它常常和子查詢配合使用,例如下面的sql語句 

select * 

from

`user`

where

exists (

select *

from

`order`

where user.id = order.user_id)

exists用於檢查子查詢是否至少會返回一行資料,該子查詢實際上並不返回任何資料,而是返回值truefalse

當子查詢返回為真時,則外層查詢語句將進行查詢。

當子查詢返回為假時,外層查詢語句將不進行查詢或者查詢不出任何記錄。

因此上面的sql語句旨在搜尋出所有下過單的會員。需要注意的是,當我們的子查詢為 select null 時,mysql仍然認為它是true

是的,其實上面的例子,in這貨也能完成,如下面sql語句

select * 

from

`user`

where

idin (

select user_id

from

`order`)

那麼!in和exists到底有啥區別那,要什麼時候用in,什麼時候用exists那?接下來阿北一一教你。

我們先記住口訣再說細節!「外層查詢表小於子查詢表,則用exists,外層查詢表大於子查詢表,則用in,如果外層和子查詢表差不多,則愛用哪個用哪個。」

in關鍵字原理

select * 

from

`user`

where

idin (

select user_id

from

`order`)

in()語句只會執行一次,它查出order表中的所有user_id欄位並且快取起來,之後,檢查user表的id是否和order表中的user_id相當,如果相等則加入結果期,直到遍歷完user的所有記錄。

in的查詢過程類似於以下過程

$result = ;

$users = "

select *

from

`user`

";

$orders = "

select user_id

from

`order`

";

for($i = 0;$i < $users.length;$i++)}}

我想你已經看出來了,當order表資料很大的時候不適合用in,因為它最多會將order表資料全部遍歷一次。

如:user表有10000條記錄,order表有1000000條記錄,那麼最多有可能遍歷10000*1000000次,效率很差.

再如:user表有10000條記錄,order表有100條記錄,那麼最多有可能遍歷10000*100次,遍歷次數大大減少,效率大大提公升.

exists關鍵字原理

select * 

from

`user`

where

exists (

select *

from

`order`

where user.id = order.user_id)

在這裡,exists語句會執行user.length次,它並不會去快取exists的結果集,因為這個結果集並不重要,你只需要返回真假即可。

exists的查詢過程類似於以下過程

$result = ;

$users = "

select *

from

`user`

";

for($i=0;$i

}

你看到了吧,當order錶比user表大很多的時候,使用exists是再恰當不過了,它沒有那麼多遍歷操作,只需要再執行一次查詢就行。

如:user表有10000條記錄,order表有1000000條記錄,那麼exists()會執行10000次去判斷user表中的id是否與order表中的user_id相等.

如:user表有10000條記錄,order表有100000000條記錄,那麼exists()還是執行10000次,因為它只執行user.length次,可見b表資料越多,越適合exists()發揮效果.

但是:user表有10000條記錄,order表有100條記錄,那麼exists()還是執行10000次,還不如使用in()遍歷10000*100次,因為in()是在記憶體裡遍歷,而exists()需要查詢資料庫,我們都知道查詢資料庫所消耗的效能更高,而記憶體比較很快.

因此我們只需要記住口訣:「外層查詢表小於子查詢表,則用exists,外層查詢表大於子查詢表,則用in,如果外層和子查詢表差不多,則愛用哪個用哪個。」

sql中exist與in的區別

in 和 exists也是很好區別的.in 是乙個集合運算子.a in 這個運算中,前面是乙個元素,後面是乙個集合,集合中的元素型別是和前面的元素一樣的.而exists是乙個存在判斷,如果後面的查詢中有結果,則exists為真,否則為假.in 運算用在語句中,它後面帶的select 一定是選乙個字段...

sql中exist與in的區別

in 和 exists也是很好區別的.in 是乙個集合運算子.a in 這個運算中,前面是乙個元素,後面是乙個集合,集合中的元素型別是和前面的元素一樣的.而exists是乙個存在判斷,如果後面的查詢中有結果,則exists為真,否則為假.in 運算用在語句中,它後面帶的select 一定是選乙個字段...

sql中exist與in 的區別

in 和 exists也是很好區別的.in 是乙個集合運算子.a in 這個運算中,前面是乙個元素,後面是乙個集合,集合中的元素型別是和前面的元素一樣的.而exists是乙個存在判斷,如果後面的查詢中有結果,則exists為真,否則為假.in 運算用在語句中,它後面帶的select 一定是選乙個字段...