1.总结
A INNER JOIN B ON……:内联操作,将符合ON条件的A表和B表结果均搜索出来,然后合并为一个结果集。
A LEFT JOIN B ON……:左联操作,左联顾名思义是,将符合ON条件的B表结果搜索出来,
然后左联到A表上,然后将合并后的A表输出。
A RIGHT JOIN B ON……:右联操作,右联顾名思义是,将符合ON条件的A表结果搜索出来,
然后右联到B表上,然后将合并后的B表输出。
2.例子
这个博客,的例子不错
不错的例子
下面的小例子,引用的”Sql语句用left join 解决多表关联问题(关联套关联,例子和源码)”
表1:—————————— 【人事表】
表名:【Man】
字段: Man_Id,Man_Name,Zw_Id
1 貂蝉 2
2 曹操 1
表2:—————————— 【职务表】
表名:【Zw】
字段: Zw_Id,Zw_Name
1 校长
2 班主任
表3:—————————— 【工资表】
表名:【GZ】
字段: Man_Id,Money,Sex_Id
1 2500 1
2 4000 2
表3:—————————— 【性别表】
表名:【xb】
字段: Sex_Id,Sex_Name
1 女
2 男
需要的——————————- 【查询结果】:
Man_Id,Man_Name,sex_name,Zw_Name,Money
1 貂蝉 女 班主任 2500
2 曹操 男 校长 4000
方法一(推荐):
[sql] view plain copy
select a.man_id,man_name,d.sex_name,zw_name,c.money
from man as a
left join zw as b on a.zw_id=b.zw_id
left join gz as c on a.man_id=c.man_id
left join xb as d on c.sex_id=d.sex_id
方法二:
[sql] view plain copy
select Man_Id,Man_Name,sex_name,Zw_Name,Money from
(
select a.Man_Id,Man_Name,b.Zw_Id,Zw_Name,Money,Sex_Id from [Man] a
left join [Zw] b on a.Zw_Id=b.Zw_Id
left join [Gz] c on a.Man_Id=c.Man_Id
)t
left join xb m on m.Sex_Id=t.Sex_Id
方法三:
[sql] view plain copy
select man.man_id,man.man_name,xb.sex_name,zw_name,gz.money
from man
left join zw on man.zw_id=zw.zw_id
left join gz on man.man_id=gz.man_id
left join xb on gz.sex_id=xb.sex_id
3. on where 位置很重要
select * from
td
left join (
select case_id as sup_case_id , count(*) supervise_number from
td_kcdc_case_sup_info
group by case_id
) sup
on
sup.sup_case_id = td.case_id
where 1=1 /不能去掉, 否则认为and 后的条件为 联合查询时的条件, 不能起过滤作用,由于left join因此td表中记录将全部查出来/
and td.con = ‘xxxx’
总结:
对于left join,不管on后面跟什么条件,左表的数据全部查出来,因此要想过滤需把条件放到where后面
对于inner join,满足on后面的条件表的数据才能查出,可以起到过滤作用。也可以把条件放到where后面。
参考:
JOIN关联表中ON,WHERE后面跟条件的区别