小表驅動大表:
寫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...