引出问题
朋友甩过来一张图片
问我这两个查询有什么区别
仔细一看
这不就是问: 把限制条件放在关联表left join [tableName] on后面与放在主表where后面的区别吗
创建实例
环境 mysql 5.7
创建表A和表B并插入数据,以id为对应关系
不加限制条件的关联查询,所有记录以id为对应关系展示
select * from table_A A left join table_B B on A.id_A = B.id_B;
对比差异
把关联条件条件放在关联表的on后面
select * from table_A A left join table_B B on A.id_A = B.id_B and b.id_B = 1;
把关联条件放到主表where后面
select * from table_A A left join table_B B on A.id_A = B.id_B where b.id_B = 1;
结论
①
很容易发现,from A left join B on […] and […] 中的and不会过滤结果记录条数,只会根据and后的条件判断是否显示B表的记录,A表的记录一定会显示。
不管and 后面的是A.id=1还是B.id=1,都显示出A表中所有的记录,并关联显示B中对应A表中id为1的记录或者B表中id为1的记录。
②
而 from A left join B on […] where […] 不控制B表数据的展示,但会对主表的记录条数进行过滤。 其实就是在两张表关联生成临时表之后,根据where条件过滤出结果。
这种简单的sql并不难懂
可能
对于那种很复杂的sql [你] 又懵了
不要慌
所有复杂的sql都是从简单sql延伸出来的
一定能从里面看出来 [你] 熟悉的语法