您可能已经意识到这种区别,但是从文档中:
ON条件使用该ON
子句指定连接条件。WHERE
这样做可以让您指定与子句中的任何搜索或过滤条件分开的连接条件。
USING ( column )当您指定两个表中具有相同名称的列的等值连接时,该USING column
子句指示要使用的列。仅当两个表中的连接列具有相同名称时,才能使用此子句。在此子句中,不要使用表名或表别名来限定列名。
所以这些是等价的:
select e.ename, d.dname
from emp e join dept d using (deptno);
select e.ename, d.dname
from emp e join dept d on d.deptno = e.deptno;
在很大程度上,您使用的是样式问题,但是(至少)有两种情况您不能使用using
:(a)当两个表中的列名不同时,以及(b)当你想使用加入列:
select e.ename, d.dname, d.deptno
from emp e join dept d using(deptno);
select e.ename, d.dname, d.deptno
*
ERROR at line 1:
ORA-25154: column part of USING clause cannot have qualifier
您当然可以省略限定符 and select ..., deptno
,只要您没有另一个表具有未使用它连接的同一列:
select e.ename, d.dname, deptno
from emp e join dept d using (deptno) join mytab m using (empno);
select e.ename, d.dname, deptno
*
ERROR at line 1:
ORA-00918: column ambiguously defined
在这种情况下,您只能选择合格的m.deptno
. (好吧,这是相当做作的......)。
我可以看到避免的主要原因using
只是一致性。由于您有时无法使用它,因此偶尔切换到on
这些情况可能会有点刺耳。但同样,这更多的是关于风格,而不是任何深层的技术原因。
也许您的同事只是在强加(或建议)编码标准,但只有他们知道。如果您被要求更改您编写的一些正在审核的新代码或旧代码,也不是很清楚。如果是后者,那么无论他们偏爱的原因是什么on
,我认为您需要获得单独的理由来修改经过验证的代码,因为即使重新测试修改后的代码也存在引入新问题的风险——除了成本之外/努力参与返工和重新测试。
不过,有几件事让我对你的问题感到震惊。首先,您将on
语法描述为“老式”,但我认为这不公平 - 两者都是有效的和最新的(我认为从 SQL:2011 开始,但需要引用!)。和这个:
生成更简洁的结果集,没有不必要的重复列。
...我认为建议您使用select *
,否则您只需选择其中一个值,尽管限定符有几个额外的字符。对于临时查询和某些子查询以外的任何内容,使用select *
通常被认为是不好的做法(例如此处)。