博客
关于我
MySQL留疑问:left join时选on还是where?
阅读量:790 次
发布时间:2023-02-13

本文共 1793 字,大约阅读时间需要 5 分钟。

前天写 SQL 时本想通过 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.idORDER BY s.id

de89f1a5c7f00e2759ffca4c6fe78501.png

运行 sql:

SELECT *FROM student s LEFT JOIN class c ON s.classId = c.id  AND s.name = '张三'ORDER BY s.id

06480a5e1e538a732a37fbe4a0fdd2ff.png

运行 sql:

SELECT *FROM student s LEFT JOIN class c ON s.classId = c.id  AND c.name = '三年级三班'ORDER BY s.id

4e5b869bc025b7a4dd72c3cd965a3ae2.png

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

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

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

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

假设有两张表:

表 1:tab2

32b09f2d9f02994c9c830c3f5f13c493.png

表 2:tab2

8d26dcd80b3f5ec51c3041185a51cbc9.png

两条 SQL:

第一条:

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

第二条:

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

第一条 SQL 的过程:

1、中间表 on 条件:

tab1.size = tab2.size

07f9fcf0527fc5ea264eaefc3af377f5.png

2、再对中间表过滤 where 条件:

tab2.name=’AAA’

5e0a0078b828082998f84a8333581a5c.png

第二条 SQL 的过程:

1、中间表 on 条件:

tab1.size = tab2.size and tab2.name=’AAA’

PS:条件不为真也会返回左表中的记录

e5599c1e3cf8a3bbd887d029a32ee7ea.png

其实以上结果的关键原因就是left joinright joinfull join的特殊性,不管 on 上的条件是否为真都会返回 left 或 right 表中的记录,full 则具有 left 和 right 的特性的并集。

inner jion没这个特殊性,则条件放在 on 中和 where 中,返回的结果集是相同的。

来源:blog.csdn.net/wqc19920906/

article/details/79785424


推荐全新学习项目

全新,包括手机端微商城项目和后台管理系统,整个电商购物流程已经能流畅支持,涵盖商品浏览、搜索、商品评论、商品规格选择、加入购物车、立即购买、下单、订单支付、后台发货、退货等。功能强大,主流技术栈,非常值得学习。

线上演示:https://www.markerhub.com/vueshop

4e6fce97c3e8493b1e11bb8c40c7c072.jpeg

从文档到视频、接口调试、学习看板等方面,让项目学习更加容易,内容更加沉淀。全套约 35 小时共 222 期,讲解非常详细细腻。下面详细为大家介绍:

架构与业务

使用主流的技术架构,真正手把手教你从 0 到 1 如何搭建项目手脚架、项目架构分析、建表逻辑、业务分析、实现等。涵盖 SpringBoot、Mybatis Plus、Jwt、Redis、Lombok、Hutool、Shiro、Elasticsearch、RabbitMq、Docker、Jenkins 等技术。

vueshop 微商城的整个购物流程已经完善,各个模块的业务都是已经实现,涵盖商品模块、搜索模块、购物车模块、订单模块、退款模块、后台权限模块、业务数据管理模块等

28b0952dd9314710cf7b3bb4ed1791fa.png

更多详情请查看:

你可能感兴趣的文章
MySQL优化配置详解
查看>>
mysql会员求积分_MySql-统计所有会员的最高前10次的积分和
查看>>
MySQL修改密码报错ERROR 1396 (HY000): Operation ALTER USER failed for ‘root‘@‘localhost‘
查看>>
Mysql全局优化参数
查看>>
MySQL全面瓦解:安装部署与准备
查看>>
MySQL内存表使用技巧
查看>>
MySQL函数
查看>>
mysql函数汇总之数学函数
查看>>
mysql函数汇总之条件判断函数
查看>>
mysql函数汇总之系统信息函数
查看>>
MySQL函数简介
查看>>
mysql函数遍历json数组
查看>>
MySQL函数(转发)
查看>>
mysql分区表
查看>>
MySQL分层架构与运行机制详解
查看>>
mysql分库分表中间件简书_MySQL分库分表
查看>>
MySQL分库分表会带来哪些问题?分库分表问题
查看>>
MySQL分组函数
查看>>
MySQL分组查询
查看>>
Mysql分表后同结构不同名称表之间复制数据以及Update语句只更新日期加减不更改时间
查看>>