前情提要:and 则是在表连接前过滤A表或B表里面哪些记录符合连接条件,同时会兼顾是left join还是right join。即
假如是左连接的话,如果左边表的某条记录不符合连接条件,那么它不进行连接,但是仍然留在结果集中(此时右边部分的连接结果为NULL)。on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
这句话是关于MySQL中的表连接操作,特别是left join和right join。表连接是一种将两个或多个表的数据组合在一起的方法,通常需要指定一个连接条件,即哪些字段或列是相等或匹配的。例如,如果有两个表a和b,它们都有一个sid列,那么可以用下面的语句连接它们。
这句话是关于MySQL中的表连接操作,特别是left join和right join。表连接是一种将两个或多个表的数据组合在一起的方法,通常需要指定一个连接条件,即哪些字段或列是相等或匹配的。例如,如果有两个表a和b,它们都有一个sid列,那么可以用下面的语句连接它们:
select * from a join b on a.sid = b.sid;
这里的on子句就是连接条件,它表示只有当a表和b表的sid列相等时,才会将两个表的记录组合在一起。这种连接方式叫做inner join,它只会返回满足连接条件的记录,而忽略不满足的记录。
但是,有时我们可能想要保留不满足连接条件的记录,这就需要用到left join或right join。left join表示以左边的表为基准,即使左边表的某条记录不满足连接条件,也会将它保留在结果集中,只是右边表的部分会用NULL填充。right join则相反,以右边的表为基准,保留右边表的所有记录,左边表的部分用NULL填充。例如,如果用下面的语句连接a表和b表:
select * from a left join b on a.sid = b.sid;
那么,即使a表中有些记录的sid在b表中不存在,也会将它们包含在结果集中,如下所示:
id | sid | type | sid | remark |
---|---|---|---|---|
1 | 1 | a | 1 | A |
2 | 1 | b | 1 | A |
3 | 2 | c | 2 | B |
4 | 3 | d | 3 | C |
5 | 4 | e | NULL | NULL |
这里,a表中的第五条记录的sid为4,在b表中没有对应的记录,所以右边表的部分用NULL填充。
那么,and和where又有什么区别呢?and是用来在连接条件中添加额外的过滤条件的,它会影响连接操作的结果,但不会改变left join或right join的基准表。where则是用来在连接操作完成后,对结果集进行过滤的,它会改变最终的输出,但不会影响连接操作的过程。例如,如果用下面的语句连接a表和b表:
select * from a left join b on a.sid = b.sid and a.sid = 1;
那么,and子句会在连接前过滤掉a表和b表中sid不等于1的记录,但仍然会保留a表中的所有记录,只是右边表的部分用NULL填充,如下所示:
id | sid | type | sid | remark |
---|---|---|---|---|
1 | 1 | a | 1 | A |
2 | 1 | b | 1 | A |
3 | 2 | c | NULL | NULL |
4 | 3 | d | NULL | NULL |
5 | 4 | e | NULL | NULL |
如果用下面的语句连接a表和b表:
select * from a left join b on a.sid = b.sid where a.sid = 1;
那么,where子句会在连接后过滤掉a表中sid不等于1的记录,只返回满足条件的记录,如下所示:
id | sid | type | sid | remark |
---|---|---|---|---|
1 | 1 | a | 1 | A |
2 | 1 | b | 1 | A |
因此,and和where的区别在于,and是在连接前过滤,而where是在连接后过滤。and会影响连接操作的结果,但不会改变left join或right join的基准表。where则会改变最终的输出,但不会影响连接操作的过程。
参考:
https://blog.csdn.net/qq_33864656/article/details/77838258