Mysql中Join用法及優化
阿新 • • 發佈:2018-12-03
Join的幾種型別
笛卡爾積(交叉連線)
如果A表有n條記錄,B表有m條記錄,笛卡爾積產生的結果就會產生n*m條記錄。
在MySQL中可以為CROSS JOIN或者省略CROSS即JOIN
如
SELECT * FROM table1 CROSS JOIN table2
SELECT * FROM table1 JOIN table2
不用on table1.key1 = table2.key2 得出的結果是table1的記錄數*table2的記錄數,如果用on連線,得出的和inner join的結果一樣(所以在有on的情況下,inner joijn、cross join、 join(推薦、會自動用小的表作為驅動表)結果一樣 )。
內連線:INNER JOIN
內連線INNER JOIN是最常用的連線操作。從數學的角度講就是求兩個表的交集,從笛卡爾積的角度講就是從笛卡爾積中挑出ON子句條件成立的記錄。有INNER JOIN,WHERE(等值連線),STRAIGHT_JOIN,JOIN(省略INNER)四種寫法。
左【外】連線:LEFT [out] JOIN
左連線LEFT JOIN的含義就是求兩個表的交集外加左表剩下的資料。依舊從笛卡爾積的角度講,就是先從笛卡爾積中挑出ON子句條件成立的記錄,然後加上左表中剩餘的記錄(見最後三條)。
右【外】連線:RIGHT [out] JOIN
同理右連線RIGHT JOIN就是求兩個表的交集外加右表剩下的資料。再次從笛卡爾積的角度描述,右連線就是從笛卡爾積中挑出ON子句條件成立的記錄,然後加上右表中剩餘的記錄(見最後一條)。
全外連線:Full outer join
產生A和B的並集。對於沒有匹配的記錄,則以null做為值。查詢存在於一張表不存在於另一張表的sql
select ta.* from ta where ta.id not in(select tb.id from tb) /*效率低*/ select ta.id from ta left join tb on ta.id=tb.id where tb.id is NULL /*優化*/