当前位置:网站首页>京东面试官问:LEFT JOIN关联表中用ON还是WHERE跟条件有什么区别
京东面试官问:LEFT JOIN关联表中用ON还是WHERE跟条件有什么区别
2022-07-02 06:33:00 【程序员柒柒】
之前有码友去京东面试,被问到 LEFT JOIN 关联表中用 ON 还是 WHERE 跟条件有什么区别,很快就答出来了,可是追问什么原因造成这一情况的,一时没回答上来。
下面说说,想通过 A left B join on and 后面的条件来使查出的两条记录变成一条,奈何发现还是有两条。
后来发现 join on and 不会过滤结果记录条数,只会根据and后的条件是否显示 B表的记录,A表的记录一定会显示。
不管and 后面的是A.id=1还是B.id=1,都显示出A表中所有的记录,并关联显示B中对应A表中id为1的记录或者B表中id为1的记录。
运行sql :
select * from student s left join class c on s.classId=c.id order by s.id
运行sql :
select * from student s left join class c on s.classId=c.id and s.name="张三" order by s.id
运行sql :
select * from student s left join class c on s.classId=c.id and c.name="三年级三班" order by s.id
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
在使用left jion时,on和where条件的区别如下:
1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
假设有两张表:
表1:tab2
id
size
1
10
2
20
3
30
表2:tab2
size
name
10
AAA
20
BBB
20
CCC
两条SQL:
1、select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name='AAA'
2、select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name='AAA')第一条SQL的过程:
1、中间表
on条件:
tab1.size = tab2.size
tab1.idtab1.sizetab2.sizetab2.name
1
10
10
AAA
2
20
20
BBB
2
20
20
CCC
3
30
(null)
(null)
|
|
2、再对中间表过滤
where 条件:
tab2.name=’AAA’
tab1.idtab1.sizetab2.sizetab2.name
1
10
10
AAA
第二条SQL的过程:
1、中间表
on条件:
tab1.size = tab2.size and tab2.name=’AAA’
(条件不为真也会返回左表中的记录)
tab1.idtab1.sizetab2.sizetab2.name
1
10
10
AAA
2
20
(null)
(null)
3
30
(null)
(null)
其实以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。
边栏推荐
- 队列的基本概念介绍以及典型应用示例
- Qt的右键菜单
- 【Go实战基础】gin 如何获取 GET 和 POST 的请求参数
- Oracle related statistics
- 图像变换,转置
- Openfeign is easy to use
- Minecraft group service opening
- Pclpy projection filter -- projection of point cloud to cylinder
- Shengshihaotong and Guoao (Shenzhen) new energy Co., Ltd. build the charging pile industry chain
- OpenShift 容器平台社区版 OKD 4.10.0部署
猜你喜欢

Minecraft group service opening

Minecraft air Island service

Shengshihaotong and Guoao (Shenzhen) new energy Co., Ltd. build the charging pile industry chain

How to realize asynchronous programming in a synchronous way?

Flex layout

【Go实战基础】gin 如何设置路由

C4D quick start tutorial - C4d mapping

Nacos download, start and configure MySQL database

Minecraft空岛服开服

ORA-12514问题解决方法
随机推荐
Aneng logistics' share price hit a new low: the market value evaporated by nearly 10 billion yuan, and it's useless for chairman Wang Yongjun to increase his holdings
kubeadm部署kubernetes v1.23.5集群
NPOI 导出Word 字号对应
Qt——如何在QWidget中设置阴影效果
队列管理器running状态下无法查看通道
Kubesphere virtualization KSV installation experience
Win10 uses docker to pull the redis image and reports an error read only file system: unknown
Gocv split color channel
C Baidu map, Gaode map, Google map (GPS) longitude and latitude conversion
PCL calculates the intersection of three mutually nonparallel planes
Kubernetes deploys Loki logging system
commands out of sync. did you run multiple statements at once
【Go实战基础】gin 高效神器,如何将参数绑定到结构体
一、Qt的核心类QObject
Sqli labs level 12
Minecraft模组服开服
Npoi export word font size correspondence
2022/2/14 summary
Linux二进制安装Oracle Database 19c
Linux安装Oracle Database 19c