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

时间:2012-05-03 13:11:00

标签: sql oracle join

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

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

7 个答案:

答案 0 :(得分:26)

  • 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.

答案 1 :(得分:10)

除了上面的答案之外,一个重要的区别是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。如果在上面的连接之后,发现TABLE_2.KEY_FIELD在连接集中包含NULL,则意味着没有找到TABLE_2行来匹配相应的TABLE_1行。这有时很有用。

分享并享受。

答案 2 :(得分:3)

除上述答案之外。

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

答案 3 :(得分: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);

答案 4 :(得分:0)

USING条款:

SELECT * FROM COUNTRIES JOIN CITIES USING (COUNTRY)

COUNTRIES等于CITIES

的条件下,上述查询在COUNTRIES.COUNTRY表和CITIES.COUNTRY表之间执行内部联接

ON条款:

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

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

答案 5 :(得分:-1)

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

答案 6 :(得分:-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子句:这允许按名称指定连接键。

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