MYSQL中exists的用法

2021-10-07 15:29:39 字數 897 閱讀 3158

在mysql中 exists 和 in 的用法有什麼關係和區別呢?

假定資料庫中有兩個表 分別為 表 a 和表 b

create table a

a_id int,

a_name varchar(20)

create table b

b_id int,

b_name varchar(20)

那麼

select * from a where a_name in (select b_name from b)

這條sql語句的意義很明顯是選取滿足where條件下 a 中的所有列的資料 。而where條件就是a_name要是所有b_name的其中的乙個。

即 假設 b 中的 b_name 有 這些,而a中的某條資料中的a_name恰好是其中乙個,那麼這行資料就會被選取出來。

而使用exists:

select * from a where exists (select b_id from b where b.b_name=a.a_name)
執行的結果與上面使用 in 返回的結果是一樣的。

那麼為什麼會這樣呢,子查詢中 返回的列是 b_id ,並沒有 name啊。

原因就是exists子句返回的結果並不是從資料庫中取出的結果集,而是乙個布林值,如果子句查詢到資料,那麼返回true,反之返回false。

所以子句中選擇的列根本就不重要,而重要的是where 後的條件。如果返回了true,那麼相當於直接執行了子句 where 後的部分,即把

a_name 和 b_name 作比較,如果相等則返回這條資料。所以執行的結果和前面使用 in 的返回的結果是一致的。

有趣的是,mysql內部優化器會把第一條使用 in 的語句轉化為第二條使用 exists 的語句執行。執行的結果當然就是一樣的了。

MySQL中IN和EXISTS的用法

exists對外表用loop逐條查詢,每次查詢都會檢視exists的條件語句,當 exists裡的條件語句能夠返回記錄行時 無論記錄行是的多少,只要能返回 條件就為真,返回當前loop到的這條記錄,反之如果exists裡的條 件語句不能返回記錄行,則當前loop到的這條記錄被丟棄,exists的條件...

mysql中EXISTS與IN用法比較

1 使用方式 1 exists用法 上面這條sql的意思就是 以ucsc project batch為主表查詢batchname與projectid欄位,其中projectid欄位存在於ucsc project表中。exists 會對外表ucsc project batch進行迴圈查詢匹配,它不在乎...

mysql中EXISTS與IN用法比較

1 使用方式 1 exists用法 select a.batchname,a.projectid from ucsc project batch a where exists select b.id from ucsc project b where a.projectid b.id 上面這條sql...