在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 有 {'john','peter','baron'} 這些,而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 的語句執行。執行的結果當然就是一樣的了。
