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= '' WHERE A.F_QKMC='无人区'
AND A.F_YCKSSJ = ''
AND A.F_YCJSSJ = ''
AND A.F_NY >= ''
AND A.F_NY <= '' 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
作者:漠北桑海
oracle中 常用的 join on 相关和 集合运算的总结的更多相关文章
- Oracle中 (+)与left join 的用法区别
Oracle中 (+)与left join 的用法区别 原创 2017年01月11日 13:33:42 6648 select * from a,b where a.id=b.id(+); (+)写在 ...
- Oracle中常用的系统函数
本文主要来梳理下Oracle中的常用的系统函数,掌握这些函数的使用,对于我们编写SQL语句或PL/SQL代码时很有帮助,所以这也是必须掌握的知识点. 本文主要包括以下函数介绍:1.字符串函数2. 数值 ...
- Oracle 中常用数据字典大总结
原文出处:小宝马的爸爸 - 梦想的家园 前面呢,也断断续续的介绍了一些诸如 Sql*Plus 等等关于 Oracle 的基本的内容, 对于 Oracle 这样的大型数据库呢,自身的运行和维护也是个不得 ...
- oracle中常用的两个伪列
伪列 伪列就行oracle中的一个列表,但世界上它并未存储在表中,伪列可以被查询但是不能被插入或者更改. rowID 该伪列返回该行地址,可以使用rowID值来定位表中的一行.通常rowID值可以标识 ...
- oracle中常用函数
1.oracle中 trunc 是截取的函数,用在日期类型上,就是截取到的日或时间. select trunc(sysdate) from dual 默认是截取系统日期到日,得到 2012-12- ...
- Oracle组函数、多表查询、集合运算、数据库对象(序列、视图、约束、索引、同义词)等
count组函数:(过滤掉空的字段) select count(address),count(*) from b_user max() avg() min(),sum() select sum(age ...
- Oracle(2)之多表查询&子查询&集合运算
多表查询 笛卡尔积 同时查询多张表时,每张表的每条数据都要和其它表的每条数据做组合.如下栗子,我们发现产生的总记录数是 56 条,还发现 emp 表是 14 条,dept 表是 4 条,56 条正是 ...
- Oracle 多表查询、查询运算符和集合运算
一.多表查询 1.内连接 一般使用INNER JOIN关键字指定内连接,INNER可以省略,默认表示内连接.查询结果中只包含两表的公共字段值相等的行,列可以是两表中的任意列 2.外连接 包括左外连接. ...
- 【Oracle】Oracle中常用的系统函数
Oracle SQL 提供了用于执行特定操作的专用函数.这些函数大大增强了 SQL 语言的功能.函数可以接受零个或者多个输入参数,并返回一个输出结果.在Oracle还可以自定义函数,关于更多信息可以查 ...
随机推荐
- 点击下拉,其余不动的jquery事件(转)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Linux学习(三)putty,xshell使用以及密匙登陆
一.认识xshell,putty 他们都是服务器登陆客户端.xshell用户体验更好一点.但这里都学一下. putty下载地址:https://www.chiark.greenend.org.uk/~ ...
- Lua如何管理”package”
Lua如何管理"package" 方式一: 私有方法和变量都需要显式定义为local类型的,这很容易造成错误.一旦不小心漏写,就又将方法定义为全局的了. "package ...
- hdu 4717 Tree2cycle(树形DP)
Tree2cycle Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)Tot ...
- 2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest J Cleaner Robot
Cleaner RobotCrawling in process... Crawling failed Time Limit:2000MS Memory Limit:524288KB ...
- Assigning Workstations
题目链接:http://vjudge.net/contest/127404#problem/A /* 给你n个数字,让你找出一个最小的数字,这个数字不在这些数字中出现的 ,注意:这个数字如果各个位上的 ...
- linux dig 命令
dig 命令主要用来从 DNS 域名服务器查询主机地址信息. 查询单个域名的 DNS 信息 dig 命令最典型的用法就是查询单个主机的信息. $ dig baidu.com dig 命令默认的输出信息 ...
- c++学习笔记---05--- C++输出输入小结
C++输出输入小结 题目: 这个程序将向用户提出一个"Y/N"问题,然后把用户输入的值赋值给answer变量. 要求: 针对用户输入'Y'或'y'和'N'或'n'进行过滤: 发掘程 ...
- sql 1.1 1.1.1 1.10.1 排序
解决思路:计算每位的权重,得到序号完整的权重值,使用权重值进行排序! 创建sql 函数如下: ALTER FUNCTION [dbo].[SequenceToOrderNum] ( @Sequence ...
- angualr4 路由 总结笔记
使用cli命令创建根路由模块 ng g cl app.router 或自己建一个路由配置文件 如:app/app.router.ts // app/app.router.ts // 将文件修改为 im ...