表的内连接(INNNER JOIN)必须保证该条数据在每张表都存在
=======================================================================================================================================
左连接,在左表数据大于右边的数据情况下,则以左表的数据全部展示,右表数据则为null展示。在右表数据大于且有重复的情况下,数据则无法全展示。比如左表有1、2、3.右表有1、2、3、1。
那么得到的数据是1、2、3、1.而非1、2、3、1、2、3
=============================================================================================================================
left join后面加上where条件浅析
select a.*,b.*
from table1 a
left join table2 b on b.X=a.X
where XXX
如上:一旦使用了left join,没有where条件时,左表table1会显示全部内容,使用了where,只有满足where条件的记录才会显示(左表显示部分或者全部不显示)
left join的困惑:一旦加上where条件,则显示的结果等于inner join
原因分析:
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户;
where条件是在临时表生成好后,再对临时表进行过滤的条件;
因此:where 条件加上,已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
解决方案:
1、where过滤结果作为子查询,和主表left,如下:
select a.*,tmp.*
from table1 a
left join(
select a.*,b.*
from table1 a
left join table2 b on b.X=a.X
where XXX
)tmp
很明显,子查询语句无论 left join、inner join都没啥区别了
2、查询条件放在on后面
select
a.*,b.*
from
table1 a
left
join
table2 b
on
b.X=a.X
and
XXX
注意:where XXX去掉,改为链接条件on后面的 and XXX
分析:
on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
结论 a表和b表 做关联
1. on a.id=b.id and a.name='张三' 这种在on后边直接and 的对a表无效 只要不加where 左边永远都是全显示
2.on a.id=b.id where a.name='张三' 这种则查出只有是张三的数据
===========================================================================================================================================
在项目中用到多表联合查询,发现2个现象,今天解决这2个疑问:
1、left join连接2张表,on后的条件第一个生效,用and连接的其他条件不生效;
2、一旦加上where,则显示的结果等同于inner join;
先写结论:
过滤条件放在:
where后面:是先连接然生成临时查询结果,然后再筛选
on后面:先根据条件过滤筛选,再连 生成临时查询结果
table1 left join table2 on 条件1(有效) and 条件2(无效)
table1 left join table2 on 条件1(有效) where 条件2(有效)
table1 left join table2 on (条件1(有效) and 条件2(有效))
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)