sql join的用法詳解
阿新 • • 發佈:2019-01-03
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)