sql join的用法詳解

1. INNER JOIN
內連接,返回多個表中符合條件的數據而捨棄不符合條件的數據。
Run:
SELECT* FROM TABLE_POICATE1 C1 INNERJOIN TABLE_POICATE2 C2 ON C1.CATE1_CODE=C2.CATE1_CODE INNERJOIN TABLE_POICATE3 C3 ON C2.CATE1_CODE=C3.CATE1_CODE AND C2.CATE2_CODE=C3.CATE2_CODE WHERE C3.CATE1_CODE="04" AND C3.CATE2_CODE="02" AND C3.CATE3_CODE="03";
<=>
SELECT* FROM TABLE_POICATE1 C1, TABLE_POICATE2 C2, TABLE_POICATE3 C3 WHERE C3.CATE1_CODE=C2.CATE1_CODE AND C3.CATE2_CODE=C2.CATE2_CODE AND C2.CATE1_CODE=C1.CATE1_CODE AND (C3.CATE1_CODE="04" AND C3.CATE2_CODE="02" AND C3.CATE3_CODE="03");

Result:
04 金融機構 JRJG 0402 政策性銀行 ZCXYH 040203 中國農業發展銀行 ZGNYFZYH

按我們需要的格式聯接起來:
Run:
SELECT C1.CATE1_NAME || "/" || C2.CATE2_NAME || "/" || C3.CATE3_NAME AS CATENAME FROM TABLE_POICATE1 C1 INNERJOIN TABLE_POICATE2 C2 ON C1.CATE1_CODE=C2.CATE1_CODE INNERJOIN TABLE_POICATE3 C3 ON C2.CATE1_CODE=C3.CATE1_CODE AND C2.CATE2_CODE=C3.CATE2_CODE WHERE C3.CATE1_CODE="04" AND C3.CATE2_CODE="02" AND C3.CATE3_CODE="03";

Result:
金融機構/政策性銀行/中國農業發展銀行

2.OUTER JOIN
2.1. LEFT OUTER JOIN/LEFT JOIN
左連接,返回所有匹配行並從join左邊表中返回所有不匹配的行,右邊表用null填充
Run:
SELECT* FROM TABLE_POICATE1 C1 RIGHTJOIN TABLE_POICATE2 C2 ON C2.CATE1_CODE=C1.CATE1_CODE

Result:
02 政府機構 ZFJG 0204 邊檢機關 BJJG 02 政府機構 ZFJG 0205 涉外機構 SWJG 02 政府機構 ZFJG 0206 駐地機構 ZDJG 02 政府機構 ZFJG 0207 民主黨派 MZDP ...

Run:
代碼
SELECT C3.CATE1_CODE,C3.CATE2_CODE,C3.CATE3_CODE,C1.CATE1_NAME,C2.CATE2_NAME,C3.CATE3_NAME FROM TABLE_POICATE1 C1 LEFTJOIN TABLE_POICATE2 C2 ON C1.CATE1_CODE=C2.CATE1_CODE LEFTJOIN TABLE_POICATE3 C3 ON C2.CATE1_CODE=C3.CATE1_CODE AND C2.CATE2_CODE=C3.CATE2_CODE

Result:
070599 工商企業 紡織服裝 其它 070601 工商企業 電子電器 電子電器 070602 工商企業 電子電器 電工照明 070699 工商企業 電子電器 其它 070701 工商企業 儀表儀器 儀表儀器 070799 工商企業 儀表儀器 其它 ...

這個得出的列表就是正常情況下我們一般需要的結果了。。。
在一類表中插入17門址類,再連接。。。
99 其它 QT 9999 其它 QT 17 門址 mz {null} {null} {null} {null}

2.2. RIGHT OUTER JOIN/RIGHT JOIN
右連接,返回所有匹配行並從join右邊表返回所有不匹配行,左邊表沒有的用null填充
其實它就是剛好和左連接對稱啦
2.3. FULL OUTER JOIN/FULL JOIN
全連接,返回所有匹配的行和不匹配的行。
SQLite不支持右連接和全連接
NND,就不測試了,反正結果已經知道了。
3. CROSS JOIN
交叉連接,返回笛卡爾積
SELECT*FROM TABLE_CATE1 CROSSJOIN TABLE_CATE2

<=>
SELECT*FROM TABLE_CATE1, TABLE_CATE2

如果TABLE_CATE1有m行,TABLE_CATE2有n行,那返回的結果是m×n行的。
4. 自連接
自己練自己嘍,好像不叫self join。。。
下面是我現學現賣在霏凡上舉給別人的例子:
一家有三代人,這三代之間肯定是父子關係無疑吧? 
1、三代人關係:
張爺爺 -> 張爸爸 -> 張兒子
2、做成表(test)來反映
名字  他爹  他兒子
--------------------------------
張爺爺  null  張爸爸
張爸爸  張爺爺  張兒子
張兒子  張爸爸  null
3、用SQL查這家的樹形關係圖
SELECT A.名字 AS 老爸, B.名字 AS 兒子 FROM test A JOIN test B ON A.他兒子=B.他爹

結果:
老爸   兒子
--------------------
張爺爺 張爸爸
張爸爸 張兒子
 
-END-

--------------------------

如果你對java、swing、各種框架、javascript、css、linux、數據庫編程等知識很感興趣,或者正在從事這些工作,

歡迎加入我的qq技術交流羣:java不瘸腿(219345774)

發佈了24 篇原創文章 · 獲贊 1 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章