sqr和Oracle的区别,Oracle学习笔记:a inner join b与from a,b where a.x=b.x的差异

近期,在使用Oracle的过程中,由以下两段代码的执行引发的思考,到底 select * from a,b where a.id = b.id 和 select * from a inner join b on a.id = b.id 有没有区别?

----- 代码1 ----

selecta.xxx, b.xxx, c.xxxfromBUSI_SQJS a,BUSI_SLSH b,BUSI_XSSC c,BUSI_SCJD d,BUSI_ZJQF e,BUSI_ZJBFSD fwhere substr(a.HANDLERDAVARTE,1,10) between '2018-01-01' and '2018-11-14'

and a.PROCESS_NUM=b.PROCESS_NUMand a.PROCESS_NUM=c.PROCESS_NUMand a.PROCESS_NUM=d.PROCESS_NUMand a.PROCESS_NUM=e.PROCESS_NUMand a.PROCESS_NUM=f.PROCESS_NUM;---- 代码2 ----

select /*+parallel(a,10)*/a.SQRLX,a.SQRMC,a.SQRSFZMWJ,a.CARDID,a.SQRLXDH,

a.SQRLXDZ,a.SDFS,a.SQJSYJ,a.HAS_SPCL,a.HAS_CLBZ,

e.ZJBH,f.SDFS,a.SQJSJG,b.SQSLJG,c.SQCLXSSCJG,

d.SCJDSCJGfromBUSI_SQJS aleft join BUSI_SLSH b on a.PROCESS_NUM=b.PROCESS_NUMleft join BUSI_XSSC c on a.PROCESS_NUM=c.PROCESS_NUMleft join BUSI_SCJD d on a.PROCESS_NUM=d.PROCESS_NUMleft join BUSI_ZJQF e on a.PROCESS_NUM=e.PROCESS_NUMleft join BUSI_ZJBFSD f on a.PROCESS_NUM=f.PROCESS_NUMwhere a.HANDLERDAVARTE >= to_date('2018-01-01','yyyymmdd')and a.HANDLERDAVARTE <= to_date('2018-11-14','yyyymmdd');

经过好一番查资料验证,最后更加迷惑。。。

……

……

有一说法:inner join优于where多表查询

另一说法:where a,b 默认就是内连接 inner join

join 方式的 on 指向连接条件,而其后的 where 条件是筛选连接条件产生的结果集,即先按连接条件连接两表,后根据条件进行筛选。

inner join 与一般笛卡尔积的区别:inner join是笛卡尔积的特殊形式。如果有表a和表b,表a有m条记录,表b有n条记录,则一般笛卡尔积后得到的记录条数是m*n条,记录之间的组合是随意的。而内连接则是建立在表a和表b的结构中有相同的列名的基础上进行的。

单纯的select * from a,b是笛卡尔乘积。

但是,如果对两个表进行关联:select * from a,b where a.id = b.id 就变了,此时就等价于:select * from a inner join b on a.id = b.id,即内连接。

……

……

最后,不得已,还是得亲自动手实验。。。

select * from temp_cwh_1128 --1275188

select * from mobile.tb_mr_prod_obj@recom --1274

---- 1.建立测试表 ----

create table temp_cwh_1128 as

select * fromtable_xxx awhere a.target_id='764'

----2.inner join 测试 ---- 4s

select b.prod_code, count(distincta.account_id)fromtemp_cwh_1128 ainner join mobile.tb_mr_prod_obj@recombon a.prod_id =b.prod_idgroup byb.prod_codeorder by b.prod_code;

---- 3.多表连接测试 ---- 4s

select b.prod_code, count(distincta.account_id)from temp_cwh_1128 a, mobile.tb_mr_prod_obj@recombwhere a.prod_id =b.prod_idgroup byb.prod_codeorder by b.prod_code;

查看解释计划,两种测试方式的执行过程应该是一致的。

546cfd1df2d1c228ed15f57aa9e98d20.png

结论来了!!!

1.等值连接,不加where条件的时候会产生笛卡尔积,尤其是多表进行连接的时候,产生的笛卡尔积不可预料;但是加上条件a.id = b.id之后,与内连接inner join的效率是一样的,所以“代码1”中的方式理论上来说并没有什么问题;

2.内连接本质上也是将多表关联之后,筛选满足条件的行;

3.where a,b的写法不符合规范,最好写成inner join的写法。

END 2018-11-29 16:44:49

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值