MySQL使用exists優化in查詢

2021-08-17 05:23:25 字數 1997 閱讀 7136

mysql 優化時,總是說在某些情況下要用 exists 代替 in,下面我會介紹一下,exists 替換 in 時需要注意的問題。

1、建立表結構

# 使用者資訊表

create

table

`user_info` (

`id`

char (36) not

null,

`name`

varchar (20) not

null,

`age`

int (11) default

null,

primary

key (`id`)

) engine = innodb default charset = utf8;

# 使用者手機表,user_phone 中的 user_id 引用 user_info 的 id

create

table

`user_phone` (

`id`

char (36) not

null,

`phone`

varchar (20) not

null,

`user_id`

char (36) not

null,

primary

key (`id`)

) engine = innodb default charset = utf8;

2、插入資料

insert

into user_info values (uuid(), '德萊文', 18), ( uuid(), '德瑪西亞-蓋倫', 18 ), ( uuid(), '暗夜獵手-vn', 18 );

insert

into user_phone values ( uuid(), '88888888888', '1e6a01e7-2b23-11e8-9145-4ccc6a75479b' );

3、查詢測試

注意:兩次查詢結果不一樣,仔細對比上面兩條 sql 語句,第一條中的 where 語句後面指定了兩次查詢時的關聯條件 ui.id in ,第二條的 where 語句後面直接跟了 exists ,並沒有指定關聯條件,因此第二條語句 where 後面的語句無論是真是假,都不影響主查詢的結果。我們需要在 exists 後的查詢中新增關聯條件!

MySQL中exists與in的使用

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

MySQL中exists與in的使用

總結 當涉及到外表和子查詢時,要考慮到exists和in 的選擇 exists的子句是乙個boolean條件,這個子句當能返回結果集則為true,不能返回結果集則為 false,子句為真所的記錄會被加入結果集,子句為假所的記錄被拋棄結果集為空 in查詢相當於多個or條件的疊加,in查詢就是先將子查詢...

mysql中exists與in的使用

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