SQL JOIN用法
昨天搞培训老颉将了数据库和SQL的一些知识,大部分还是明白的,对SQL的连接部分不是很清楚,今天彻底搞明白它算了,学习ing...
1. INNER JOIN
内连接,返回多个表中符合条件的数据而舍弃不符合条件的数据。
Run:
SELECT *
FROM TABLE_POICATE1 C1 INNER JOIN TABLE_POICATE2 C2
ON C1.CATE1_CODE=C2.CATE1_CODE INNER JOIN 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 04 02 政策性银行 ZCXYH 04 02 03 中国农业发展银行 ZGNYFZYH
按我们需要的格式联接起来:
Run:
SELECT C1.CATE1_NAME || "/" || C2.CATE2_NAME || "/" || C3.CATE3_NAME AS CATENAME
FROM TABLE_POICATE1 C1 INNER JOIN TABLE_POICATE2 C2
ON C1.CATE1_CODE=C2.CATE1_CODE INNER JOIN 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 RIGHT JOIN TABLE_POICATE2 C2
ON C2.CATE1_CODE=C1.CATE1_CODE
Result:
02 政府机构 ZFJG 02 04 边检机关 BJJG
02 政府机构 ZFJG 02 05 涉外机构 SWJG
02 政府机构 ZFJG 02 06 驻地机构 ZDJG
02 政府机构 ZFJG 02 07 民主党派 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 LEFT JOIN TABLE_POICATE2 C2
ON C1.CATE1_CODE=C2.CATE1_CODE LEFT JOIN TABLE_POICATE3 C3
ON C2.CATE1_CODE=C3.CATE1_CODE AND C2.CATE2_CODE=C3.CATE2_CODE
Result:
07 05 99 工商企业 纺织服装 其它
07 06 01 工商企业 电子电器 电子电器
07 06 02 工商企业 电子电器 电工照明
07 06 99 工商企业 电子电器 其它
07 07 01 工商企业 仪表仪器 仪表仪器
07 07 99 工商企业 仪表仪器 其它
...
这个得出的列表就是正常情况下我们一般需要的结果了。。。
在一类表中插入17门址类,再连接。。。
99 其它 QT 99 99 其它 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 CROSS JOIN 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-