sql join的用法详解

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-

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

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值