Oracle中join left,join right,inner join,(+) 等
建表create table TEST1
create table TEST1
(
t_id VARCHAR2(21),
t_name VARCHAR2(21),
t_mangerid VARCHAR2(21)
)
create table TEST2
(
t_id VARCHAR2(21),
salary NUMBER
)
test1 暂且叫员工表吧,test2薪水表
在oracle中 外链接为 a left/right join b on a.xx =
b.xx其中join后面也可以添加outer也可以省略,相当于a.xx = b.xx
(+)(此时为左链接),写法的历史与优劣本文暂不讨论,只针对简单的左右链接,外链接,全链接等,对应的关键字如下:
CROSS JOIN 笛卡尔乘积(所有可能的行对)
INNER JOIN 仅对满足连接条件的CROSS中的列
LEFT OUTER JOIN 一个表满足条件的行,和另一个表的所有行
RIGHT OUTER JOIN 与LEFT相同,但两个表的角色互换
FULL OUTER JOIN LEFT OUTER 和 RIGHT OUTER中所有行的超集
链接定义如下:
连接类型 定义
内连接 只连接匹配的行
左外连接 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行
右外连接 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行
全外连接 包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。
(H)(theta)连接 使用等值以外的条件来匹配左、右两个表中的行
交叉连接 生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行 都一一匹配
现对以上每种链接做一个查询,在数据库中插入如下数据:
TEST1中
1 001 dyf 003
2 002 xwc 003
3 003 mm
TEST2中
1 001 7000
2 002 5000
3 009 10000
- inner join内链接
select a.t_name, b.salary
from test1 a
full join test2 b
on a.t_id = b.t_id结果如下 1 dyf 7000
2 xwc 5000
3 10000
4 mm
5. 自身链接select a.t_id,a.t_name, b.t_name
from test1 a
join test1 b
on a.t_mangerid = b.t_id查询员工管理者的姓名
结果如下 1 002 xwc mm
2 001 dyf mm
6. 交叉无限制链接交叉连接用于对两个源表进行纯关系代数的乘运算。它不使用连接条件来限制结果集合,而是将分别来自两个数据源中的行以所有可能的方式进行组合。数据集合中
一的每个行都要与数据集合二中的每一个行分别组成一个新的行。例如,如果第一个数据源中有5个行,而第二个数据源中有4个行,那么在它们之间进行交叉连接
就会产生20个行。人们将这种类型的结果集称为笛卡尔乘积。
大多数交叉连接都是由于错误操作而造成的;但是它们却非常适合向数据库中填充例子数据,或者预先创建一些空行以便为程序执行期间所要填充的数据保留空间。
select a.t_id,a.t_name,b.t_id,b.salary
from test1 a
cross join test2 b
select a.t_name, b.salary
from test1 a
inner join test2 b
on a.t_id = b.t_id
此语句与下面语句相同
select a.t_name, b.salary
from test1 a, test2 b
where a.t_id = b.t_id
查询的是员工的薪水,只有两个表中匹配才会出现查询出结果,结果如下
1 dyf 7000
2 xwc 5000
2. left join on左外连接
select a.t_name, b.salary
from test1 a
left join test2 b
on a.t_id = b.t_id
与
select a.t_name, b.salary
from test1 a, test2 b
where a.t_id = b.t_id(+)相同
查询员工的薪水,不管新水表中是否有此员工的记录都会把此员工显示出来,结果如下
1 dyf 7000
2 xwc 5000
3 mm
3. right join on右外连接
select a.t_name, b.salary
from test1 a
right join test2 b
on a.t_id = b.t_id
查询员工的薪水,不管员工表中是否存在薪水表中对应的员工都会把薪水表数据选出来,结果如下
1 dyf 7000
2 xwc 5000
3 10000
4. full join on 全链接
left join和(+)的区别和联系
Oracle 建议你用在From语句后用Outer Join语法 而不是Oracle的Join操作符(+).而且(+)是要受下面的规则限制的,但Outer Join语法则不受的~~
1)你不可以在查询块中使用(+) 当它同时包含 join的from语句中
2)(+)只是在where语句中,并且只能对应一个表或视图的一行字段
3)如果A和B做联接时有多个条件,那么(+)必须完善所有的匹配条件,
如果没有 ,oracle不会警告你~只是结果自然不同的
4)不可以在作出一个表外查询 另张表内查询的(+)联接操作~~
5)不可以用(+)外联接到自己 当然Self Join是可以的
6)含(+)的Where后的注意
OR不可用
IN不可用
子查询不可用
以下给些个例子:
SQL code
SQL>desc part
Name Null? Type
----------------------------------------- -------- -----------------
PART_ID NOTNULLVARCHAR2(4)
SUPPLIER_ID VARCHAR2(4)
SQL>select*from part;
PART SUPP
---- ----
P1 S1
P2 S2
P3
P4
SQL>desc supplier
Name Null? Type
----------------------------------------- -------- -----------------
SUPPLIER_ID NOTNULLVARCHAR2(4)
SUPPLIER_NAME NOTNULLVARCHAR2(20)
SQL>select*from supplier;
SUPP SUPPLIER_NAME
---- --------------------
S1 Supplier#1
S2 Supplier#2
S3 Supplier#3
SQL>select p.part_id, s.supplier_name
2from part p, supplier s
3where p.supplier_id = s.supplier_id (+);
PART SUPPLIER_NAME
---- --------------------
P1 Supplier#1
P2 Supplier#2
P3
P4
--(+)是单向的
SQL>select p.part_id, s.supplier_name
2from part p, supplier s
3where p.supplier_id (+) = s.supplier_id (+);
where p.supplier_id (+) = s.supplier_id (+)
*
ERROR at line 3:
ORA-01468: a predicate may reference only one outer-joined table
--实现Full Join的方法
SQL>select p.part_id, s.supplier_name
2from part p, supplier s
3where p.supplier_id = s.supplier_id (+)
4union
5select p.part_id, s.supplier_name
6from part p, supplier s
7where p.supplier_id (+) = s.supplier_id;
PART SUPPLIER_NAME
---- --------------------
P1 Supplier#1
P2 Supplier#2
P3
P4
Supplier#3
--现在的语法
SQL>select p.part_id, s.supplier_name
2from part p fullouterjoin supplier s
3on p.supplier_id = s.supplier_id;
PART SUPPLIER_NAME
---- --------------------
P1 Supplier#1
P2 Supplier#2
P4
P3
Supplier#3
另外的EG:
SQL code
SQL>select*from testa;
ID NAME ADDR AGE
---------- ------ ------ ----------
3 电子 南京 23
5 物理 北京 23
6 物理 河北 25
1 电脑 上海 23
2 电子 北京 22
4 物理 芜湖 22
7 艺术 上海 21
8 歌剧 苏州 16
9 沈亮 上海 22
已选择9行。
SQL>select*from testb;
ID ADDR
---------- ----------
7 上海
1 北京
3 上海
5 合肥
--匹配完全
select testa.id,testa.addr from testa,testb where testa.id(+)=testb.id and
testa.addr(+)=testb.addr;
ID ADDR
---------- ------
7 上海
现在的Outer Join方法是Oracle9i时开始引用的 ANSI标准的联接语法,现在的则比较直观 简单
通过上边Full Join的实现方式 不难看到ANSI的联接语法要比用含Union的(+)的执行效率更高~~
Oracle中join left,join right,inner join,(+) 等的更多相关文章
- oracle中left join,right join,inner join的坑
本文主要是记录一下实际使用oracle中join查询遇到的坑 1.用到两张表,学生表和学年分数表,先建立 2.普通连接查询 INNER JOIN,查询每个学年有成绩的学生以及分数情况 LFET JOI ...
- Oracle中 (+)与left join 的用法区别
Oracle中 (+)与left join 的用法区别 原创 2017年01月11日 13:33:42 6648 select * from a,b where a.id=b.id(+); (+)写在 ...
- Bullet:关于ORACLE中的HASH JOIN的参数变化
Oracle在7.3引入了hash join. 但是在Oracle 10g及其以后的Oracle数据库版本中,优化器,实际是CBO,也是因为HASH JOIN仅适用于CBO,在解析目标SQL时是否考虑 ...
- 数据库中的左连接(left join)和右连接(right join)区别
Left Join / Right Join /inner join相关 关于左连接和右连接总结性的一句话: 左连接where只影向右表,右连接where只影响左表. Left Join select ...
- Oracle 表的连接方式(2)-----HASH JOIN的基本机制3
HASH JOIN的模式 hash join有三种工作模式,分别是optimal模式,onepass模式和multipass模式,分别在v$sysstat里面有对应的统计信息: SQL> sel ...
- 在Linq to sql 和 Entity framework 中使用lambda表达式实现left join
在Linq to sql 和 Entity framework 中使用lambda表达式实现left join 我们知道lambda表达式在Linq to sql 和 Entity framework ...
- SQL学习笔记之SQL中INNER、LEFT、RIGHT JOIN的区别和用法详解
0x00 建表准备 相信很多人在刚开始使用数据库的INNER JOIN.LEFT JOIN和RIGHT JOIN时,都不太能明确区分和正确使用这三种JOIN操作,本文通过一个简单的例子通俗易懂的讲解这 ...
- SQL中LEFT JOIN ON AND 与 LEFT JOIN ON WHERE的区别
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户. ON...WHERE ' order by ts.id SQL执行过程: 生成临时表: ON条件: ...
- MySQL的JOIN(四):JOIN优化实践之快速匹配
这篇博文讲述如何优化扫描速度.我们通过MySQL的JOIN(二):JOIN原理得知了两张表的JOIN操作就是不断从驱动表中取出记录,然后查找出被驱动表中与之匹配的记录并连接.这个过程的实质就是查询操作 ...
随机推荐
- 关于接收POST请求 $GLOBALS['HTTP_RAW_POST_DATA']
总是产生变量包含有原始的 POST 数据.否则,此变量仅在碰到未识别 MIME 类型的数据时产生.不过,访问原始 POST 数据的更好方法是 php://input.$HTTP_RAW_POST_DA ...
- OCP读书笔记(21) - 题库(ExamA)
Administer ASM disk groupsBack up the recovery catalogConfigure backup settingsConfigure, Monitor Fl ...
- 一Flash从入门开发者放弃了成长之路
本文将依照入门.成长.转行三个关键词来讲述作者这些年使用Flash进行项目开发的整个历史过程. 一.入门--開始走上Flash的道路. 和Flash的机缘要从大学时代说起.2005年下半年.学校开设了 ...
- URAL 1727. Znaika's Magic Numbers(数学 vector)
主题链接:http://acm.timus.ru/problem.aspx?space=1&num=1727 1727. Znaika's Magic Numbers Time limit: ...
- 使用Eclipse+Maven+Jetty构建Java Web开发环境(几个教程综合集成2014发行)
工作需要使用Jetty由于web集装箱,得知Eclipse+Maven+Jetty该组合是非常好的,因此,要在网上找了很多教程,但不写或多或少特定的或过时的内容而导致最终的配置失败,易于配置为未来的同 ...
- UBUNTU如何改变mysql默认文件夹数据文件夹
停止mysql维修 * sudo /etc/init.d/mysql stop 原始文件夹的副本 * cp -r /var/lib/mysql /home/yourname/somewhere 改动权 ...
- Thinking in UML 学习笔记(四)——UML活动图来看核心
在UML活动图的性质是一个流程图,它需要描述为完成活动的特定目标的描述来完成,这些交互运行顺序. UML有两个级别的活动图,的用例场景的叙述性描述,还有的对象用来描述交互的描述. 工具.它不是我们的分 ...
- GCD(1222)Wolf and Rabbit
Problem Description There is a hill with n holes around. The holes are signed from 0 to n-1. A rabbi ...
- Android自己定义组件系列【8】——面膜文字动画
我们掩盖文字动画Flash中非经货共同体共同,由于Android应用程序开发人员做你想要做这个动画在应用程序中去?本文中,我们看的是如何自己的定义ImageView来实现让一张文字图片实现文字的遮罩闪 ...
- Sql Server 2008R2版本中有关外键Foreign的使用
原文:Sql Server 2008R2版本中有关外键Foreign的使用 1. 在数据库设计的过程中往往会想让2张表进行关联而使用到Foreign从而加强2张表之间的约束(如图) 以前有个问题一直没 ...