Mysql join加多条件与where的区别

这篇具有很好参考价值的文章主要介绍了Mysql join加多条件与where的区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近在项目中遇到一个问题,感觉有点意思,在解决问题及查阅了相关资料后,打算写篇文章给朋友们分享一下。

问题现象:

问题是很常见的空指针问题,后端查询数据库数据,遍历进行相关业务处理时报空指针。通过断点调试发现问题就出在查询回来的数据上,返回的List集合中有一条空数据导致的。
Mysql join加多条件与where的区别,MySQL,mysql,android,数据库
就很纳闷,怎么会返回空数据?

继续排查

发现sql执行完确实有一行空数据,先给兄弟们看一下sql(业务代码不便透露这里进行了简化,主要复现问题):

SELECT
	o.order_id,
	o.order_no,
	o.detail_id,
	o.product_id,
	o.batch,
	o.comp_brand_id,
	o.supplier_id,
	o.buyer
FROM
	tr_production_purchase_contract_and_order contractOrder
	LEFT JOIN t_daily_purchase_order o ON contractOrder.order_id = o.order_id 
	AND contractOrder.contract_id = '1585249657636917248' 
	AND contractOrder.del_flag = '0'

大概意思就是关联搜索contract_id = '1585249657636917248’的数据,执行结果显示contractOrder.contract_id = ‘1585249657636917248’ AND contractOrder.del_flag = '0’条件没有生效。
Mysql join加多条件与where的区别,MySQL,mysql,android,数据库
为啥不生效?第一反应写错了,仔细检查没有问题。于是怀疑left join on后面加条件是不是有什么特殊的,查完资料,还确实非常特殊。join on后面加条件与where条件是不一样的。

先给结论:

  • left join
    on后面条件筛选是对2张表生成的全连接(笛卡尔积)临时表进行的筛选,无论on后面的条件是否满足都会返回左表的所有数据,不符合条件的右表的值都为null

  • right join
    同上,只不过是最终返回右表的所有数据,不符合条件的左表的值都为null

  • inner join
    inner join有点不一样,它是两张表取交集,最终的结果是符合所有条件的值,所以on后面的条件可以生效

  • where
    查询出来的结果最后都会再经过where条件进行过滤,满足条件才会返回

由此可见left join 的时候,on后面对左表的数据加筛选条件是没有用的。上面问题的原因也找到了因为只查询了右表的值,因为不满足条件,所以查询回来的数据为空。

为了验证这个观点,我们进行一下测试:
员工表
Mysql join加多条件与where的区别,MySQL,mysql,android,数据库
部门表
Mysql join加多条件与where的区别,MySQL,mysql,android,数据库
left join 单条件查询

select 
t.emp_id,
t.name,
t.age,
d.dept_id,
d.dept_name
from t_emp t
left join t_dept d on t.dept_id = d.dept_id

Mysql join加多条件与where的区别,MySQL,mysql,android,数据库
on 后面加条件

select 
t.emp_id,
t.name,
t.age,
d.dept_id,
d.dept_name
from t_emp t
left join t_dept d on t.dept_id = d.dept_id and t.emp_id = '4';

Mysql join加多条件与where的区别,MySQL,mysql,android,数据库
把on的所有条件作为匹配条件,不符合的右表都为null

where 后面加条件

select 
t.emp_id,
t.name,
t.age,
d.dept_id,
d.dept_name
from t_emp t
left join t_dept d on t.dept_id = d.dept_id where t.emp_id = '4';

Mysql join加多条件与where的区别,MySQL,mysql,android,数据库
匹配完再筛选,结果只有一条记录。

inner join 多条件查询

select 
t.emp_id,
t.name,
t.age,
d.dept_id,
d.dept_name
from t_emp t
inner join t_dept d on t.dept_id = d.dept_id where t.emp_id = '4';

Mysql join加多条件与where的区别,MySQL,mysql,android,数据库
总结:

在连表操作的时候,其实是先进行了2表的全连接(笛卡尔积,也就是所有能组合的情况a.rowCount*b.rowCount),然后根据on后面的条件进行筛选,最后如果是左连接或者右连接,再补全左表或者右表的数据。

个人理解不一定正确,欢迎指正

参考文章:
join on多个条件的理解文章来源地址https://www.toymoban.com/news/detail-673004.html

到了这里,关于Mysql join加多条件与where的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL 查询常用操作(2) —— 条件查询 where

    MySQL中常用的查询操作,首先是能直接从表中直接取出数据,接着能对查询结果做一些简单的处理,比如去重等,然后是根据条件查询数据,包括精准查询、模糊查询以及按照数据的某个范围或者指定多个指标进行查询,值得注意的是,MySQL中的一些查询会忽略空值。最后是将

    2023年04月10日
    浏览(68)
  • Mysql Join 多条件的小坑

    一般情况我们可能只在join on 后面添加唯一的关联条件,但是如果在on后面添加多个条件会发生什么呢? 对于inner join 表现与在where后面添加条件一致 但是对于left join,情况就比较微妙了。 对于左表添加条件,没有任何效果。表a的其他id数据仍然查询出来了 对于右表添加条件

    2024年02月07日
    浏览(32)
  • 2023-06-25 mysql-包含内连接的嵌套外连接-JOIN_condition_to_WHERE-分析

    对mysql的join的条件优化中的JOIN_condition_to_WHERE做分析, 分析该条件优化规则为什么要这么做, 要达到什么样的目的, 对查询执行的代价的改变。 上下文: 2023-06-02 stonedb-修改包含内连接的嵌套外连接-问题反思_财阀悟世的博客-CSDN博客 2023-05-29 monetdb-多表连接-分析_财阀悟世的博客

    2024年02月11日
    浏览(34)
  • MySQL中使用IF子查询实现条件判断(where之后用if)

    废话不多说,直接上代码

    2023年04月23日
    浏览(67)
  • 北京地区MySQL培训课程:深度解析查询语句中的WHERE条件设置

    MySQL如果在查询时想要获取满足的条件的记录,就需要使用WHERE子句,WHERE子句用于在 MySQL 中过滤查询结果,只返回满足条件的数据记录。 语法格式: SELECT column1, column2, ...FROM table_name WHERE condition; SELECT 列名, ...FROM 那个表 WHERE 条件; 下图为示例表格 示例1:查询等级是“A”的

    2024年02月19日
    浏览(55)
  • MySQL中的having和where的区别

    HAVING 和 WHERE 是 SQL 查询中用于筛选数据的两个,但它们在使用时有一些区别: WHERE 子句: 1用于在查询执行之前对原始数据进行筛选。 2作用于单行数据,过滤不满足条件的数据行。 3在对单个行进行判断和过滤时使用,例如基于行的条件筛选。 HAVING 子句: 1用于在数

    2024年02月12日
    浏览(47)
  • MySQL having关键字详解、与where的区别

    1.1、作用 对查询的数据进行筛选 1.2、having产生的原因 使用where对查询的数据进行筛选时,where子句中无法使用聚合函数,所以引出having 1.3、having使用语法 having单独使用(不与group by一起使用,在Oracle中会报错),单独使用时,大部分场合与where相同 having与grou

    2023年04月21日
    浏览(35)
  • MySQL left join 和 left outer join 区别

    先说结论: left join 和 left outer join 的结果是一致的。 我不知道各位大神是怎么测试的,网上面就说两个不一样,我A、B表都是有重复数据的,为啥结果是一样的。 表A 表B 左连接 左外连接 以下MySQL官方文档的说明(2664页),outer join是为了某些第三方程序的兼容性而存在的。 微软

    2024年02月10日
    浏览(41)
  • SQL 语句中 left join 后用 on 还是 where,区别大了!

    目录 情况 小结 举例         前天写SQL时本想通过 A left B join on and 后面的条件来使查出的两条记录变成一条,奈何发现还是有两条。         后来发现 join on and 不会过滤结果记录条数,只会根据and后的条件是否显示 B表的记录,A表的记录一定会显示。         不

    2024年02月14日
    浏览(38)
  • mysql执行计划之Extra列-Using where

    顾名思义, Extra 列是用来说明一些额外信息的, 我们可以通过这些额外信息来更准确的理解 MySQL 到底将如何执行给定的查询语句。 MySQL 提供的额外信息很多。这里单说 Using where。 Using where 只是表示 MySQL 使用 where 子句中的条件对记录进行了过滤。与是否全表扫描或读取了索

    2024年02月04日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包