我正在做一些与加入 oracle 相关的任务。在某些情况下,我卡住了,即 USING 和 ON 子句有什么区别。
我知道使用 ON 子句我们可以加入无限的表。是否可以使用 USING 子句连接无限表?如何?你能用例子解释一下吗?
子句:这USING
允许您按名称指定连接键。
子句:此语法允许您为两个表中的ON
连接键指定列名。
USING 子句
如果多个列共享相同的名称但您不想使用所有这些公共列连接,则使用 USING 子句。USING 子句中列出的列在语句中不能有任何限定符,包括 WHERE 子句:
ON 子句
ON 子句用于连接两个表中列名不匹配的表。连接条件从 WHERE 子句中的过滤条件中删除:
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.
除了上面的答案之外,一个重要的区别是 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行。这有时很有用。
分享和享受。
除了上述答案。
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
两者都允许加入“无限”表。不同之处在于 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);
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 子句执行内部连接操作。
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
连接键指定列名。
On
子句和Using
子句的作用相同,但如果列名相同,则使用USING
子句。否则,如果列名不同,则使用 forON
子句。