zoukankan      html  css  js  c++  java
  • oracle中 常用的 join on 相关和 集合运算的总结

    sql常用联合查询的 join on 、 left join(左连接) 、 right join (右连接)、inner join (等值连接)以及常用的集合运算有:union、unionall、minus、intersect的效果和总结。

    若有人问我用select * from a,b where a.id=b.id;这种基础的语法就能完成我想要的结果,为什么用join等语法呢,答案是:这样做,极大的提高的查询效率。

    首先接着用上一篇的book表和pbook表:

    首先把join on和inner join 放在一起:

    select  * from   book a    join  ( select id,name,price from   pbook) b on   a.id=b.id;
    select  * from   book a    inner join  ( select id,name,price from   pbook) b on   a.id=b.id;
    

     相比较这结果一模一样,只返回两个表中联结字段id相等的行 ,所以想  可以理解为  join on  与inner join on 相同

    接着我们看左、右连接比较:

    select  * from   book a    left join  ( select id,name,price from   pbook) b on   a.id=b.id;
    select  * from   book a    right join  ( select id,name,price from   pbook) b on   a.id=b.id;
    

    明显能看出,左连接以左表为主,左表全部显示,右表只显示关联的,其余为空,总行数是左表的行。右连接是以右表为主,显示右边所有行,左表关联的行显示,其余为空

    补充说明以及应用推广:

     假设 三个或者4个表作为连接,分组 查询a表的某个字段,b表的某个字段,c表的某个字段,且根据一定的条件作为约束

    select A.f_cjdwBH AS f_cjdwBH,
           A.F_CJDWMC AS F_CJDWMC,
           SUM(F_YCLYCZ_JZ) F_ZRCL,
           SUM(B.F_YCZ) F_YCZ
      from XY_CLYC_DJZRCLYC A
      left JOIN XY_CLYC_QKZRCLYC B
        ON A.F_QKMC = B.F_QKMC
       AND A.F_NY = B.F_NY
       left Join  XY_CLYC_DWYCZRCL  c
       on  a.f_qkbh=c.F_MCBH
        and  a.f_ny=c.f_qj 
        
     left join XY_XYZD_QKXYCJDW  d
      on  a.f_qkmc=d.f_qkmc
       and d.f_nd= '2017'
      
    WHERE  A.F_QKMC='无人区'
       AND A.F_YCKSSJ = '201701'
       AND A.F_YCJSSJ = '201712'
       AND A.F_NY >= '201701'
       AND A.F_NY <= '201712'
    
     GROUP BY A.F_CJDWBH, A.F_CJDWMC

    由此推广应用。 重点说明:join on 的on后面是可以跟and条件,但是在多表查询的时候,把筛选条件 最好写在最后的where 条件下面不能跟在某一个on 中。on只应用于2个表的关系条件

    下面 常用的集合运算的比较:

    首先我们比较一下union 和union all 结果比较

    select   * from  book      union  select id,name,price from   pbook;
    select   * from  book      union all select id,name,price from   pbook;
    

    这里能够看出:union 和union all 把相同列合并了union对合并的数据去掉了重复行并且进行了排序。而union all 则是把2个表合起来,没有排序或者去重。

    提示:1.表面上看union对数据进行排序,但是不能保证排序一定正确。(在oralce10之前是排序去重,之后是Hash UNIQUE运算去重,而它只比较散列值不进行排序)

               2.当数据量很大时,速率上来讲,union all 会比union 快很多。 

    提示补充:union 和union all 不会对比你的2个表的字段是否相等进行匹配,只对比要合并的2个表 是否有相等数量的字段列,且字段列类型相等,合并之后以左表字段为主。

    比如 a,b表: a表3列数据,id,username,age ;b表数据如下:id,guojia,rq  最后的结果都是以a表为主显示的列。

      合并之后:

    下一组比较:minus,intersect

    select   * from  book      minus select id,name,price from   pbook;
    select   * from  book  intersect   (select id,name,price from   pbook)

    很明显:minus是把2个表冲突数据提出来,而intersect是把2个表的相同数据提出来

     本文为博主原创,如有转载,请标记文章出处:http://www.cnblogs.com/mobeisanghai/p/7544544.html
     作者:漠北桑海

  • 相关阅读:
    Python 重要的字符串处理函数
    Python 字符串类型及相关操作
    Windows 7下Git SSH 创建Key的步骤(by 星空武哥)
    Python 列表类型及相关操作
    Python 字典类型及相关操作
    袁老师Py西游攻关之基础数据类型
    PyCharm2017安装教程,包含注册码
    python安装及语法1
    Ubuntu linux安装ssh server
    soap消息机制 讲解
  • 原文地址:https://www.cnblogs.com/mobeisanghai/p/7544544.html
Copyright © 2011-2022 走看看