sql join的用法详解

来源:互联网 发布:vibe算法matlab代码 编辑:程序博客网 时间:2024/05/15 04:47
【转】:http://www.cnblogs.com/fatway/archive/2009/04/17/1693816.html
1. INNER JOIN
内连接,返回多个表中符合条件的数据而舍弃不符合条件的数据。
Run:
SELECT*FROM TABLE_POICATE1 C1 INNERJOIN TABLE_POICATE2 C2ON C1.CATE1_CODE=C2.CATE1_CODE INNERJOIN TABLE_POICATE3 C3ON C2.CATE1_CODE=C3.CATE1_CODE AND C2.CATE2_CODE=C3.CATE2_CODEWHERE C3.CATE1_CODE="04" AND C3.CATE2_CODE="02" AND C3.CATE3_CODE="03";
<=>
SELECT*FROM TABLE_POICATE1 C1, TABLE_POICATE2 C2, TABLE_POICATE3 C3WHERE C3.CATE1_CODE=C2.CATE1_CODE AND C3.CATE2_CODE=C2.CATE2_CODE ANDC2.CATE1_CODE=C1.CATE1_CODEAND (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 CATENAMEFROM TABLE_POICATE1 C1 INNERJOIN TABLE_POICATE2 C2ON C1.CATE1_CODE=C2.CATE1_CODE INNERJOIN TABLE_POICATE3 C3ON C2.CATE1_CODE=C3.CATE1_CODE AND C2.CATE2_CODE=C3.CATE2_CODEWHERE 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 C2ON C2.CATE1_CODE=C1.CATE1_CODE

Result:
02 政府机构 ZFJG 0204 边检机关 BJJG02 政府机构 ZFJG 0205 涉外机构 SWJG02 政府机构 ZFJG 0206 驻地机构 ZDJG02 政府机构 ZFJG 0207 民主党派 MZDP...

Run:
代码
SELECT C3.CATE1_CODE,C3.CATE2_CODE,C3.CATE3_CODE,C1.CATE1_NAME,C2.CATE2_NAME,C3.CATE3_NAMEFROM TABLE_POICATE1 C1 LEFTJOIN TABLE_POICATE2 C2ON C1.CATE1_CODE=C2.CATE1_CODE LEFTJOIN TABLE_POICATE3 C3ON C2.CATE1_CODE=C3.CATE1_CODE AND C2.CATE2_CODE=C3.CATE2_CODE

Result:
070599 工商企业 纺织服装 其它070601 工商企业 电子电器 电子电器070602 工商企业 电子电器 电工照明070699 工商企业 电子电器 其它070701 工商企业 仪表仪器 仪表仪器070799 工商企业 仪表仪器 其它...

这个得出的列表就是正常情况下我们一般需要的结果了。。。
在一类表中插入17门址类,再连接。。。
99 其它 QT 9999 其它 QT17 门址 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 BON A.他儿子=B.他爹

结果:
老爸   儿子
--------------------
张爷爷 张爸爸
张爸爸 张儿子
 
-END-

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

如果你对java、swing、各种框架、javascript、css、linux、数据库编程等知识很感兴趣,或者正在从事这些工作,

欢迎加入我的qq技术交流群:java不瘸腿(219345774)

原创粉丝点击