Oracle join

Oracle join

Java代碼

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 是缺省; LEFTRIGHT,和 FULL 隱含外連接.

6.

7.連接條件在ONUSING子句裏聲明,或者用關鍵字NATURAL隱含地聲明.連接條件判斷來自兩個源表中的那些行是"匹配"的,這些我們將在下面詳細解釋.

8.

9.ON子句是最常見的連接條件的類型它接收一個和WHERE子句裏用的一樣的布爾值表達式.如果兩個分別來自T1T2的行在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,那麼在結果裏 ab,和 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)  



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章