Oracle表连接精解及应用

对于我们初学者来说,对表的概念也有一定的认识。因为我们对数据库的操作,90%以上是对表的操作。


Oracle语法&SQL1999语法:
1.笛卡尔乘积(CROSS JOIN)
   第一张表的所有行会与第二张表的所有行进行连接,即n*m方式进行连接
   oracle语法:
   select count(*) from hr.employees a ,hr.departments b;
    2889行
   雇员表的107行记录与部门表的27行记录相乘积(107*27),得到2889条记录
   SQL1999语法:
  select count(*) from hr.employees a cross join hr.departments b
    2889行

2.等价连接
   select a.department_id, b.department_id, a.employee_id, b.department_name
  from hr.employees a, hr.departments b
where a.department_id = b.department_id
   and a.department_id = 90
a.DEPARTMENT_ID        b.DEPARTMENT_ID        EMPLOYEE_ID        DEPARTMENT_NAME
90        90        100        Executive
90        90        101        Executive
90        90        102        Executive

把在a表和b表,部门相同,且部门号为90的员工匹配出来。
SQL1999语法:
在sql1999语法中的natural jion连接中,与oracle语法中的等值连接是有区别的.
先举例说明:
natural jion连接的条件是:两表连接中的列名要有相同的、相同的列名的值要相同的、相同的列名的数据类型要相同的。

sql-1:
select a.employee_id, a.manager_id, a.department_id
  from hr.employees a
where a.employee_id in (114, 115, 116, 117, 118, 119)
雇员表雇员114,115,116,117,118,119的相关结果集如下:
EMPLOYEE_ID        MANAGER_ID        DEPARTMENT_ID
114                          100                   30
115                  114                   30
116                       114            30
117                          114                   30
118                  114                   30
119                          114                   30

sql-2:
等值连接:
select a.employee_id, a.manager_id, a.department_id
  from hr.employees a, hr.departments b
where a.department_id = b.department_id
   and a.department_id = 30
EMPLOYEE_ID        MANAGER_ID        DEPARTMENT_ID
114                             100          30
115                            114          30
116                             114          30
117                     114          30
118                             114          30
119                             114          30

sql-3:
netural join:
select employee_id, manager_id, department_id
  from hr.employees a natural
  join hr.departments b
where department_id = 30
EMPLOYEE_ID        MANAGER_ID        DEPARTMENT_ID
115                            114          30
116                             114          30
117                     114          30
118                             114          30
119                             114          30

大家注意看,在sql-1中,我列出了雇员114~119的一些情况,在sql-2中,进行的是等值连接,而在sql-3中,进行的是NATURAL JOIN连接.
sql-2与sql-3的结果集的区别在哪里?
sql-2的等值连接中有雇员114的记录,而sql-3的NATURAL JOIN连接中没有雇员114的记录,为什么?
natural jion连接的条件是:
(1) 两表连接的列名要有相同的
(2) 两表连接的列名的数据类型要相同的
(3) 两表连接的列名的值要相同的,原因就在这里。
原因就是雇员表中部门30的雇员114的manager_id的值是100,而部门表中30号部门中没有manager_id=100的记录,所以,不符合条件(3),故而netural join连接中没有匹配雇员为为114的记录了,然而,等值连接则没有这样的条件,故而能匹配雇员为114的记录。
  这就是NATURAL JOIN与等值连接的区别。
其实NATURAL JOIN自然连接是两表中的相同的列的自然连接,换句话说,就是不需要人工干预,比方说,A表与B表有3列名相同,那么oracle NATURAL JOIN自然连接就连接相同的三列,自然连接的这相同的三列的列值是AND的关系,三列的条件必须同时满足才匹配,如果其中一列值不匹配,那么该列的列值就被抛弃。如果进行人工干预,比方说,我只需要使用其中一列作为连接列,那么这就是不是自然连接了,可以是USING子句,oracle等价连接来完成。
再举例一个:
看一个需要人工干预的等值连接:
select b.department_id "b-manager_id",
       a.department_id "a-department_id",
       b.manager_id    "b-department_id",
       a.manager_id    "a-manager_id"
  from hr.employees a, hr.departments b
where a.department_id = b.department_id
   and a.department_id = 30
b-department_id        a-department_id        b-manager_id        a-manager_id
30        30        114        100
30        30        114        114
30        30        114        114
30        30        114        114
30        30        114        114
30        30        114        114
看上述表格的第一行,a表列department_id,manager_id与b表department_id
,manager_id两列相同,但是这里我使用人工控制的方式来进行连接,就是说我选择了其中一个相同列deparament_id来进行连接,只有两表department_id匹配,就返回记录,而不管manager_id匹配不匹配.
自然连接则不同,下面举例:
select department_id "b-department_id",
       department_id "a-department_id",
       manager_id    "b-manager_id",
       manager_id    "a-manager_id"
  from hr.employees a natural join  hr.departments b
   where department_id = 30
b-department_id        a-department_id        b-manager_id        a-manager_id
30        30        114        114
30        30        114        114
30        30        114        114
30        30        114        114
30        30        114        114
看上图,自然连接就是两表所有相同的列进行连接,其实看sql语句也看出来了,上面的sql并没有连接条件,这也表示了是用两表中所有的相同的列进行连接,这是自然连接的第一个点,再有就是,比较两张表格的结果集,有所不同,b-manager_id=114与a-manager_id=100的结果集不符合自然连接的要求,故而自然连接的结果集中并没有显示,因为必须满足b-manager_id= a-manager_id的要求,其实,上述自然连接的sql可以等价如下语句:
select b.department_id "b-department_id",
         a.department_id "a-department_id",
         b.manager_id    "b-manager_id",
         a.manager_id    "a-manager_id"
    from hr.employees a, hr.departments b
   where a.department_id = 30
     and a.department_id = b.department_id
     and a.manager_id = b.manager_id
b-department_id        a-department_id        b-manager_id        a-manager_id
30        30        114        114
30        30        114        114
30        30        114        114
30        30        114        114
30        30        114        114
注意的是,自然连接的select 列表中,不允许有别名来限定表名,where 条件中也不允许有别名来限定表名。
上面讲的是两表连接。
自然连接中的多表(2张表以上)连接也是一样的。
select department_id "b-department_id",
       department_id "a-department_id",
       manager_id    "b-manager_id",
       manager_id    "a-manager_id",
       job_id   "c-job_id"
  from hr.employees a natural join  hr.departments b natural join hr.jobs c
   where department_id = 30
b-department_id        a-department_id        b-manager_id        a-manager_id        c-job_id
30        30        114        114        PU_CLERK
30        30        114        114        PU_CLERK
30        30        114        114        PU_CLERK
30        30        114        114        PU_CLERK
30        30        114        114        PU_CLERK

猜你喜欢

转载自blog.csdn.net/weixin_43955838/article/details/87083646