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 ---- select a.xxx, b.xxx, c.xxx from BUSI_SQJS a,BUSI_SLSH b,BUSI_XSSC c,BUSI_SCJD d,BUSI_ZJQF e,BUSI_ZJBFSD f where substr(a.HANDLERDAVARTE,1,10) between '2018-01-01' and '2018-11-14' and a.PROCESS_NUM=b.PROCESS_NUM and a.PROCESS_NUM=c.PROCESS_NUM and a.PROCESS_NUM=d.PROCESS_NUM and a.PROCESS_NUM=e.PROCESS_NUM and 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.SCJDSCJG from BUSI_SQJS a left join BUSI_SLSH b on a.PROCESS_NUM=b.PROCESS_NUM left join BUSI_XSSC c on a.PROCESS_NUM=c.PROCESS_NUM left join BUSI_SCJD d on a.PROCESS_NUM=d.PROCESS_NUM left join BUSI_ZJQF e on a.PROCESS_NUM=e.PROCESS_NUM left join BUSI_ZJBFSD f on a.PROCESS_NUM=f.PROCESS_NUM where 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 * from table_xxx a where a.target_id='764'
---- 2.inner join 测试 ---- 4s select b.prod_code, count(distinct a.account_id) from temp_cwh_1128 a inner join mobile.tb_mr_prod_obj@recom b on a.prod_id = b.prod_id group by b.prod_code order by b.prod_code;
---- 3.多表连接测试 ---- 4s select b.prod_code, count(distinct a.account_id) from temp_cwh_1128 a, mobile.tb_mr_prod_obj@recom b where a.prod_id = b.prod_id group by b.prod_code order by b.prod_code;
查看解释计划,两种测试方式的执行过程应该是一致的。
结论来了!!!
1.等值连接,不加where条件的时候会产生笛卡尔积,尤其是多表进行连接的时候,产生的笛卡尔积不可预料;但是加上条件a.id = b.id之后,与内连接inner join的效率是一样的,所以“代码1”中的方式理论上来说并没有什么问题;
2.内连接本质上也是将多表关联之后,筛选满足条件的行;
3.where a,b的写法不符合规范,最好写成inner join的写法。
END 2018-11-29 16:44:49
转载于:https://www.cnblogs.com/hider/p/10039089.html
Oracle学习笔记:a inner join b与from a,b where a.x=b.x的差异相关推荐
- oracle:oracle学习笔记(四)循环、光标、异常、瀑布模型
oracle学习笔记:循环.光标.异常 文章目录 打印Hello World 定义基本变量 引用型变量(单行)` my_name emp.ename%type ` 记录型变量(多行) `emp_rec ...
- Oracle学习笔记---(一)
Oracle学习笔记---(一) 一 1.Oracle简介 Oracle是以高级结构化查询语言(SQL)为基础的大型关系数据库:是一个对象关系数据库管理系统(ORDBMS).它提供了关系数据库 ...
- 在大量数据迁移期间oracle学习笔记
在数据迁移期间oracle学习笔记 0主键(自增) 1用户代码 2区域代码 3承保公司代码 4理赔编码 5投保确认码 6案件状态 7案件进展 8重开案件进展 9转换后案件状态 需求分析: 1.根据上述 ...
- oracle 权限问题9017,[数据库]oracle学习笔记(一)用户管理_星空网
oracle学习笔记(一)用户管理 2014-04-13 0 1 --oracle学习第一天 2 --连接 @后面连接数据库实例,具体连接到那个数据库 3 conn scott/tiger@MYORA ...
- 【Oracle】Oracle学习笔记
[Oracle]Oracle学习笔记 目录 [Oracle]Oracle学习笔记 P1.Oracle数据库的安装和配置 P2.Oracle数据库管理 P3-0.初步SQL P3-1.基本SQL SEL ...
- oracle学习笔记 Oracle体系结构概述
oracle学习笔记 Oracle体系结构概述 从这节开始,开始讲oracle数据库体系结构. 首先从总体上,从概述上把oracle整体的体系结构讲一下, 然后接下来的时间我们会一块一块的将oracl ...
- Oracle学习笔记 字符集概述
Oracle 学习笔记 字符集概述 这节课开始讲oracle里面的字符集 偏重于原理和简单的一些判断以及实现 字符集它涉及到很多的东西 比如建库和操作系统环境 这节课把字符集的原理性的东西以及常见的操 ...
- oracle学习笔记 oracle软件安装准备工作 第一部分 环境准备
oracle学习笔记 oracle软件安装准备工作 第一部分 环境准备 这节课对初学者来说内容较多,我把它分成了三篇. 即使这样也不可能把每个可能遇到的问题都说到,如果遇到没说到的问题自己上网搜 ...
- Oracle学习笔记(七)——分组统计查询
Oracle学习笔记(七)--分组统计查询 基础统计函数的使用 分组统计操作的实现,结合多表查询使用分组统计 常用统计函数 COUNT(*|[DISTINCT]字段) MAX(字段,日期或数字) MI ...
- oracle update单引号,Oracle学习笔记:update的字段中包括单引号
平时update的时候直接更改字段内的值,例如: update table_temp set name = 'Hider' where id = 100; 但更新后的值中包括单引号,则不能按以上方式进 ...
最新文章
- Thread 线程同步、线程状态
- md5生成一个加盐程序c语言,MD5在编程中的实现 (C语言)
- 捷波朗STORM耳机设置中文_2020年 除了Airpods pro以外无线降噪蓝牙耳机如何选?五款热门入耳式蓝牙降噪耳机推荐...
- jstorm的acker实现
- 马斯克确诊新冠后续:已从低烧、感冒症状中完全恢复
- matlab与r语言运算速度,R语言与matlab循环时间对比
- jquery 滚动到某个div_如何使用jQuery获取父元素
- java并发编程实战读书笔记之FutureTask
- mysql 5.6 默认密码_mysql5.6配置及修改密码
- 基于Maven的S2SH(Struts2+Spring+Hibernate)框架搭建
- 并行学习框架下基于GAN的城市道路网短时路段交通预测方法
- 海思Hi3519A SVP从入门到精通(一 概述)
- mysql删库命令是啥_删除数据库的命令是什么?
- JAVA实现饭店点菜系统详解
- 【CP2K教程(一)】元动力学(metadynamics)与增强采样技术
- 台式计算机快捷键大全,电脑常用快捷键有哪些
- java操作word(一)
- 最新代千元机!Redmi Note 9正式发布:性能提升100% 1299元起售!
- python 频数表_python里计算每个数字出现的频数
- 一次 JDBC 与 MySQL 因 “CST” 时区协商误解导致时间差了 14 或 13 小时的排错经历...