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 是缺省; 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)