mybatis exists 和in 的效率比較

2021-09-13 15:45:45 字數 1136 閱讀 7659

這條語句適用於a錶比b表大的情況

select * from ecs_goods a where cat_id in(select cat_id from ecs_category);

這條語句適用於b錶比a表大的情況

select * from ecs_goods a where exists(select cat_id from ecs_category b where a.cat_id = b.cat_id);

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

i 和i 的用法

式1的運算過程 第一步,第乙個 i計算後i 1,i計算的結果為1 第二步,然後就是i 的計算後i的值不變仍為1,i 的計算結果為1 第三步,接著計算前一步驟中i 自增後的值,此時i 2,再就是第二i 的計算,i的值不變仍是2,所以這一步中i 的計算結果為2 第四步,同上一步計算前一步驟中i 自增後的...

i和i 的區別

大家都應該知道i 和 i的區別,前者是先使用i的值,然後再增加1,而後者是先增加1然後再使用i的值。但是i 和 i那個更好呢?我們實現角度來看 前者是將i值加1後賦給i,然後返回i本身 而後者是先用個臨時變數儲存i值,然後將i值加1賦給i,然後返回臨時變數的值。內建資料型別他們的效率差不多,看他們的...

i 和 i 的輸出

include include include int main int argc,const char argv 輸出結果為 3 3 3 1 0 0 在vs中 printf輸出時,從輸出表示式右到左計算,然後從右到左入棧,再出棧 vs中的彙編下的 5 int main int argc,const...