在SQL中使用ON子句和using子句之间的区别

use*_*398 13 sql oracle join

我正在做一些与oracle中的连接相关的任务.在某些时候我坚持了,即USING和ON子句之间的区别是什么.

我知道使用ON子句我们可以加入无限的表.是否可以使用USING子句加入无限制的表?如何?你能用例子解释一下吗?

gdo*_*ica 29

  • USING条款:允许您指定名称的连接键.

  • ON子句:此语法允许您加入主键指定的列名这两个表.

USING子句

如果多个列共享相同的名称但您不想使用所有这些公共列进行连接,则使用USING子句.USING子句中列出的列在语句中不能包含任何限定符,包括WHERE子句:

ON条款

ON子句用于连接两个表中列名不匹配的表.从WHERE子句中的过滤条件中删除连接条件:

神谕

select department_name, city
from departments
JOIN locations
USING (location_id); -- specify the same column name 
                     -- for both of the tables for the join
select department_name, city
from departments dept
join locations loc
on (dept.location_id = loc.id); -- specify different column name 
                                -- for the tables for the join.
Run Code Online (Sandbox Code Playgroud)


Bob*_*ica 11

除了上面的答案之外,一个重要的区别是ON子句分别保留每个连接表中的列,USING子句将连接表中的列合并为一个列.例如,如果您希望仅在其中一个连接表中不存在匹配的行时保留结果集中的行,这可能很重要.为此,您通常使用OUTER JOIN以及WHERE子句中的条件,例如

SELECT t1.*
  FROM TABLE_1 t1
  LEFT OUTER JOIN TABLE_2 t2
    ON (t2.KEY_FIELD = t1.KEY_FIELD)
  WHERE t2.KEY_FIELD IS NULL
Run Code Online (Sandbox Code Playgroud)

在这种情况下,假设TABLE_2.KEY_FIELD是TABLE_2上主键的一部分,因此如果TABLE_2中实际存在数据,则永远不能为NULL.如果在上面的连接之后,发现TABLE_2.KEY_FIELD在连接集中包含NULL,则意味着没有找到TABLE_2行来匹配相应的TABLE_1行.这有时可能很有用.

分享和享受.


Asi*_*taq 6

对上述答案的补充。

using 子句将只打印一次加入的列。

A.id  B.id
1      1
2      2
3      3
Run Code Online (Sandbox Code Playgroud)

Select * from A JOIN B using(id);

输出将是

id
1
2
3
Run Code Online (Sandbox Code Playgroud)

但在 On 子句中

Select * from A JOIN B on A.id=B.id;

输出将。

id     id
1      1
2      2
3      3
Run Code Online (Sandbox Code Playgroud)