一般情況,我們作左連接 select * from A left join B on A.id=B.a_id;一定認為A就是主表,其實還有另外的情況,我們若將sql改寫成 select * from A left join B on on A.id=B.a_id where B.id<cont(常數)。此時B表就作為連接的主表了。具體示例見下:
新建表 A
新建表B
1.查詢sql
SELECT * FROM A a LEFT JOIN B b ON a.category_id = b.id where b.id<8;此時查看查詢計划,顯示 b表為主表
解釋:where v.id<8,篩選出了更小的表B,所以按照left join 小表驅動大表的原則,此時把B表作為主表也不足為奇了。
2.查詢sql
SELECT * FROM A a LEFT JOIN B b ON a.category_id = b.id where b.id<16;此時查看查詢計划,顯示 a表為主表
解釋:where v.id<16,篩選出了的表B有15條>A(里面14條),所以按照left join 小表驅動大表的原則,此時把A表作為主表了。
3.查詢sql
1)SELECT * FROM A a LEFT JOIN B b ON a.category_id = b.id where b.id<14;此時查看查詢計划,顯示 a表為主表
2)SELECT * FROM A a LEFT JOIN B b ON a.category_id = b.id where b.id<=14;此時查看查詢計划,顯示 a表為主表
按照我們前面說的小表驅動大表,此時where where b.id<14或者 where where b.id<=14,B表的條數為13或14(A表14條沒變),但此時都是以A 。
說明:在2表的連接時候相等記錄條數時候有點小bug,具體原因待解決。。。。