Oracle natural join(自然连接)

虽然natural join(自然连接)实际上的用的比较少,但实际上这个连接是非常有用的,若能经常使用一下,实际上是非常方便的。

自然连接是在两张表中寻找那些数据类型和列名都相同的字段,然后自动地将他们连接起来,并返回所有符合条件的结果。

来看一下自然连接的例子。

Select emp.ename,dept.dname From emp natural join dept;

这里我们并没有指定连接的条件,实际上oracle为我们自作主张的将,emp中的deptno和dept中的deptno做了连接。

也就是实际上相当于

Select emp.ename,dept.dname From emp join dept on emp.deptno = dept.deptno;

因为这两张表的这两个字段deptno的类型个名称完全相同。所以使用natural join时被自然的连接在一起了。

另外:

1.如果做自然连接的两个表有多个字段具有相同名称和数据类型,那么他们都会被作为自然连接的条件。

2.如果自然连接的两个表仅是字段名称相同,但数据类型不同,那么将会返回一个错误。

3.由于oracle中可以进行这种非常简单的natural join,我们在设计表时,应该尽量在不同表中具有相同含义的字段使用相同的名字和数据类型。以方便以后使用natural join

最后我们在前面举的例子都得到以下的结果:

SQL> Select emp.ename,dept.dname

2 From emp natural join dept;

ENAME   DNAME

——————– —————-

SMITH RESEARCH

ALLEN SALES

WARD SALES

JONES RESEARCH

MARTIN SALES

BLAKE SALES

CLARK ACCOUNTING

SCOTT RESEARCH

KING ACCOUNTING

TURNER SALES

ADAMS RESEARCH

JAMES SALES

FORD RESEARCH

MILLER ACCOUNTING

============================================

下为OCP试题

============================================

89. View the Exhibit and examine the description of the DEPARTMENTS and EMPLOYEES tables.
To retrieve data for all the employees for their EMPLOYEE_ID, FIRST_NAME, and DEPARTMENT NAME,
the following SQL statement was written:
SELECT employee_id, first_name, department_name
FROM employees
NATURAL JOIN departments;
The desired output is not obtained after executing the above SQL statement. What could be the reason for
this?
A. The NATURAL JOIN clause is missing the USING clause.
B. The table prefix is missing for the column names in the SELECT clause.
C. The DEPARTMENTS table is not used before the EMPLOYEES table in the FROM clause.
D. The EMPLOYEES and DEPARTMENTS tables have more than one column with the same column
name and data type.
Answer: D

题解:DEPARTMENTS表 和 EMPLOYEES表 的MANAGER_ID列和DEPARTMENT_ID列具有相同的名称和类型,自然连接中会把这两个列都作为连接条件,即:

SELECT employee_id, first_name, department_name
FROM employees
NATURAL JOIN departments;

等同于:

SELECT e.employee_id, e.first_name, d.department_name
FROM employees e join departments d
on ( e.manager_id = d.manager_id and e.department_id = d.department_id ) ;

所以不会获得期望的结果(如果对表的列不熟悉,尽量不使用natural join)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>