博客
关于我
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批量插入数据遇到错误1213的解决方法
查看>>
mysql技能梳理
查看>>
MySQL报Got an error reading communication packets错
查看>>
Mysql报错Can‘t create/write to file ‘/tmp/#sql_3a8_0.MYD‘ (Errcode: 28 - No space left on device)
查看>>
MySql报错Deadlock found when trying to get lock; try restarting transaction 的问题解决
查看>>
MySQL报错ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘
查看>>
Mysql报错Packet for query is too large问题解决
查看>>
mysql报错级别_更改MySQL日志错误级别记录非法登陆(Access denied)
查看>>
Mysql报错:too many connections
查看>>
MySQL报错:无法启动MySQL服务
查看>>
mysql授权用户,创建用户名密码,授权单个数据库,授权多个数据库
查看>>
mysql排序查询
查看>>
MySQL排序的艺术:你真的懂 Order By吗?
查看>>
MySQL排序的艺术:你真的懂 Order By吗?
查看>>
Mysql推荐书籍
查看>>
Mysql插入数据从指定选项中随机选择、插入时间从指定范围随机生成、Navicat使用存储过程模拟插入测试数据
查看>>
MYSQL搜索引擎
查看>>
mysql操作数据表的命令_MySQL数据表操作命令
查看>>
mysql操作日志记录查询_如何使用SpringBoot AOP 记录操作日志、异常日志?
查看>>