知识卡片

SQL四种显式JOIN写法的实践建议

操作参考卡

内容

SQL的JOIN关键字可以表达4种细微但重要的不同结构:(1)t1 NATURAL JOIN t2—— 基于全部公共列自动匹配,逻辑等价于第3种写法且USING列表就是t1、t2全部公共列 (按在t1中出现的顺序);(2)t1 JOIN t2 ON bx——逻辑等价于 SELECT * FROM t1,t2 WHERE bx,只要t1、t2有公共列,结果就必然带重复列名; (3)t1 JOIN t2 USING(c1,...,cn)——逻辑等价于第2种写法、把bx写成 t1.c1=t2.c1 AND ...,区别是结果里c1到cn只出现一次,且列的排列顺序变成”先 c1到cn,再t1剩余列,再t2剩余列”;(4)t1 CROSS JOIN t2——逻辑等价于 SELECT * FROM t1,t2(无条件的积)。实践建议按写法对应:优先用NATURAL JOIN (前提是确认同名列类型一致,通常也是最简洁的写法,但要留意注释类列如果命名 不规范会导致NATURAL JOIN产生意外结果);尽量避免ON写法(除非表间本来就没有 公共列,否则结果必然带重名列,若确实要用不等值连接这类必须用ON的场景,一定 要确认同名列类型一致并做好重命名,同时警惕如果存在更简洁的等价写法却仍选择 ON写法就说不通了);用USING时确保同名列类型一致;用CROSS JOIN时确保两表确实 没有同名列。另外要注意,显式JOIN调用在SQL里既不能作为独立(最外层)的表表达式, 也不能作为子查询里的表表达式使用,这是SQL语法上的一处限制。

参考来源

- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第6章"SQL和关系代数 I:原始运算符"6.5节"连接"(源文件:OEBPS/text00064.html) - 结论依据:原文明确列出4种情况的定义及等价关系,并给出建议"相对于其他连接 方法,优先使用第1种情况(NATURAL JOIN)……避免第2种情况(JOIN ON),因为它 肯定会产生具有重复列名的结果……第3种情况,确保同名列属于相同的类型……第4种 情况,确保不存在同名列……显式的JOIN调用在SQL中既不能作为'独立'的表表达式 存在,也不能作为构成子查询的表表达式存在"。 - 原始内容:相对于其他连接方法,优先使用第1种情况(NATURAL JOIN)……避免第2 种情况(JOIN ON),因为它肯定会产生具有重复列名的结果……显式的JOIN调用在 SQL中既不能作为"独立"的表表达式存在,也不能作为构成子查询的表表达式存在。