Oracle join用法

join用法 
条件连接(join)
T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 ON boolean_expression
T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 USING ( join column list )
T1 NATURAL { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2
INNER 和 OUTER 对所有连接(join) 类型都是可选的.INNER 是缺省; LEFT,RIGHT,和 FULL 隐含外连接.
连接条件在ON或USING子句里声明, 或者用关键字NATURAL隐含地声明.连接条件判断来自两个源表 中的那些行是"匹配"的,这些我们将在下面详细解释.
ON子句是最常见的连接条件的类型∶它接收一个和WHERE子句里用的一样的 布尔值表达式.如果两个分别来自T1和T2的行在ON表达式上运算的 结果为真,那么它们就算是匹配的行.
USING是缩写的概念∶它接收一个用逗号分隔的字段名字列表, 这些字段必须是连接表共有的,最终形成一个连接条件,表示 这些字段对必须相同.最后,JOIN USING 的输出会为每一对相等 的输入字段输出一个字段,后面跟着来自各个表的所有其它字段. 因此,USING (a, b, c) 等效于 ON (t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c) 只不过是如果使用了ON,那么在结果里 a,b,和 c字段每个都会有两个, 而用USING的时候每个字段就只会有一个.
最后,NATURAL 是USING 的缩写形式∶它形成一个 USING 列表, 该列表由那些在两个表里都出现了的字段名字组成.和USING一样, 这些字段只在输出表里出现一次.
条件JOIN的可能类型是∶
INNER JOIN
对于 T1 的每一行 R1,生成的连接表都有一行对应 T2 中的 每一个满足和 R1 的连接条件的行.
LEFT OUTER JOIN
首先,执行一次内连接.然后,为 T1 里那些和 T2 里任何一行都不满足连接条件的行返回一个连接行, 同时该连接行里对应 T2 的列用空值补齐.因此, 生成的连接表里无条件地包含来自 T1 里的每一行至少 一个副本.
RIGHT OUTER JOIN
首先,执行一次内连接.然后,为 T2 里那些和 T1 里任何一行都不满足连接条件的行返回一个连接行, 同时该连接行里对应 T1 的列用空值补齐.因此, 生成的连接表里无条件地包含来自 T2 里的每一行.
FULL OUTER JOIN
首先,执行一次内连接.然后,为 T1 里那些和 T2 里任何一行都不满足连接条件的行返回一个连接行, 同时该连接行里对应 T2 的列用空值补齐. 同样,为 T2 里那些和 T1 里的任何行都不满足连接条件的 行返回一个连接行,该行里对应 T1 的列用空值补齐.
如果 T1 和 T2 有一个或者都是可以连接(join)的表, 那么所有类型的连接都可以串在一起或嵌套在一起. 你可以在JOIN子句周围使用圆括弧来控制连接顺序, 如果没有圆括弧,那么JOIN子句是从左向右嵌套的.

举例说明:

--创建部门表R_DEPT,雇员表r_empd
create table R_DEPT
(
  DEPTNO   NUMBER(10) not null,
  DEPTNAME VARCHAR2(30) not null
);
alter table R_DEPT
  add constraint PK_R_DEPT primary key (DEPTNO);

create table R_EMPD
(
  EMPNO NUMBER(10) not null,
  FNAME VARCHAR2(20),
  LNAME VARCHAR2(20),
  DEPT  NUMBER(10)
);

alter table R_EMPD
  add constraint PK_EMP primary key (EMPNO);

部门表数据

select * from r_dept;

image

雇员表数据

select * from r_empd;

image

 

INNER JOIN如下:

  1. 以下两个查询条件效果一样
    1. select d.*,e.* from r_dept d,r_empd e where d.deptno = e.dept and d.deptno>2;
    2. select d.*,e.* from r_dept d inner join r_empd e on d.deptno = e.dept and d.deptno>2;
      结果如下:
    3. image 

LEFT JOIN如下:

隐藏行号 复制代码 这是一段程序代码。
  1. select d.*,e.* from r_dept d inner join r_empd e on d.deptno = e.dept and d.deptno>2;
  2. select d.*,e.* from r_dept d left join r_empd e on d.deptno = e.dept and d.deptno>2;

image

LEFT OUTER JOIN
首先,执行一次内连接.然后,为 T1 里那些和 T2 里任何一行都不满足连接条件的行返回一个连接行, 同时该连接行里对应 T2 的列用空值补齐.因此, 生成的连接表里无条件地包含来自 T1 里的每一行至少 一个副本.

首先执行一次内连接,查找到deptno 为3、4、5的三条数据,然后不满足查询条件d.deptno = e.dept and d.deptno>2的四条数据………………..

 

隐藏行号 复制代码 这是一段程序代码。
  1. select d.*,e.* from r_dept d full join r_empd e on d.deptno = e.dept and d.deptno>2 where d.deptno>3;

可以分析下上面语句执行结果,首先执行where条件,然后执行join连接;根据where条件过滤掉部门id小于3的,然后执行join连接,结果如下:

image

该测试是在oracle下执行的,SQLSERVER应该一样,可以测试下………………

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值