zoukankan      html  css  js  c++  java
  • 【Oracle】Oracle的内外连接

    目录结构:

    contents structure [+]

    1,Oracle中的内外连接

    1.1,内连接

    内连接就是符合条件的数据被选中,不符合条件的数据被过滤掉。

    1.1.1 等值连接

    先看看需要使用的表结构(在其它的例子中也可能被用上,其余代码也是):

     1 table name:s_emp
     2 Name                Description
     3 ------------------  -------------
     4 ID                   员工编号
     5 LAST_NAME            名称
     6 FIRST_NAME           姓氏
     7 USERID               身份证号
     8 START_DATE           开始时间
     9 COMMENTS             评论内容
    10 MANAGER_ID           上级编号
    11 TITLE                标题
    12 DEPT_ID              部门编号
    13 SALARY               薪水
    14 COMMISSION_PCT       提成
    s_emp表(员工表)结构
    1 table name:s_dept
    2 Name                Description
    3 ------------------  -------------
    4 ID                  部门编号
    5 NAME                部门名称
    6 REGION_ID           地区编号
    s_dept表(部门表)结构

    显示每个员工的编号 姓氏 部门名称

    select e.id,e.first_name,d.name
            from s_emp e,s_dept d
                --使用'='号表示等值连接
                   where e.dept_id=d.id;

    1,1,2 非等值连接

    1 table name:salgrade
    2 Name                Description
    3 ------------------  -------------
    4 GRADE                薪水级别
    5 LOSAL                下区间
    6 HISAL                上区间
    salgrade表(薪水级别表)结构

    显示每个员工的编号 姓氏 薪水 薪水级别

    select e.id,e.first_name,e.salary,s.grade
           from s_emp e,salgrade s
                --也可以使用 where e.salary >= s.losal and e.salary <= s.hisal
                where e.salary between losal and hisal;

    1,1,3 自连接

    显示所有领导的编号 姓氏

    在s_emp表中,所有领导者的编号都出现在manager_id一栏,根据这一特点我们来进行如下分析:

    所以代码如下:

    select distinct m.id,m.first_name
           from s_emp e,s_emp m  
                  where e.manager_id=m.id;

    1.2 外连接

    1.2.1 外连接的特点

    读者需要注意外连接和内连接不是完全对立的,它们的关系如下:

    外连接的结果集=内连接的结果集+匹配不上的数据。

    1,2,2 如何实现外连接

        通过在字段后加上(+)来实现

           (+)字段所在的表的对面表的数据全部被选中 。除此之外,内连接中被过滤的数据是通过NULL记录进行的匹配。

        比如还是1,3,1的那个案例,我们已经求出了领导的编号,那么员工的信息又该怎么求呢?

        经过分析我们只需要用外连接得到表中所有员工的信息,然后再减去领导的信息,得到的就是普通员工的信息了。

       

     通过上面的动图我们可以看出,(+)字段对应表的全部数据都用null匹配出来了,因此内连接也可以通过外连接来表达,比如上面的1,3,1的案例也可以用如下的方式实现:

    select distinct m.id,m.first_name
           from s_emp e,s_emp m
                   --通过is not null筛选得到实际数据
                   where e.manager_id(+)=m.id and e.manager_id is not null;

     这样也可以得出领导的信息。下面的代码,可以显示普通员工的信息(下面的代码和上面的代码恰好对立是相反的):

    select distinct m.id,m.first_name
           from s_emp e,s_emp m
                   where e.manager_id(+)=m.id and e.manager_id is null;

    2,SQL99的内外连接

    为了在各个数据库厂商之间取得更大的统一性,美国国家标准学会(American NationalStandards Institute,ANSI)于1986年发布了第一个SQL标准,并于1989年发布了第二个版本,该版本已经被广泛地采用。ANSI在1992年更新了SQL标准的版本,即SQL92和SQL2,并于1999年再次更新为SQL99和SQL3标准。在每一次更新中,ANSI都在SQL中添加了新特性,并在语言中集成了新的命令和功能。

    Oracle的内外连接和SQL99的内外连接可以相互转化。

    2.1 SQL99的内连接

    内连接只有满足表连接条件的数据才会被选出。

     语法格式:

            from    a表    join    b表   on 表的连接条件  where 过滤条件;
            from    a表   [inner]  join    b表   on 表的连接条件  where 过滤条件;

    s_dept表结构:

    s_dept表(部门表)结构

    s_dept表数据:

    s_region表结构:

    table name:s_region
    Name                Description
    ------------------  -------------
    ID                  地区编号
    NAME                地区名称
    s_region(地区信息)表结构

    s_region表数据:

    下面是内部连接的代码:

    select distinct d.id,d.name,r.name
           from s_region r join s_dept d
                   on r.id=d.region_id;

    结果如下,可以看出结果只有前12行数据被匹配出来:

    下面这段代码和上面的一样:

    select distinct d.id,d.name,r.name
           from s_region r,s_dept d
                 where r.id=d.region_id;

    2.2 SQL99的外连接

     2.2.1 语法

    from a表  left  [outer]  join   b表   on  表的连接条件    where  过滤条件;
    from a表  right  [outer]  join   b表   on  表的连接条件    where  过滤条件;
    from a表  full  [outer]  join   b表   on  表的连接条件    where  过滤条件;

    left join 形式的连接称为左连接。

    查询结果包含join左侧表中的所有记录以及右侧表满足条件的记录。也就是a表中的全部数据都会被匹配出来,b表中符合条件的数据才会被匹配出来。

    right join 形式的连接称为右连接。

    查询结果包含join右侧表中的所有记录以及左侧表中满足条件的记录。也就是b表中的全部数据都会被匹配出来,a表中符合条件的数据才会被匹配出来。

    full join 形式的连接称为全连接。

    查询结果包含join左侧和右侧的全部数据。也就是a表和b表的所有数据都会被匹配出来。

    本文为博主原创文章,转载请注明出处。

  • 相关阅读:
    网页弹窗代码大全收集整理
    再来二十一段救命的PHP代码
    PHP文件包含漏洞原理分析和利用方法
    Apache重写规则的常见应用及实例说明
    PHPCMS 整站代码分析讲解(一)
    网络登录过程
    lamp安装的所有注意事项
    使用lockbits方法处理图像 from http://blog.sina.com.cn/s/blog_4e3e2ce4010009on.html
    CImage类 from http://www.cnblogs.com/afarmer/archive/2012/03/31/2427273.html
    VC/MFC怎样将位图CBitmap对象保存成为bmp格式文件? from http://coding1688.iteye.com/blog/1547035
  • 原文地址:https://www.cnblogs.com/HDK2016/p/6885024.html
Copyright © 2011-2022 走看看