MySQL中联表查询条件WHERE和ON的区别?

举报
兴趣使然的草帽路飞 发表于 2021/05/27 08:54:37 2021/05/27
【摘要】 先来看一个关联查询的DEMO:select * from student s left join class c on s.classId=c.id order by s.id查询结果如下:下面在ON 条件中拼接一个条件:s.name="张三"select * from student s left join class c on s.classId=c.id and s.name="张三"...

先来看一个关联查询的DEMO:

select * from student s left join class c on s.classId=c.id order by s.id

查询结果如下:
在这里插入图片描述
下面在ON 条件中拼接一个条件:s.name="张三"

select * from student s left join class c on s.classId=c.id and s.name="张三" order by s.id

查询结果如下:
在这里插入图片描述
ON 条件中拼接一个条件:c.name="三年级三班""

select * from student s left join class c on s.classId=c.id and c.name="三年级三班" order by s.id

查询结果如下:

在这里插入图片描述
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户

在使用left jion时,onwhere条件的区别如下:

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

总之:LEFT JOIN联表查询ON可以理解为是在两张表中进行条件筛选(即,在生成临时中间表时候进行条件筛选),满足条件的则展示左右表拼接的数据记录,不满足条件的,则优先展示左表中的数据,右表中不满足条件的字段为NULL。而联表查询时候WHERE则可以理解为是在一张表上进行条件过滤(即,将生成的临时表看作一张表)


假设有两张表:

表1:tab1

id size
1 10
2 20
3 30

表2:tab2

size name
10 AAA
20 BBB
20 CCC

两条SQL:

---sql1
select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’

--- sql2
select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=’AAA’)

第一条SQL的过程:

-- 中间表on条件: 
tab1.size = tab2.size

在这里插入图片描述

-- 再对中间表过滤where 条件:
tab2.name=’AAA’

在这里插入图片描述
第二条SQL的过程:

-- 中间表on条件: (条件不为真也会返回左表中的记录)
tab1.size = tab2.size and tab2.name=’AAA’

在这里插入图片描述

其实以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回leftright表中的记录,full则具有left和right的特性的并集。 而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。