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表的所有数据都会被匹配出来。

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

  • 相关阅读:
    HDU 2888 Check Corners (模板题)【二维RMQ】
    POJ 3264 Balanced Lineup(模板题)【RMQ】
    poj 3368 Frequent values(经典)【RMQ】
    SPOJ RPLN (模板题)(ST算法)【RMQ】
    UVA 796 Critical Links(模板题)(无向图求桥)
    UVA 315 Network (模板题)(无向图求割点)
    POJ 2029 Get Many Persimmon Trees (模板题)【二维树状数组】
    poj 3067 Japan 【树状数组】
    POJ 2481 Cows 【树状数组】
    POJ 1195 Mobile phones【二维树状数组】
  • 原文地址:https://www.cnblogs.com/HDK2016/p/6885024.html
Copyright © 2011-2022 走看看