oracle 12c 等价结合(NATURE JOIN ,USING,ON)
数据表结合,是数据库中非常重要的一个部分,等价结合为结合的两个表中特定的列相等的数据取出来结合的形式,也称为内部结合,或者单纯结合。
自然结合
自然结合为,结合的两个表共同存在的相同列名相同数据类型的列结合。
SELECT [表名.]列名[,[表名.]列名...]
FROM 表名1 NATURAL JOIN 表名2
[WHERE 结合条件以外的条件]
使用例子
数据表一 :员工信息表定义【empy】
数据表二:部门信息表定义
-
select EMPLOYEE_ID,EMPLOYEE_NAME,DEPARTMENT_NAME from empy natural join depts;
/* 在这个中相同为 MANAGER_ID,DEPARTMENT_ID */
结果
EMPLOYEE_ID EMPLOYEE_NAME DEPARTMENT_NAME
----------- ------------- ------------------------
1008 中山大輔 総務
1009 星野健一 営業
1010 斎藤京子 開発
1011 吉田亜希 マーケティング
1012 阿部伊吹 品質管理
特别注意的点
- 自然结合的结合列是自动判断的,不需要明确书写出来。
- 如果结合的两个数据表有复数列,全部相同的复数列使用。
(以上例子为MANAGER_ID,DEPARTMENT_ID 结合) - 自然结合,如果数据类型不相同但是同名的列发生错误
- 自然结合,如果其中的值为空,不发生结合。
5.结合列不可以加列的表接头词
/*错误的*/
select e.EMPLOYEE_ID,e.EMPLOYEE_NAME, e.department_id,d.DEPARTMENT_NAME
from empy e
natural join depts d;
------------------------------------------------
ORA-25155: NATURAL結合で使用される列は修飾子を持てません。
/*正确的*/
select e.EMPLOYEE_ID,e.EMPLOYEE_NAME, department_id,d.DEPARTMENT_NAME
from empy e
natural join depts d;
USING
上面的自然选择是oracle 自动选择出结合的列,而USING句需要明确指定结合的列,结合的列需要在【()】 指定。
SELECT [表名.]列名[,[表名.]列名...]
FROM 表名1 JOIN 表名2 USING(列名[,列名...]
[WHERE 结合条件以外的条件]
使用例子
select EMPLOYEE_ID,EMPLOYEE_NAME,DEPARTMENT_NAME
from empy
join dept USING (DEPARTMENT_ID);
使用场合
- 需要明确结合的列,自然结合不可以自己控制。
- 结合的两个表相同的列村存在复数个。但是不想用全部的列结合时。可以指定自己想要结合的条件
- 可以同于列名相同,但是列的类型不相同的情况。
特别注意的地方
- USING 中指定的结合列不需要用表进行修饰,如果写了会发生错误。
SQL> select e.empno,e.name ,d.dname
2 from employees e join departments d using (deptno)
3 where e.deptno in (10,20);
/* 错误信息*/
ORA-25154: USING句の列の部分には修飾子を持てません。
- NATURAL JOIN 和 USING 不可以同时使用
on结合
USING 和自然结合都必须要求两个表有共同的数据列名。ON 可以用于不同的数据列名,但必须是同一种类型。
SELECT [表名.]列名[,[表名.]列名...]
FROM 表名1 NATURAL JOIN 表名2
ON [表名1.]列名 = [表单2.]列名
[WHERE 结合条件以外的条件]
使用例子
SQL> select EMPLOYEE_ID,EMPLOYEE_NAME,DEPARTMENT_NAME
from empy e join dept d
on e.DEPARTMENT_ID = d. DEPARTMENT_ID
特别注意的地方
- 两个列表中相同的列名必须使用表名修饰词
Oracle 自己结合
利用 where 语句实现结合。
SELECT [表名.]列名[,[表名.]列名...]
FROM 表名1,表名2
WHERE 结合条件
[AND 结合条件以外的条件]
使用例子
select EMPLOYEE_ID,EMPLOYEE_NAME,DEPARTMENT_NAME
from empy e,dept d
where e.DEPARTMENT_ID = d. DEPARTMENT_ID
特别注意的地方
- 两个列表中相同的列名必须使用表名修饰词
比较
名称 | 列名相同 | 数据类型相同 | 表头修饰 |
---|---|---|---|
NATURAL JOIN | 相同结合 | 相同结合 | 不需要 |
USING | 相同结合 | 不同也可以结合 | 不需要 |
ON | 可以不同 | 不同报错 | 需要 |
WHERE | 可以不同 | 不同报错 | 需要 |