免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 18050 | 回复: 3

[数据库] Oracle表连接精解 [复制链接]

论坛徽章:
7
天蝎座
日期:2013-08-16 23:19:32丑牛
日期:2014-01-08 09:20:14寅虎
日期:2014-01-11 11:03:44午马
日期:2014-04-28 11:02:40天秤座
日期:2014-05-16 23:24:24摩羯座
日期:2014-07-20 10:46:04卯兔
日期:2014-08-08 15:21:41
发表于 2013-08-17 23:01 |显示全部楼层
下面比较全面,深入讲解了oracle关于表的连接的方式

附件: oracle表连接.docx (35.69 KB, 下载次数: 115)

论坛徽章:
7
天蝎座
日期:2013-08-16 23:19:32丑牛
日期:2014-01-08 09:20:14寅虎
日期:2014-01-11 11:03:44午马
日期:2014-04-28 11:02:40天秤座
日期:2014-05-16 23:24:24摩羯座
日期:2014-07-20 10:46:04卯兔
日期:2014-08-08 15:21:41
发表于 2013-08-17 23:02 |显示全部楼层
3.外连接
    Oracle语法:
   3.1 左外连接
select a.employee_id, a.department_id, b.department_id, b.department_name
  from hr.employees a, hr.departments b
where a.department_id = b.department_id(+)
   and a.employee_id in (100, 101, 17
order by a.employee_id
EMPLOYEE_ID        DEPARTMENT_ID        DEPARTMENT_ID        DEPARTMENT_NAME
100        90        90        Executive
101        90        90        Executive
178                                 空值        空值        空值
雇员178号没有部门号,这个如果连接条件是a.department_id = b.department_id,则不会匹配出雇员178,因为雇员表没有雇员178的的部门号,部门表也没有雇员178的部门号,空值与空值的匹配仍然是空值.但是如果是部门表b.department_id(+)这样与雇员表a.department_id进行连接,那么就会把雇员178给匹配出来.这就是oracle的左外连接.
    SQL1999语法:
select a.employee_id, a.department_id, b.department_id, b.department_name
  from hr.employees a left outer join hr.departments b
    on a.department_id = b.department_id
where a.employee_id in (100, 101, 17
order by a.employee_id
得出一样的结果集
  3.2 右外连接
select a.employee_id, a.department_id, b.department_id, b.department_name
  from hr.employees a, hr.departments b
where a.department_id(+) = b.department_id
and b.department_id in (110,120)
EMPLOYEE_ID        DEPARTMENT_ID        DEPARTMENT_ID        DEPARTMENT_NAME
205        110        110        Accounting
206        110        110        Accounting
空值        空值        120        Treasury
部门号120没有雇员,如果这个连接条件为a.department_id = b.department_id,将不会匹配部门号120的记录,因为雇员表的没有部门为120的部门,为空值,部门表有120号部门,空值与部门120进行匹配,得到的结果仍然是空值。但是如果雇员表想知道部门表里面还有哪些部门是没有雇员的,怎么办?那么这样可以解决这个问题,雇员表department_id(+)与部门表department_id进行连接,则可以将部门表没有雇员的部门也匹配出来。这就是Oracle的右外连接.
SQL1999语法:
select a.employee_id, a.department_id, b.department_id, b.department_name
  from hr.employees a right outer join hr.departments b
  on a.department_id = b.department_id
where b.department_id in (110,120)
得出一样的结果集
  3.2 全外连接
     oracle语法中并没有全外连接的写法,在sql1999语法中,有这个写法:
     使用 full outer join关键字来连接
      (略)

4.自连接
oracle语法中的自连接,是在一张表中进行连接,雇员表中的员工与管理员的关系,可以在一张雇员表中找出来,比如员工的管理者是谁。
举例:
比如90号部门的雇员情况如下:
select w.employee_id,
        w.first_name,
        w.last_name,
        w.manager_id,
        w.department_id
   from hr.employees w
  where w.department_id = 90
EMPLOYEE_ID        FIRST_NAME        LAST_NAME        MANAGER_ID        DEPARTMENT_ID
100        Steven        King                90
101        Neena        Kochhar        100        90
102        Lex        De Haan        100        90
员工101,102的的管理者为100,即Steven King.如果通过两张表的连接体现在一行上面.使用oracle的自连接可以实现这一点.
select w.employee_id as "员工编号",
        w.first_name || ' '||
        w.last_name as "员工姓名",
        m.employee_id as "管理者编号",
        m.first_name ||' ' ||
        m.last_name as "部门管理者",
        m.manager_id as  "部门管理者编号"
   from hr.employees w, hr.employees m
  where w.manager_id = m.employee_id
    and w.department_id = 90
员工编号        员工姓名        管理者编号        部门管理者        部门管理者编号
101        Neena Kochhar        100        Steven       
102        Lex De Haan        100        Steven       
使用自连接,实现了一行记录即有员工,也有管理者的记录,其实就是把雇员ID为100的一行记录分别与雇员ID为101,102的两行记录进行了合并而已。
这就是oracle的自连接。

5.using子句进行表连接
sql1999语法:
其实using 子句是相对于natural join来说的,其实就是等值连接
举例:
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  join  hr.departments b using (department_id)
   where 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
相当于等值连接
注意的是,select 列表中,不允许有别名来限定表名,where 条件中也不允许有别名来限定表名。
也可以这样写:
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  join  hr.departments b using (department_id,manager_id)
   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
相等于自然连接。
注意的是,select 列表中,不允许有别名来限定表名,where 条件中也不允许有别名来限定表名。
6.on子句

sql1999语法:
其实on子句只不过是等值连接另外一种写法罢了。
举例说明:
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
  join hr.departments b
    on (a.department_id = b.department_id)
where a.department_id = 30
相当于:
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 b.department_id = a.department_id
得到相同的结果集:
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
注意的是,在on子句中,select 列表中,允许有别名来限定表名,where 条件中允许有别名来限定表名。

end.

论坛徽章:
0
发表于 2014-02-18 10:54 |显示全部楼层
你好,看到你的帖子,受益很多,能否加QQ一起讨论下啊?我的QQ 2497321200

论坛徽章:
0
发表于 2014-04-16 10:31 |显示全部楼层
太拽了。。。。。。。。。。。。。。。。。。。。。。。

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP