今天又随手刷了一道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官网