Chinaunix首页 | 论坛 | 博客
  • 博客访问: 721194
  • 博文数量: 5
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 2500
  • 用 户 组: 普通用户
  • 注册时间: 2005-11-24 15:24
文章分类

全部博文(5)

文章存档

2010年(2)

2008年(3)

我的朋友

分类: Oracle

2010-06-12 16:05:45

  1. 条件连接(join)   
  2. T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 ON boolean_expression  
  3. T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 USING ( join column list )  
  4. T1 NATURAL { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2  
  5. INNER 和 OUTER 对 所有连接(join) 类型都是可选的.INNER 是缺省; LEFT,RIGHT,和 FULL 隐含外连接.   
  6.   
  7. 连 接条件在ON或USING子句里声明, 或者用关键字NATURAL隐含地声明.连接条件判断来自两个源表 中的那些行是"匹配"的,这些我们将在下面详细解释.   
  8.   
  9. ON 子句是最常见的连接条件的类型∶它接收一个和WHERE子句里用的一样的 布尔值表达式.如果两个分别来自T1和T2的行在ON表达式上运算的 结果为 真,那么它们就算是匹配的行.   
  10.   
  11. 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的时候每个字段就只会有一个.   
  12.   
  13. 最 后,NATURAL 是USING 的缩写形式∶它形成一个 USING 列表, 该列表由那些在两个表里都出现了的字段名字组成.和USING一 样, 这些字段只在输出表里出现一次.   
  14.   
  15. 条件 JOIN的可能类型是∶   
  16.   
  17.   
  18. INNER JOIN   
  19. 对 于 T1 的每一行 R1,生成的连接表都有一行对应 T2 中的 每一个满足和 R1 的连接条件的行.   
  20.   
  21. LEFT OUTER JOIN   
  22. 首 先,执行一次内连接.然后,为 T1 里那些和 T2 里任何一行都不满足连接条件的行返回一个连接行, 同时该连接行里对应 T2 的列用空值补齐.因 此, 生成的连接表里无条件地包含来自 T1 里的每一行至少 一个副本.   
  23.   
  24. RIGHT OUTER JOIN   
  25. 首 先,执行一次内连接.然后,为 T2 里那些和 T1 里任何一行都不满足连接条件的行返回一个连接行, 同时该连接行里对应 T1 的列用空值补齐.因 此, 生成的连接表里无条件地包含来自 T2 里的每一行.   
  26.   
  27. FULL OUTER JOIN   
  28. 首 先,执行一次内连接.然后,为 T1 里那些和 T2 里任何一行都不满足连接条件的行返回一个连接行, 同时该连接行里对应 T2 的列用空值补 齐. 同样,为 T2 里那些和 T1 里的任何行都不满足连接条件的 行返回一个连接行,该行里对应 T1 的列用空值补齐.   
  29.   
  30. 如 果 T1 和 T2 有一个或者都是可以连接(join)的表, 那么所有类型的连接都可以串在一起或嵌套在一起. 你可以在JOIN子句周围使用圆括弧 来控制连接顺序, 如果没有圆括弧,那么JOIN子句是从左向右嵌套的.   
  31.   
  32. 为 了解释这些问题,假设我们有一个表 t1   
  33.   
  34.  num | name  
  35. -----+------  
  36.    1 | a  
  37.    2 | b  
  38.    3 | c  
  39. 和 t2   
  40.   
  41.  num | value  
  42. -----+-------  
  43.    1 | xxx  
  44.    3 | yyy  
  45.    5 | zzz  
  46. 然后我们用 不同的连接方式可以获得各种结果:   
  47.   
  48. => SELECT * FROM t1 CROSS JOIN t2;  
  49.  num | name | num | value  
  50. -----+------+-----+-------  
  51.    1 | a    |   1 | xxx  
  52.    1 | a    |   3 | yyy  
  53.    1 | a    |   5 | zzz  
  54.    2 | b    |   1 | xxx  
  55.    2 | b    |   3 | yyy  
  56.    2 | b    |   5 | zzz  
  57.    3 | c    |   1 | xxx  
  58.    3 | c    |   3 | yyy  
  59.    3 | c    |   5 | zzz  
  60. (9 rows)  
  61.   
  62. => SELECT * FROM t1 INNER JOIN t2 ON t1.num = t2.num;  
  63.  num | name | num | value  
  64. -----+------+-----+-------  
  65.    1 | a    |   1 | xxx  
  66.    3 | c    |   3 | yyy  
  67. (2 rows)  
  68.   
  69. => SELECT * FROM t1 INNER JOIN t2 USING (num);  
  70.  num | name | value  
  71. -----+------+-------  
  72.    1 | a    | xxx  
  73.    3 | c    | yyy  
  74. (2 rows)  
  75.   
  76. => SELECT * FROM t1 NATURAL INNER JOIN t2;  
  77.  num | name | value  
  78. -----+------+-------  
  79.    1 | a    | xxx  
  80.    3 | c    | yyy  
  81. (2 rows)  
  82.   
  83. => SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num;  
  84.  num | name | num | value  
  85. -----+------+-----+-------  
  86.    1 | a    |   1 | xxx  
  87.    2 | b    |     |  
  88.    3 | c    |   3 | yyy  
  89. (3 rows)  
  90.   
  91. => SELECT * FROM t1 LEFT JOIN t2 USING (num);  
  92.  num | name | value  
  93. -----+------+-------  
  94.    1 | a    | xxx  
  95.    2 | b    |  
  96.    3 | c    | yyy  
  97. (3 rows)  
  98.   
  99. => SELECT * FROM t1 RIGHT JOIN t2 ON t1.num = t2.num;  
  100.  num | name | num | value  
  101. -----+------+-----+-------  
  102.    1 | a    |   1 | xxx  
  103.    3 | c    |   3 | yyy  
  104.      |      |   5 | zzz  
  105. (3 rows)  
  106.   
  107. => SELECT * FROM t1 FULL JOIN t2 ON t1.num = t2.num;  
  108.  num | name | num | value  
  109. -----+------+-----+-------  
  110.    1 | a    |   1 | xxx  
  111.    2 | b    |     |  
  112.    3 | c    |   3 | yyy  
  113.      |      |   5 | zzz  
  114. (4 rows)  
  115.   
  116. 用 ON 声 明的连接条件也可以包含与连接不直接相关 的条件。这种功能可能对某些查询很有用,但是需要我们仔细想想。 比如:   
  117.   
  118. => SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num AND t2.value = 'xxx';  
  119.  num | name | num | value  
  120. -----+------+-----+-------  
  121.    1 | a    |   1 | xxx  
  122.    2 | b    |     |  
  123.    3 | c    |     |  
  124. (3 rows) 
阅读(760) | 评论(0) | 转发(0) |
0

上一篇:Operational data store versus a data warehouse

下一篇:没有了

给主人留下些什么吧!~~