sql中ON子句和using子句的区别

Posted

技术标签:

【中文标题】sql中ON子句和using子句的区别【英文标题】:difference between ON Clause and using clause in sql 【发布时间】:2012-05-13 00:15:54 【问题描述】:

我正在做一些与加入 oracle 相关的任务。 在某些时候我卡住了,即 USING 和 ON 子句有什么区别。

我知道使用 ON 子句我们可以连接无限的表。 是否可以使用 USING 子句连接无限表?如何? 能不能用例子来解释一下。

【问题讨论】:

The documentation is pretty good 我不同意@MaximKrizhanovsky 并说文档很不清楚。它没有说明它们是否相同或存在什么差异。 【参考方案1】:

USING 子句:这允许您按名称指定连接键。

ON 子句:此语法允许您为两个表中的连接键指定列名。

USING 子句

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

ON 子句

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

Oracle

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.

【讨论】:

【参考方案2】:

两者都允许加入“无限”表。不同之处在于 USING 要求连接列具有相同的名称:

select emp.ename, dept.dname
from emp join dept using (deptno);

当连接列具有不同的名称时,ON 版本也可以工作:

select emp.ename, emp2.ename manager_name
from emp join emp emp2 on (emp.mgr = emp2.empno);

【讨论】:

我对 Oracle SQL 的评论是错误的,尽管对标准 SQL 是正确的。我的意思是select * from x join y using (c1,...) 不能等于select * from x join y on x.c1=y.c1 and ...,因为它的列更少,所以你的“区别是”是不正确的,尽管“区别是”是正确的。但是在 Oracle SQL 中,* 和未加点的 USING 列在 SELECT 中的处理方式仍然存在差异。你的那句话也不清楚。不清楚这个问题想问什么。【参考方案3】:

除了上面的答案之外,一个重要的区别是 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

在这种情况下,假设 TABLE_2.KEY_FIELD 是 TABLE_2 上主键的一部分,因此如果 TABLE_2 中实际存在数据,则永远不会为 NULL。如果在上述join之后,发现joined set中的TABLE_2.KEY_FIELD包含NULL,则表示没有找到与对应的TABLE_1行匹配的TABLE_2行。这有时很有用。

分享和享受。

【讨论】:

【参考方案4】:
SELECT s.SID, s.SNAME, a.CNAME, c.MAJOR
FROM STUDENT s JOIN COLLEGE c
ON s.SID = c.SID;

SELECT SID, s.SNAME, a.CNAME, a.MAJOR
FROM STUDENT s JOIN COLLEGE c
USING (SID);

USING 子句:这允许按名称指定连接键。

ON 允许为两个表中的连接键指定列名。

【讨论】:

你只回答了一半问题。【参考方案5】:

以上答案的补充。

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

A.id  B.id
1      1
2      2
3      3

Select * from A JOIN B using(id);

输出将是

id
1
2
3

但在 On 子句中

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

输出将是。

id     id
1      1
2      2
3      3

【讨论】:

【参考方案6】:

USING 子句:

SELECT * FROM COUNTRIES JOIN CITIES USING (COUNTRY)

上面的查询在COUNTRIES.COUNTRY等于CITIES.COUNTRY的条件下执行COUNTRIES表和CITIES表之间的内连接

ON 子句:

SELECT * FROM COUNTRIES JOIN CITIES ON (COUNTRIES.COUNTRY = CITIES.COUNTRY)

上述查询使用on子句执行内连接操作。

【讨论】:

【参考方案7】:

On 子句和 Using 子句做同样的工作,但如果列名相同,请使用 USING 子句。否则,如果列名不同,请使用ON 子句。

【讨论】:

这个答案不清楚。也请使用标准标点符号。

以上是关于sql中ON子句和using子句的区别的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 DataGrip SQL 格式化程序来对齐 USING/ON 子句

SQL中WHERE 和HAVING的区别

SQL中的关键字和子句有啥区别?

PostgreSQL 中的 SQL JOIN - WHERE 子句中的执行计划与 ON 子句中的不同

在oracle中where 子句和having子句中的区别

WITH子句和子查询的区别?