MySQL 中 EXISTS 的用法


在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 的語句執行。執行的結果當然就是一樣的了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM