建立兩張表並為其新增一些資料
一張會員表,一張會員下單表。
會員表資料
iduser
1abei
3liuhuan
訂單表id
user_id
create_time
...1
11489579802
...2
21489579802
...3
11489579802
...4
31489579802
...5
21489579802
...6
11489579802
...我們將用這兩張表做演示。
exists表示存在,它常常和子查詢配合使用,例如下面的sql語句
exists用於檢查子查詢是否至少會返回一行資料,該子查詢實際上並不返回任何資料,而是返回值true或false。select *
from
`user`
where
exists (
select *
from
`order`
where user.id = order.user_id)
當子查詢返回為真時,則外層查詢語句將進行查詢。
當子查詢返回為假時,外層查詢語句將不進行查詢或者查詢不出任何記錄。
因此上面的sql語句旨在搜尋出所有下過單的會員。需要注意的是,當我們的子查詢為 select null 時,mysql仍然認為它是true。
是的,其實上面的例子,in這貨也能完成,如下面sql語句
那麼!in和exists到底有啥區別那,要什麼時候用in,什麼時候用exists那?接下來阿北一一教你。select *
from
`user`
where
idin (
select user_id
from
`order`)
我們先記住口訣再說細節!「外層查詢表小於子查詢表,則用exists,外層查詢表大於子查詢表,則用in,如果外層和子查詢表差不多,則愛用哪個用哪個。」
in關鍵字原理
in()語句只會執行一次,它查出order表中的所有user_id欄位並且快取起來,之後,檢查user表的id是否和order表中的user_id相當,如果相等則加入結果期,直到遍歷完user的所有記錄。select *
from
`user`
where
idin (
select user_id
from
`order`)
in的查詢過程類似於以下過程
我想你已經看出來了,當order表資料很大的時候不適合用in,因為它最多會將order表資料全部遍歷一次。$result = ;
$users = "
select *
from
`user`
";
$orders = "
select user_id
from
`order`
";
for($i = 0;$i < $users.length;$i++)}}
如:user表有10000條記錄,order表有1000000條記錄,那麼最多有可能遍歷10000*1000000次,效率很差.
再如:user表有10000條記錄,order表有100條記錄,那麼最多有可能遍歷10000*100次,遍歷次數大大減少,效率大大提公升.
exists關鍵字原理
在這裡,exists語句會執行user.length次,它並不會去快取exists的結果集,因為這個結果集並不重要,你只需要返回真假即可。select *
from
`user`
where
exists (
select *
from
`order`
where user.id = order.user_id)
exists的查詢過程類似於以下過程
你看到了吧,當order錶比user表大很多的時候,使用exists是再恰當不過了,它沒有那麼多遍歷操作,只需要再執行一次查詢就行。$result = ;
$users = "
select *
from
`user`
";
for($i=0;$i
}
如: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 一定是選乙個字段...