今天又隨手刷了一道Leetcode的197題,此題難點主要在於比較兩個日期值 DATEDIFF() 函數的使用,如果你很熟悉這個函數,那麼這題對你來說就很簡單了!
不過掌櫃在解完此題後習慣性地看看別人的解法,因爲總有厲害的朋友在下面給出驚喜😀。於是又發現了一個細小的點:
即使用INNER JOIN(或JOIN)、CROSS JOIN和使用逗號(,)來連接兩表/多表到底有什麼區別?
又開始翻閱查詢,在MySQL 8.0的官網看到這麼一段話:
翻譯一下這裏(如果有錯誤,請諒解並提出來):
INNER JOIN 和 ,(逗號)在沒有連接條件的情況下語義上是相等的,即在指定的表格之間是進行一個笛卡爾積連接(也就是第一張表的每行都會連接第二張表的每行)。
但是,比起INNER JOIN, CROSS JOIN, LEFT JOIN等,逗號運算符的優先級更低。 如果在有連接條件的情況下,混合逗號和其他JOIN類型使用,表格就可能會報錯如下:
“ Unknown column ‘col_name’ in ‘on clause’ ”。
然後掌櫃又往上翻了一下,又看到這麼一段話:
👆這是在說:如果在有table_reference(這裏指的是👉連接表達式)的情況下,使用逗號來連接每個表格是被認作等價於內聯操作,而這是一種保守的擴展方式。接着給出了示例,最後又說在MySQL中,JOIN、CROSS JOIN和INNER JOIN三者在句法上是等價的(可互相替換);但是在標準的SQL中,他們不相等!因爲使用INNER JOIN後面要跟着ON+查詢條件,否則就要使用CROSS JOIN。
接着掌櫃寫了個簡單的例子來實驗一下三者的實際連接情況和查詢效率:
(t3表有i3=1,j3=1;t4表有i4=1,j4=2;t5表有i5=1,j5=3)
結果發現:使用逗號連接的效率確實低於其他JOIN連接。
所以從上面這兩段話和實際測試來看,在MySQL中,
三者共同點:
- 都是進行的內聯;
- 無連接條件情況下查詢,單獨使用其中某一個其實並無差別。
不同點:
- 一般情況,INNER JOIN /JOIN 要搭配ON 一起使用;CROSS JOIN 、逗號則搭配WHERE條件查詢。
- 有連接條件的情況下查詢,使用INNER JOIN /JOIN /CROSS JOIN 的效率會優於逗號連接。
- 其次,混合多表連接的時候,逗號的運算優先級低於CROSS JOIN和INNER JOIN,這個要多加註意了!!!
PS:上面第一段文字最後說報錯,但是處理方法寫在後面,於是掌櫃拉到下面一看發現這個示例:
它形象的解釋了爲什麼會報錯“Unknown column ‘col_name’ in ‘on clause’”,接着給出瞭解決的辦法。
第一種解決辦法就是用括號括起來 逗號連接的兩個表格作爲一個整體,這樣就只是一個JOIN…ON的操作;
第二種則是儘量用JOIN來代替逗號運算符。
PPS: 最後再次提示,混合逗號和其他JOIN操作的語句,其他JOIN(指 INNER JOIN, CROSS JOIN, LEFT JOIN 和RIGHT JOIN)的運算優先級都是高於逗號的!!!
至於爲啥JOIN系列的連接 運算優先級都優於逗號呢??? 其實這都是SQL標準規定的,因爲這樣具有更高的可讀性。
參考資料:
MySQL官網