MySQL in與exists 小表驅動大表

2021-10-07 15:00:23 字數 892 閱讀 9730

小表驅動大表:

寫sql前確定幾件事:

以員工(emp)和部門(dept)為例

1、誰在外(左),誰在裡(右)(根據中文描述來判斷)

找出指定部門裡的員工:員工在外(左),部門在裡(右)

找出有員工參加的部門:部門在外(左),員工在裡(右)

2、誰大誰小(根據資料量)

當小表在裡時,使用in

當大表在裡時,使用exists

正解:

select * from tb_emp a where a.deptno in (select b.deptno from tb_dept b)

//select * from a where a.id in (select id from b);

select * from tb_dept a where exists (select 1 from tb_emp b where a.id=b.deptno) 

//select ... from table where exists (subquery) 將主查詢到的資料,放進子查詢中做條件驗證,根據結果(true/false)來決定主查詢的資料是否得以保留

//subquery: select 1或*或'x'或任何常量 from b where a.id=b.id);

下面結論都是針對in或exists的。

in後面跟的是小表,exists後面跟的是大表。

簡記:in小,exists大。

對於exists

select .....from table where exists(subquery);

可以理解為:將主查詢的資料放入子查詢中做條件驗證,根據驗證結果(true或false)來決定主查詢的資料是否得以保留。

MYSQL IN 與 EXISTS 的優化示例介紹

當b表的資料集必須小於a表的資料集時,用in優於exists,當a表的資料集系小於b表的資料集時,用exists優於in 優化原則 小表驅動大表,即小的資料集驅動大的資料集。原理 rbo select from a where id in select id from b 等價於 for selec...

MYSQL IN 與 EXISTS 的優化示例介紹

優化原則 小表驅動大表,即小的資料集驅動大的資料集。原理 rbo 程式設計客棧select from a where id in select id from b 等價於 for select id from b for select from a where a.id b.id 當b表的資料集必須...

MySQL in和exists查詢對比

外表 tablea 內錶 tableb in select from tablea where tablea.id in select a id from tableb exists select from tablea where exists select from tableb where t...