MySQL中inner join 和 cross join 的區別?
01-13
我用的MySQL 5.6
只要使用相同的參數(同時使用on,或同時不使用),這兩個命令並無區別。在網上看到很多人說,inner join 是取交集,而cross join是生成一個M*N項的笛卡爾積那是因為他們的語句都在inner join 後面加了一個on tableA.x = tableB.x,
如果我在cross join 後面加上on tableA.x = tableB.x得到的同樣是一樣的結果啊?
cross join就是不加條件限制,inner join的on還是加了條件限制的
cross join是笛卡爾積,理論上不應該支持on語法,但是MySQL在這方面做的比較奇怪。總共有五種join:cross,outer full,outer left,outer right和inner。除了cross之外都支持on語法。
是MySQL獨有的容錯寫法,有join condition時cross會被忽略。按照ANSI是沒有這種寫法的
join的方式不同,cross join生成的是先生成笛卡爾集,然後on連接條件被視為了filter用於數據過濾,inner join是直接基於join condition做連接,生成的join集合就是最終的輸出結果,產生的中間數據更小。實際上MySQL優化器會將這兩條查詢都優化成同一種join方式,比如merge join或者nested loop join,如果你沒有開啟對應的優化參數,那麼MySQL只有傻傻的去按指定的方式去做join
這篇文章寫得很好,圖文並茂,英文的MySQL CROSS JOIN覺得好給點個贊啊.
cross join 產生的是笛卡爾集,也就是 M*N 的集合,inner join 是內聯查詢,不是產生笛卡爾集。
當然 cross join 也可以 這麼用:select a.xx,b.xx from a cross join b where a.id=b.id 之類的。
不過為何mysql這裡會出現這種情況,那就應該是mysql「獨有」的東西了,嗯!一定是這樣。。。!!在MySQL中,CROSS JOIN語法上等價於INNER JOIN (它們可以彼此代替。在標準SQL中,它們不等價。INNER JOIN結合ON子句使用;CROSS JOIN 用於其它地方)。
參考自:MySQL如何優化嵌套Join(一)mysql中inner join 和cross join兩者相同,可以相互替代
推薦閱讀:
※mysql如何解決評論遞歸查詢?
※MySQL 和 PostgreSQL 相比,對 JSON 的支持如何?
※SQL中 LEFT JOIN ON 條件的效率高低比較?
※為什麼php在向mysql提交數據時變數外要用單引號?
※SQL Server 與 MySQL 性能相差多大?