本文主要讲解left join on 和where 的区别,以及用法
首先
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
在使用left join时,on和where条件的区别如下:
on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
使用:
单独使用left join时:
select o.id id, o.user_id , o.out_trade_no, o.create_time, o.state, o.total_fee, o.video_id, o.video_title, o.video_img, u.name, u.head_img, u.create_time, u.phone from video_order o left join user u on o.user_id = u.id
这里video_order o是让o代替video_order 这个表,方便命名书写,它的作用首先是输出左表的全部数据,然后筛选右表,将符合的一一对应,与左表关联输出。注意这里是左表的全部数据均输出
再看另外一个left join on的例子
select o.id id, o.user_id , o.out_trade_no, o.create_time, o.state, o.total_fee, o.video_id, o.video_title, o.video_img, u.name, u.head_img, u.create_time, u.phone from video_order o left join user u on o.user_id = u.id and u.id=6
通过图示我们发现,这里也是显示左表的所有数据,不同在于,要筛选右表,右表不符合的显示为NULL;
join on与where同时使用
下面是我们更希望出现的样子,就是我们关联查询后,能过滤到左表我们不想要的东西
select o.id id, o.user_id , o.out_trade_no, o.create_time, o.state, o.total_fee, o.video_id, o.video_title, o.video_img, u.name, u.head_img, u.create_time, u.phone from video_order o left join user u on o.user_id = u.id where u.id=6
其实除了这个办法,我们还可以对左表用子查询进行筛选,具体代码如下
select o.order_id,o.user_id,u.user_id,u.user_namefrom ( select * from tb_order where order_id > 10 ) o LEFT JOIN tb_user u on o.user_id = u.user_id;
来源地址:https://blog.csdn.net/qq_44748801/article/details/123727426