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

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

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

【问题讨论】:

标签: sql oracle join


【解决方案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 子句。

          【讨论】:

          • 这个答案不清楚。也请使用标准标点符号。
          猜你喜欢
          • 2012-10-19
          • 1970-01-01
          • 2012-05-27
          • 2012-01-08
          • 2011-10-25
          • 2016-07-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多