4,自然连接
这是Oracle的一种特有的连接方式。它自动连接两个表中数据类型和名称相同的字段,然后根据条件自动地将他们连接起来。
具体语法:
select ... from table1 t1 left natural join table2 t2;
比如:
select emp.ename, dept.dname from emp natural join dept;
这里并没有指定连接的条件,实际上oracle自动的将员工表中的deptno和部门表中的deptno做了连接。
也就是实际上相当于:
select emp.ename,dept.dname from emp join dept on emp.deptno = dept.deptno;
因为这两张表的这两个字段deptno的类型和个名称完全相同。所以使用natural join时被自然的连接在一起了。
PS:
如果自然连接的两个表仅是字段名称相同,但数据类型不同,那么将会返回一个错误。
5,自连接
简单地说就是自己和自己进行连接,连接的条件就是本表的主键。通常认为在数据库中存在父子关系时,应该设计成两张表。但如果父子都是同一实体,就可以简化设计成一张表。比如,查看员工及直接
上级的名字: (上级也是员工,上级的数据也是员工数据,也应该存储在员工表中。)
select yg.empno as 员工, yg.ename as 工号, sj.ename as 上级 from emp yg, emp sj where yg.mgr = sj.empno;
员工 工号 上级
7369 SMITH FORD
7499 ALLEN BLAKE
7521 WARD BLAKE
7566 JONES KING
7654 MARTIN BLAKE
7698 BLAKE KING
7782 CLARK KING
7788 SCOTT JONES
7844 TURNER BLAKE
7876 ADAMS SCOTT
7900 JAMES BLAKE
7902 FORD JONES
7934 MILLER CLARK
连接的表其实就是员工表自身,因为上级也是员工,上级的empno应该与其直接下属员工的mgr相匹配。这里实际上实现的是一种树形的结构,即多级的分类结构。每层都是同样级别的员工,上层为其直属上级,下层为其直属员工。通过结果可以很清楚地看到这一结构,对于JONES来说,他的上级KING,BLAKE的下级又有SCOTT和FORD。
只要是相同类型实体的多级的分类结构,都可以使用一张表来存储。在实体的所有属性基础上,在添加一个所属上级的ID即可。比如,大小类,多级菜单,组织机构都可以采用这样的方式设计表结构。
PS:
什么时候用别名?
通常下面的情况下需要用到别名
1)实际的表名过长,编写不方便,使用别名简化。
2)同一张表检索多次时,“必须”使用别名。上面的自连接中,连接的表其实就是一张表,不加上别名就无法知道字段是属于哪一个引用的表。