当前位置:网站首页>京东面试官问: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中,返回的结果集是相同的。
边栏推荐
- Kubernetes deploys Loki logging system
- Linux安装Oracle Database 19c
- Image transformation, transpose
- Qt——如何在QWidget中设置阴影效果
- [blackmail virus data recovery] suffix Crylock blackmail virus
- cmd窗口中中文呈现乱码解决方法
- Installing Oracle database 19C RAC on Linux
- Linux binary installation Oracle database 19C
- [blackmail virus data recovery] suffix Rook3 blackmail virus
- 远程连接IBM MQ报错AMQ4036解决方法
猜你喜欢

Illegal use of crawlers, an Internet company was terminated, the police came to the door, and 23 people were taken away

Move a string of numbers backward in sequence

Kubernetes deploys Loki logging system

Multi version concurrency control mvcc of MySQL

There is a problem with MySQL installation (the service already exists)

Flex layout

远程连接IBM MQ报错AMQ4036解决方法

ORA-12514问题解决方法

Web技术发展史

Hengyuan cloud_ Can aiphacode replace programmers?
随机推荐
commands out of sync. did you run multiple statements at once
gocv图片读取并展示
Driving test Baodian and its spokesperson Huang Bo appeared together to call for safe and civilized travel
C language - Blue Bridge Cup - 7 segment code
【Go实战基础】gin 高效神器,如何将参数绑定到结构体
QT -- how to set shadow effect in QWidget
CSDN Q & A_ Evaluation
libusb的使用
Openfeign facile à utiliser
[blackmail virus data recovery] suffix Crylock blackmail virus
Gocv boundary fill
Synchronize files using unison
Qt的右键菜单
Service de groupe minecraft
History of Web Technology
Googlenet network explanation and model building
Analysis and solution of a classical Joseph problem
gocv图片裁剪并展示
Linux安装Oracle Database 19c RAC
Installing Oracle database 19C for Linux