当前位置:网站首页>京东面试官问: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中,返回的结果集是相同的。
边栏推荐
- Driving test Baodian and its spokesperson Huang Bo appeared together to call for safe and civilized travel
- C4D quick start tutorial - C4d mapping
- Installing Oracle database 19C for Linux
- gocv opencv exit status 3221225785
- What is the future value of fluorite mine of karaqin Xinbao Mining Co., Ltd. under zhongang mining?
- 【Go实战基础】gin 如何绑定与使用 url 参数
- Solution of Xiaomi TV's inability to access computer shared files
- Minecraft group service opening
- 将一串数字顺序后移
- commands out of sync. did you run multiple statements at once
猜你喜欢
随机推荐
Find the node with the smallest value range in the linked list and move it to the front of the linked list
[blackmail virus data recovery] suffix Hydra blackmail virus
There is a problem with MySQL installation (the service already exists)
kubernetes部署loki日志系统
选择排序和插入排序
Leetcode sword finger offer brush questions - day 23
C# 将网页保存为图片(利用WebBrowser)
Select sort and insert sort
Qunhui NAS configuring iSCSI storage
Illegal use of crawlers, an Internet company was terminated, the police came to the door, and 23 people were taken away
C4D quick start tutorial - Chamfer
What is the future value of fluorite mine of karaqin Xinbao Mining Co., Ltd. under zhongang mining?
win10使用docker拉取redis镜像报错read-only file system: unknown
How to realize asynchronous programming in a synchronous way?
【Go实战基础】gin 如何获取 GET 和 POST 的请求参数
Solution and analysis of Hanoi Tower problem
CSDN Q & A_ Evaluation
Gocv split color channel
一个经典约瑟夫问题的分析与解答
C# 调用系统声音 嘀~








