本文主要讲解left join on 和where 的区别,以及用法
首先
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

在使用left join时,on和where条件的区别如下:

1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

 

1.用left join 进行条件过滤时,on条件只会对右表进行条件过滤,不会对左表数据产生任何影响;
2.用left join 进行条件过滤时,where条件会对结果表进行条件过滤,所以会对左表数据产生影响;
3.用inner join 用on和where没有任何区别

使用:

单独使用left join时:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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_name
from ( select * from tb_order where order_id > 10 ) o LEFT JOIN tb_user u on o.user_id = u.user_id;

 

 

 

LEFT JOIN条件在on后面和在where后面的区别
一、left join 的实际运用
二、两表联查SQL区别
1、在on后面补全条件
2、在where后面补全条件
三、三表联查SQL区别
1.错误示范:
1.1 连续使用left join,on后面过滤条件
1.2 连续使用left join,where后面过滤条件
2.正确操作:
2.1将test2和test3作为整个右表查询
四、结论
一、left join 的实际运用
left join 一般用于显示左边所有数据,并携带右表的数据;
而在on后面进行条件过滤,只会过滤掉右表条件不为真的数据,左表数据一定会显示;
在where后面进行条件过滤,是对左表右表的结果表进行过滤,所以数据不一定能完全显示。

二、两表联查SQL区别
存在数据表test1, test4
test1:

test4:


1、在on后面补全条件
select * from test1 left join test4 on test1.id = test4.id and test4.is_effective = 1
1

可以发现test1中的数据全部被读取,test4中过滤了is_effective != 1的数据

2、在where后面补全条件
select * from test1 left join test4 on test1.id = test4.id where test4.is_effective = 1
1

可以发现只显示了test1中的id为1的数据内容。

三、三表联查SQL区别
存在test1,test2,test3三张表,其中test3是test1和test2的中间表
test1:

test2:

test3:


某些业务中,我们会使用中间表查询数据,如果存在业务,要显示test1中的全部数据,并携带test2中的有效数据,我们一般会采用left join 去完成sql,而这时需要注意应该将test2和test3的结果表作为整个右表,才能正常完成业务。

1.错误示范:
1.1 连续使用left join,on后面过滤条件

SELECT
*
FROM
test1
LEFT JOIN test3 ON test1.id = test3.id1
LEFT JOIN test2 ON test2.id = test3.id2 and is_effective = 1

 



会查出test1中的重复数据

1.2 连续使用left join,where后面过滤条件

SELECT
*
FROM
test1
LEFT JOIN test3 ON test1.id = test3.id1
LEFT JOIN test2 ON test2.id = test3.id2
WHERE
is_effective = 1

 



无法完全显示test1中的数据

2.正确操作:
2.1将test2和test3作为整个右表查询

SELECT
*
FROM
test1
LEFT JOIN ( SELECT * FROM test2 INNER JOIN test3 ON test2.id = test3.id2 WHERE is_effective = 1 ) b ON test1.id = b.id1
 

 

正常完成查询
 

参考:left join on后面 加条件 与 where后面加条件的区别

参考:LEFT JOIN条件在on后面和在where后面的区别



posted @ 2023-11-21 14:13 aspirant 阅读(7586) 评论(0) 推荐(0) 编辑
摘要: 1、我目前年龄超过 35岁了,只想有个稳定的工作,保住工作,公司让干啥就干啥,绝对不会跟上级吵架,让我吃屎我就去吃屎; 感觉年龄大了太难了,看我们单位的招聘简历 全部清一色的985 ,211 硕士毕业,超过 35岁,再也没机会进入单位了 我想说,年龄超过 35岁,这是都要我们大龄青年去死吗? 年龄超 阅读全文
posted @ 2023-06-05 20:25 aspirant 阅读(266) 评论(1) 推荐(2) 编辑
摘要: 也是很巧合,之前遇到过一次情况,一条SQL,根据时间范围查数据,但有时候速度很快,有时候速度就慢。 第一反应是没有设置索引,但开发人员告诉我已经设置了二级索引,查询的速度依然有快有慢。 通过explain解析,发现同一条SQL,时间范围不一样,有的使用了索引,有的全表扫描。 当时我都懵逼了! 经过查 阅读全文
posted @ 2023-03-17 09:36 aspirant 阅读(1210) 评论(0) 推荐(0) 编辑
摘要: 1 kafka 可以脱离 zookeeper 单独使用吗?为什么?kafka 不能脱离 zookeeper 单独使用, 因为 kafka 使用 zookeeper 管理和协调 kafka 的节点服务器。 不可能越过Zookeeper直接联系Kafka broker,一旦Zookeeper停止工作,它 阅读全文
posted @ 2023-03-08 16:02 aspirant 阅读(438) 评论(0) 推荐(0) 编辑
摘要: Kafka 到底会不会丢数据呢?如果丢数据,究竟该怎么解决呢? 总结 Kafka要严格意义上保证消息不丢失,需要从三个方面来设置, 第一个服务器端持久化设置为同步刷盘、第二个生产者设置为同步投递,第三个消费端设置为手动提交。 1、解决思路 首先第一个是服务器端。设置broker中的配置项unclea 阅读全文
posted @ 2023-03-08 15:47 aspirant 阅读(612) 评论(0) 推荐(0) 编辑
摘要: 1、echo $变量名 会打印变量; [root@linuxcool ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin 2、echo 'obase=16;31155' |bc 结果:79B3; bc 阅读全文
posted @ 2023-02-07 10:32 aspirant 阅读(381) 评论(0) 推荐(0) 编辑
摘要: expdp 用户名/密码@afspdb TABLES=table1 dumpfile=/yfq/expdp_a11.dmp (1)执行之后报错了; expdp TNS could not resolve the connect identifier specified 查了下是没有加上 ip的原因 阅读全文
posted @ 2022-12-20 10:52 aspirant 阅读(326) 评论(0) 推荐(0) 编辑
摘要: 表空间,顾名思义,就是一张表所存在的空间。 一个表同时只能存在于一个表空间,不同表空间的表是相互隔离的,可以取相同的名字。 在数据库只有一个实例的情况下,如果要实现数据的隔离,最简单的方法就是创建多个表空间,添加多个用户,一个用户对应一个表空间,这样就实现了数据的隔离(多个开发团队共用一个oracl 阅读全文
posted @ 2022-12-15 08:34 aspirant 阅读(228) 评论(0) 推荐(0) 编辑
摘要: select username from dba_users where INHERITED='NO'; SELECT username,account_status from dba_users where account_status = 'OPEN' and username not like 阅读全文
posted @ 2022-12-14 21:24 aspirant 阅读(322) 评论(0) 推荐(0) 编辑
摘要: 每当为数据库镜像会话设置见证服务器时,都需要“仲裁”。 仲裁是数据库镜像会话中两个或多个服务器实例彼此连接时存在的一种关系。 仲裁通常包括三个互连的服务器实例。 设置见证服务器时,必须具有仲裁才能使用数据库。 仲裁旨在用于具有自动故障转移功能的高安全性模式,可确保一个数据库一次只属于一个伙伴。 如果 阅读全文
posted @ 2022-12-08 10:10 aspirant 阅读(447) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示