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