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 --
select * from mobile.tb_mr_prod_obj@recom --
---- 1.建立测试表 ----
create table temp_cwh_1128 as
select * from table_xxx a
where a.target_id=''
---- 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
Oracle学习笔记:a inner join b与from a,b where a.x=b.x的差异的更多相关文章
- Oracle学习笔记之四,SQL语言入门
1. SQL语言概述 1.1 SQL语言特点 集合性,SQL可以的高层的数据结构上进行工作,工作时不是单条地处理记录,而对数据进行成组的处理. 统一性,操作任务主要包括:查询数据:插入.修改和删除数据 ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- oracle学习笔记第一天
oracle学习笔记第一天 --oracle学习的第一天 --一.几个基础的关键字 1.select select (挑选) 挑选出显示的--列--(可以多列,用“,”隔开,*表示所有列),为一条 ...
- Oracle学习笔记——点滴汇总
Oracle学习笔记——点滴汇总 http://www.botangdb.com/ Oracle GI = Grid Infrastructure = ASM + Cluster
- Oracle学习笔记之四sp1,Oracle 11g的常用函数
从Oracle学习笔记之四,SQL语言入门中摘出来的,独立成一章节 3.1 字符类函数 ASCII(c)和CHR(i) 分别用于返回一个字符的ASCII码和返回给定ASCII值所对应的字符. C ...
- Oracle学习笔记—数据字典和常用命令(转载)
转载自: oracle常用数据字典和SQL语句总结 Oracle常用命令大全(很有用,做笔记) 一.Oracle数据字典 数据字典是Oracle存放有关数据库信息的地方,其用途是用来描述数据的.比如一 ...
- 并发编程学习笔记(12)----Fork/Join框架
1. Fork/Join 的概念 Fork指的是将系统进程分成多个执行分支(线程),Join即是等待,当fork()方法创建了多个线程之后,需要等待这些分支执行完毕之后,才能得到最终的结果,因此joi ...
- 吴裕雄--天生自然 oracle学习笔记:oracle理论学习详解及各种简单操作例子
1. 数据库的发展过程 层次模型 -->网状模型 -->关系模型 -->对象关系模型 2. 关于数据库的概念 DB:数据库(存储信息的仓库) DBMS:数据库管理系统(用于管理数据库 ...
- oracle学习笔记(一)用户管理
--oracle学习第一天 --连接 @后面连接数据库实例,具体连接到那个数据库 conn scott/tiger@MYORA1; --修改密码 passw; --显示用户 show user; -- ...
随机推荐
- mybatis之关联(2)
MapperAssoDao.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE map ...
- java 重载 : 1.参数个数不同,2.参数类型不同
参数个数相同时,参数类型需要不同,即使是不同变量名也不行.和是和变量的个数或者是变量的类型有关系 如果相同的话是覆盖 会报错 重载(overloading) 是在一个类里面,方法名字相同,而参数不同 ...
- BZOJ2326 HNOI2011数学作业(矩阵快速幂)
考虑暴力,那么有f(n)=(f(n-1)*10digit+n)%m.注意到每次转移是类似的,考虑矩阵快速幂.首先对于位数不同的数字分开处理,显然这只有log种.然后就得到了f(n)=a·f(n-1)+ ...
- oracle函数验证时间格式并返回
CREATE OR REPLACE FUNCTION WSW(parameter VARCHAR2) RETURN DATE IS val DATE; BEGIN IF (REGEXP_INSTR(p ...
- luogu2048 [NOI2010]超级钢琴 (优先队列+主席树)
思路:先扫一遍所有点作为右端点的情况,把它们能产生的最大值加到一个优先队列里,然后每次从优先队列里取出最大值,再把它对应的区间的次大值加到优先队列里,这样做K次 可以用一个前缀和,每次找i为右端点的第 ...
- bzoj4542: [Hnoi2016]大数(莫队)
这题...离散化...$N$和$n$搞错了...查了$2h$...QAQ 考虑$s[l...r]$,可以由两个后缀$suf[l]-suf[r+1]$得到$s[l...r]$代表的数乘$10^k$得到的 ...
- word 大纲-目录
- indeed招聘
https://cn.indeed.com/%E5%B7%A5%E4%BD%9C-%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E5%85%AC%E5%8F%B8-%E5% ...
- windows服务写完之后怎么让它跑起来
当然你可以在命令框里面自己去手动的敲代码,也可以写一个.bat文件一劳永逸......这里我就介绍写.bat文件的方法 就是上图所示的三个东东啦,有了这三个东东,把他们拖到你windows服务的deb ...
- ThinkPHP框架学习(二)
在上一节中,我主要讲到了如何获取ThinkPHP框架,以及虚拟目录和虚拟主机的配置.准备工作完成之后,就可以利用ThinkPHP去部署项目了. 先在工作目录(D:/zend/workspace)下新建 ...