设为首页 收藏本站
查看: 789|回复: 0

[经验分享] oracle join 连接查询

[复制链接]

尚未签到

发表于 2016-7-17 11:13:47 | 显示全部楼层 |阅读模式
                                                                                                                                         
                  
Java代码 


  • 条件连接(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子句是从左向右嵌套的.   
  •   
  • 为了解释这些问题,假设我们有一个表 t1   
  •   
  •  num | name  
  • -----+------  
  •    1 | a  
  •    2 | b  
  •    3 | c  
  • 和 t2   
  •   
  •  num | value  
  • -----+-------  
  •    1 | xxx  
  •    3 | yyy  
  •    5 | zzz  
  • 然后我们用不同的连接方式可以获得各种结果:   
  •   
  • => SELECT * FROM t1 CROSS JOIN t2;  
  •  num | name | num | value  
  • -----+------+-----+-------  
  •    1 | a    |   1 | xxx  
  •    1 | a    |   3 | yyy  
  •    1 | a    |   5 | zzz  
  •    2 | b    |   1 | xxx  
  •    2 | b    |   3 | yyy  
  •    2 | b    |   5 | zzz  
  •    3 | c    |   1 | xxx  
  •    3 | c    |   3 | yyy  
  •    3 | c    |   5 | zzz  
  • (9 rows)  
  •   
  • => SELECT * FROM t1 INNER JOIN t2 ON t1.num = t2.num;  
  •  num | name | num | value  
  • -----+------+-----+-------  
  •    1 | a    |   1 | xxx  
  •    3 | c    |   3 | yyy  
  • (2 rows)  
  •   
  • => SELECT * FROM t1 INNER JOIN t2 USING (num);  
  •  num | name | value  
  • -----+------+-------  
  •    1 | a    | xxx  
  •    3 | c    | yyy  
  • (2 rows)  
  •   
  • => SELECT * FROM t1 NATURAL INNER JOIN t2;  
  •  num | name | value  
  • -----+------+-------  
  •    1 | a    | xxx  
  •    3 | c    | yyy  
  • (2 rows)  
  •   
  • => SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num;  
  •  num | name | num | value  
  • -----+------+-----+-------  
  •    1 | a    |   1 | xxx  
  •    2 | b    |     |  
  •    3 | c    |   3 | yyy  
  • (3 rows)  
  •   
  • => SELECT * FROM t1 LEFT JOIN t2 USING (num);  
  •  num | name | value  
  • -----+------+-------  
  •    1 | a    | xxx  
  •    2 | b    |  
  •    3 | c    | yyy  
  • (3 rows)  
  •   
  • => SELECT * FROM t1 RIGHT JOIN t2 ON t1.num = t2.num;  
  •  num | name | num | value  
  • -----+------+-----+-------  
  •    1 | a    |   1 | xxx  
  •    3 | c    |   3 | yyy  
  •      |      |   5 | zzz  
  • (3 rows)  
  •   
  • => SELECT * FROM t1 FULL JOIN t2 ON t1.num = t2.num;  
  •  num | name | num | value  
  • -----+------+-----+-------  
  •    1 | a    |   1 | xxx  
  •    2 | b    |     |  
  •    3 | c    |   3 | yyy  
  •      |      |   5 | zzz  
  • (4 rows)  
  •   
  • 用 ON 声明的连接条件也可以包含与连接不直接相关 的条件。这种功能可能对某些查询很有用,但是需要我们仔细想想。 比如:   
  •   
  • => SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num AND t2.value = 'xxx';  
  •  num | name | num | value  
  • -----+------+-----+-------  
  •    1 | a    |   1 | xxx  
  •    2 | b    |     |  
  •    3 | c    |     |  
  • (3 rows)  
  
深圳人才网 深圳招聘网 深圳人才招聘网 深圳人才大市场 
企业、个人免费注册,获取想要的 深圳 软件工程师招聘信息 月薪最低3000-8000,更有高端猎头职位! 

www.szrcwz.com     DSC0000.png

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-245276-1-1.html 上篇帖子: Oracle 10g 基础练习题 下篇帖子: 个人总结—Oracle单行函数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表