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

sql中ON子句和using子句的区别,sql,oracle,join,Sql,Oracle,Join,我正在做一些与oracle中的联接相关的作业。 在某一点上我结巴了,即使用和ON子句有什么区别 我知道使用ON子句我们可以连接无限的表。 是否可以使用using子句连接无限表?如何连接? 你能举例说明一下吗。 USING子句:允许您按名称指定连接键 ON子句:此语法允许您在两个表中指定联接键的列名 使用子句 如果多个列共享相同的名称,但您不想使用所有这些公共列进行联接,则使用USING子句。USING子句中列出的列在语句中不能有任何限定符,包括WHERE子句: ON子句 ON子句用于联接两个表

我正在做一些与oracle中的联接相关的作业。 在某一点上我结巴了,即使用和ON子句有什么区别

我知道使用ON子句我们可以连接无限的表。 是否可以使用using子句连接无限表?如何连接? 你能举例说明一下吗。

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

  • ON
    子句:此语法允许您在两个表中指定联接键的列名

使用子句

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

ON子句

ON子句用于联接两个表中列名不匹配的表。连接条件将从WHERE子句中的筛选条件中删除:

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

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);

除了上面的答案之外,一个重要的区别是ON子句分别保留每个联接表中的列,USING子句将联接表中的列合并到单个列中。例如,如果仅当其中一个联接表中不存在匹配行时,才希望在结果集中保留行,则这一点非常重要。为此,您通常会在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_字段是TABLE_2上主键的一部分,因此如果数据实际存在于TABLE_2中,则该字段永远不能为NULL。如果在上述联接之后,在联接集中发现TABLE_2.KEY_字段包含NULL,则表示未找到与相应TABLE_1行匹配的TABLE_2行。这有时是有用的

分享和享受

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
子句:允许按名称指定连接键


上的
允许为两个表中的联接键指定列名。

以上答案的补充

使用
子句将只打印一次连接的列

A.id  B.id
1      1
2      2
3      3
使用(id)从连接B中选择*

输出将是

id
1
2
3
但在On条款中

从A.id=B.id上的连接B中选择*

输出将为

id     id
1      1
2      2
3      3

使用
子句:

SELECT * FROM COUNTRIES JOIN CITIES USING (COUNTRY)
SELECT * FROM COUNTRIES JOIN CITIES ON (COUNTRIES.COUNTRY = CITIES.COUNTRY)
上述查询在
COUNTRIES.COUNTRY
等于
CITIES.COUNTRY
的条件下,在
COUNTRIES
表和
CITIES
表之间执行内部联接

关于
条款:

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

上面的查询使用on子句执行内部联接操作。

on
子句和
using
子句执行相同的工作,但如果列名相同,则转到
using
子句。否则,如果列名称不相同,请在
子句中选择

我不同意@MaximKrizhanovsky的观点,并说文档非常不清楚。这并不是说它们是否相等或者有什么不同。你只回答了一半的问题。这个答案并不清楚。另外,请使用标准标点符号。我对Oracle SQL的评论是错误的,尽管对标准SQL的评论是正确的。我的意思是,
select*fromxjoiny使用(c1,…)
不能等于
select*fromxjoiny在x.c1=y.c1和…
,因为它的列较少&所以你的“差异是”不正确,尽管“差异是”是正确的。但是在Oracle SQL中,在SELECT中处理
*
&undotted USING列的方式仍然存在差异。你的那句话也不清楚。并不是说这个问题想问什么很清楚。