MySQL关联left join 条件on与where不同,很实用,但要慎用

京东面试官问:LEFT JOIN 关联表中用 ON 还是 WHERE 跟条件有什么区别? 其实以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。2、where条件是在临时表生成好后,再对临时表进行过滤的条件。不管and 后面的是A.id=1还是B.id=1,都显示出A表中所有的记录,并关联显示B中对应A表中id为1的记录或者B表中id为1的记录。1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。 阅读详情

转:http://gaoerpeng777.blog.163.com/blog/static/9437945020127633739771/


MySQL关联left join 条件on与where不同,很实用,但要慎用

在mysql查询中,有时候业务复杂了,不得不写多表查询;很多程序猿前期都喜欢写子查询,因为子查询简单易懂,不容易出问题,但子查询的效率毕竟不如关联查询;关联查询我觉得是把双刃剑,在不懂它的机制时,还是慎用,我碰到过以前的同事,因为关联查询没写好,把奖品(查询活动中奖信息)发错的,还好大奖不是汽车;

网上摘的例子,比较好理解

MySQL关联left join条件on和where条件的区别表的结构 `products`

CREATE TABLE `products` (  
`pid` int(3) NOT NULL auto_increment,  
`pname` varchar(20) NOT NULL,  
`pcode` varchar(20) NOT NULL,  
PRIMARY KEY (`pid`)  
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;  
导出表中的数据 `products`

INSERT INTO `products` (`pid`, `pname`, `pcode`) VALUES (1, '商品1', 'AC90'),  
(2, '商品2', 'DE78'),  
(3, '商品3'. 'XXXX'); 
表的结构 `sales_detail`

CREATE TABLE `sales_detail` (  
`aid` int(3) NOT NULL auto_increment,  
`pcode` varchar(20) NOT NULL,  
`saletime` date NOT NULL,  
PRIMARY KEY (`aid`)  
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 
导出表中的数据 `sales_detail`

INSERT INTO `sales_detail` (`aid`, `pcode`, `saletime`) VALUES (1, 'AC90', '2008-09-22'),  
(2, 'DE78', '2008-09-22'),  
(3, 'AC90', '2008-09-23'),  
(4, 'AC90', '2008-09-24'); 
MySQL关联left join条件on和where条件的区别区别两条sql语句:

select p.pname,p.pcode,s.saletime,count(s.aid) as total from products as p  
left join sales_detail as s on (s.pcode=p.pcode)  
where s.saletime in ('2008-09-23','2008-09-24')   
group by p.pcode order by total desc,p.pid asc  
+---------+-------+------------+-------+  
| pname | pcode | saletime | total |  
+---------+-------+------------+-------+  
| 商品1 | AC90 | 2008-09-23 | 2 |   
+---------+-------+------------+-------+  
select p.pname,p.pcode,s.saletime,count(s.aid) as total from products as p  
left join sales_detail as s on ((s.pcode=p.pcode) and s.saletime in ('2008-09-23','2008-09-24'))   
group by p.pcode order by total desc,p.pid asc  
+---------+-------+------------+---------+  
| pname | pcode | saletime | total |  
+---------+-------+------------+-------+  
| 商品1 | AC90 | 2008-09-23 | 2 |   
| 商品2 | DE78 | NULL | 0 |   
| 商品3 | XXXX | NULL | 0 |   
+---------+-------+------------+---------+  
心得:on中的条件关联,一表数据不满足条件时会显示空值。where则输出两表完全满足条件数据。

我的心得:where条件中的结果会影响主表的查询记录集,如果你想查询left join中主表的全部符合条件的记录,切记多看看where条件,where中的条件(不管是主表、附表的条件)会过滤掉主表中的记录集,应该放在on后面

我们知道标准查询关键字执行顺序为 from->where->group by->having->order by

left join 是在from范围类所以 先on条件筛选表,然后两表再做left join。

而对于where来说在left join结果再次筛选。


蓝易云 - Mysql join加多条件与where的区别 MySQL中JOIN条件与WHERE条件的核心区别在于过滤时机和语义差异。ON子句定义表的连接规则(匹配成功的行对及外连接补NULL逻辑),WHERE子句对最终结果集进行过滤。在INNER JOIN中两者通常等价,但在LEFT/RIGHT JOIN中差异显著:右表条件放在ON会保留左表未匹配行(补NULL),放在WHERE则可能将外连接转为内连接(过滤掉补NULL行)。建议规范:内连接将关联约束放ON、业务筛选放WHERE;外连接右表条件优先放ON以确保保留未匹配行。特别注意错误的条件放置会导致数据口径错误 阅读详情

相关推荐

ArcGIS Pro中文帮助离线包安装指南:版本匹配与操作详解

本文详细指导如何为ArcGIS Pro安装中文帮助离线包,解决在线帮助访问不畅的问题。核心在于确保软件版本与离线包的精确匹配,并提供了从版本查看、离线包获取、安装步骤到软件内配置的完整操作流程。文中重点强调了版本匹配的重要性,并分享了高效使用本地帮助搜索及管理多版本帮助的实用技巧。

whisky的博客 990

mysql中left join条件在on与where时的区别

与②对比,把where改为and,明明a.id>1,但仍有a.id=1的记录,且a.id=1的关联数据对不上。由于这里添加a表的过滤条件,但主表仍然是a表,所以a表的记录必定要出现在结果集中,只是不会再去b表寻找匹配的结果,而直接用null填充。查询过程与④一样,先在a中拿到一条记录,然后去b中从头到尾寻找符合a.id=a_id and a_id>2的记录,只要找到则拿出来并继续往下寻找,如果找完b表都没数据,那么右侧填充null,a表第一条记录寻找结束。根据⑤的分析,处理过程一样,只是多了一个or。

weixin_42698221的博客 3073

FreeSurfer预处理命令

比如将/source/kernel.tgz解压到 /source/linux-2.6.29 目录 tar zxvf /source/kernel.tgz -C /source/ linux-2.6.29 tar zxvf /home/tj/application/freesurfer/subjects/mindboggle/OASIS-TRT-20-1.tar.gz -C /home/tj/application/freesurfer/subjects (1)lh.thickness mri_surf2su

Dream19961996的博客 1508

mysql left join on or_关于 MySQL LEFT JOIN 不可不知的事

你认为自己已对 MySQL 的 LEFT JOIN 理解深刻,这篇文章,我想让你能多学会点东西!ON 子句与 WHERE 子句的不同一种更好地理解带有 WHERE ... IS NULL 子句的复杂匹配条件的简单方法Matching-Conditions 与 Where-conditions 的不同你一定知道关于 “A LEFT JOIN B ON 条件表达式” 的基础用法ON 条件(“A LEF...

weixin_35969301的博客 2204

SAP物料分类账(ML)避坑指南:激活顺序错了怎么办?从CKMSTART到差异分摊的完整流程

本文详细解析SAP物料分类账(ML)的正确激活顺序与配置流程,帮助用户避免常见陷阱如'LKW无科目'、'在制品重估失败'等问题。从CKMSTART到差异分摊的完整流程,涵盖关键配置节点、典型报错分析与应急处理方案,确保产品成本控制(CO-PC)模块的顺利运行。

weixin_42524708的博客 258

思科—OSPF多区域配置实验

实验目的:配置OSPF多区域,使得不同网段的PC互相ping通。 网络拓扑如下: R0的配置 Router>en Router#conf t Router(config)#int g0/1 Router(config-if)#ip add 192.168.1.1 255.255.255.0 Router(config-if)#no shut Router(config-if)#exit Router(config)#int g0/0 Router(config-if)#ip add 192.168.

m0_46237205的博客 1万+

mysql left join和or_关于 MySQL LEFT JOIN 你可能需要了解的三点

即使你认为自己已对 MySQL 的 LEFT JOIN 理解深刻,但我敢打赌,这篇文章肯定能让你学会点东西!ON 子句与 WHERE 子句的不同一种更好地理解带有 WHERE ... IS NULL 子句的复杂匹配条件的简单方法Matching-Conditions 与 Where-conditions 的不同关于 “A LEFT JOIN B ON 条件表达式” 的一点提醒ON条件(“A LE...

weixin_30954817的博客 1593

浅谈云计算01 | 云计算服务的特点

在当今数字化时代,云计算作为一种强大的技术解决方案,正逐渐改变着企业和个人对信息技术的使用方式。本文将详细探讨云计算的五个主要特点,包括按需自助服务、广泛的网络接入、资源池化、快速弹性伸缩以及可计量服务。

时光札记 1120

mysql left join on or_【mysql】left join on and 和 where的区别

left join on andSELECT a.order_id ,b.id FROM way_order a LEFT JOIN way_order_product b ON a.order_id=b.order_id AND b.order_id >70返回a表中所有数据和符合and条件的b数据179 (NULL)180 (NULL)183 (NULL)220 ...

weixin_35844772的博客 550

YOLOv8改进002:添加小目标检测头(小目标检测大量涨点)

YOLOv8 目标检测算法改进之添加小目标检测头,亲测在小目标检测的数据集上有大幅度的涨点效果(mAP直接涨了 0.04 左右)。

m0_46496775的博客 9878

MobaXterm简介和使用(服务器连接工具)

MobaXterm 是一个功能强大的远程计算工具,集成了许多常用的远程计算功能,包括 SSH、X11、RDP、VNC、FTP、SFTP 等。

清平乐的技术专栏 1964

多表查询

多表查询 概述 基础语法: select ​ 列名列表 from ​ 表名列表 where… 多表查询的分类 内连接查询: 隐式内查询: 使用where消除无用的数据 显式内查询 外链接查询: 子查询:

sjwl0526的博客 1823

【RT-DETR涨点改进】全网独家创新、细节涨点改进篇 | AAAI 2025 | 将 CEM 颜色增强模块引入RT-DETR ,目标检测不再惧怕雾天和低光检测、小目标检测、遥感目标检测高效涨点

本文提出了一种新型结构引导去雾网络(SGDN),通过双色引导桥(BGB)和色彩增强模块(CEM)有效解决雾霾图像去雾问题。BGB利用YCbCr空间的纹理特征引导RGB特征恢复,CEM通过聚合YCbCr通道信息增强RGB色彩感知。实验证明该方法在真实雾霾数据集上优于现有技术,能同时保持色彩准确性和纹理清晰度。文章还提供了完整的代码实现和模型配置指南,包括三种改进版RT-DETR网络结构(rtdetr-l/r18/r50-CEM.yaml),为图像去雾和目标检测任务提供了实用解决方案。

Ai缝合怪、助力小伙伴高效发论文 351

mysql之left join、join的on、where区别看这篇就懂

mysql之left join、join的on、where区别看这篇就懂 前言: 网上大量关于left join、join的on、where区别其实很多都是错误,本文开始揭晓其中区别所在,该如何使用。 1.准备 建表语句 CREATE TABLE `t_students` ( `id` int(11) NOT NULL AUTO_INCREMENT, `class_id` int(11) NOT NULL, `name` varchar(10) NOT NULL, `gender` char

weixin_44981707的博客 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

MySQL left join 关于关联条件on和where的使用

本文采用CCBY-NC-SA许可证此许可允许在使用者仅出于非商业目的以任何媒体或格式分发、重新混合、改编和构建材料,并且前提是注明创作者。如果您重新混合、改编或基于该材料进行构建,则必须按照相同的条款对修改后的材料进行许可。

感谢阅读 1282

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

MySQL 查询中 LEFT JOIN 的 ON 条件与 WHERE 条件的区别详解

在 Java 开发中使用 MySQL 进行数据查询时,LEFT JOIN 是常用的连接方式。然而,在 LEFT JOIN 中使用 ON 子句和 WHERE 子句添加过滤条件时,却存在容易混淆的差异。本文将深入剖析这两种条件的本质区别,并通过具体示例帮助开发者正确使用。条件位置 作用阶段对左表记录的影响对右表记录的要求ON 子句连接阶段保留左表所有记录,即使右表无匹配WHERE 子句过滤阶段可能过滤掉左表记录。

weixin_42593797的博客 1671

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

MySQL 查询中 LEFT JOIN 的 ON 条件与 WHERE 条件用法注意事项

MySQL 查询中 LEFT JOIN 的 ON 条件与 WHERE 条件用法注意事项

JAVA领域优质创作者,基于分片网络查询方法专利发明者。 1015

inner join on 加条件和where加条件_「MySQL笔记」left join-on-and 与 left join-on-where 的区别...

1. 摘要关于这两种写法的重要知识点摘要如下:left-join 时,即使有相同的查询条件,二者的查询结果集也不同,原因是优先级导致的,on 的优先级比 where 高on-and 是进行韦恩运算连接生成临时表时使用的条件where 是全部连接完生成临时表后,再根据条件过滤on 优先级比 where 高,因此,理论上 on-and 写法执行效率比 on-where 高,速度更快inner-join...

weixin_39939276的博客 8189

LEFT JOIN ON 与 LEFT JOIN WHERE 过滤条件的核心区别

SQL中LEFT JOIN的ON和WHERE条件有本质区别:ON条件在关联时过滤右表数据,保留左表所有行(无匹配右表字段补NULL);WHERE条件在关联后过滤结果集,可能丢失左表数据(NULL值判断为FALSE)。核心原则是:保留左表数据应将右表条件写ON后,左表自身过滤可写WHERE后。INNER JOIN中两者无区别,但LEFT JOIN必须区分,否则易错误转为内连接。实际业务中90%情况应将右表条件置于ON后。

kiwixing的博客 1002

mysql 使用left join添加where条件的问题分析

当前需求: 有group和factor两张表,一个group对应多个factor,现在想查询有效的group和对应的有效的factor,两个表都有isDel逻辑删除标志。 最开始的错误写法一: SELECT g.*,f.* FROM groups g LEFT JOIN factor f ON f.groupId = g.id where g.isDel=0 and f.isDel=0 LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2)

weixin_40300139的博客 1万+

SQL关于left join的重复问题和连接条件where on筛选问题

datediff为null的时候,左表结果为7,右表为0,其他的以此类推,和前面的结果是一样的。这样我们就知道了,没有达到预期的根源在于存在空的日期。可以看到最终得到了想要的结果,以最后一行为例,它表示,距离2019-09-29 5天的那天(也就是2019-09-24)活跃的人数有5个,那些人在2019-09-29仍然活跃的有2人,你可以看一下明细数据核对一下。a表有6条记录,b表有3条记录,且关键的键是唯一的,因此最终结果以a表为准有6条记录,b表有3条关联不上,相应的记录中,b表所有的字段都为空。

Java后端技术栈 4793

mysql查询语句join、on、where执行顺序

MySQL 的执行顺序 一、典型SELECT语句完整的执行顺序 1)from子句组装来自不同数据源的数据; 2)使用on进行join连接的数据筛选 3)where子句基于指定的条件对记录行进行筛选; 4)group by子句将数据划分为多个分组; 5)cube, rollup 6)使用聚集函数进行计算; 7)使用having子句筛选分组; 8)计算所有的表达式; 9)计算select的字段; 10)使用distinct 进行数据去重 11)使用order by对结果集进行排序。 12)选择TOPN的数据 二

lihongbao80的专栏 1万+

mysql中left join on后面and和where条件查询的差异

mysql中,运算符是有优先级的.举个例子 create table A(id int); INSERT INTO A VALUES(1); INSERT INTO A VALUES(2); INSERT INTO A VALUES(3); create table B(id int); INSERT INTO B VALUES(1); INSERT INTO B VALUES(2)

Amon 1万+

mysql left join on 与 where 筛选的差异

mysql left join   on 与 where 筛选的差异 准备两张表: a表: id a 1 a1 2 a2 3 a3 b表: id b 1 b1 2 b2 1.没有条件 SELECT * FROM a LEFT JOIN b ON a.id = b.id; -------------

清晨 6517

MySQL 中 LEFT JOIN 后的 ON 与 WHERE:你真的用对了吗?

在日常开发中,我们经常使用JOIN来关联多张表查询数据。其中,LEFT JOIN(左连接)因其保留左表所有记录的特性而被广泛使用。“在LEFT JOIN之后,应该用ON还是WHERE来添加过滤条件?这个问题的答案,不仅关系到查询结果的正确性,更直接影响数据的完整性和业务逻辑的准确性。今天,我们就来深入剖析ON和WHERE在LEFT JOIN中的作用机制,帮你彻底搞懂它们的区别与最佳实践。对比项ONWHERE执行阶段连接前(决定如何连接)连接后(过滤结果)对左表影响不影响(保留所有左表记录)

用文字记录技术,用分享回馈社区,用坚持见证成长 1715

MySQL:left join 后用 on 还是 where?

用于返回左表(即LEFT JOIN关键字左边的表)的所有记录,即使在右表中没有匹配的记录。子句中同时指定了连接条件和筛选条件,这样既保证了左表的完整性,又对连接后的结果进行了有效的过滤,只保留了那些有订单的记录。如果我们进一步想在结果中只包括那些至少有一个订单的客户,我们可能会尝试这样写,但这是错误的做法,因为它违背了。(部门表),我们想找出所有员工及其所在的部门名称,即使某些员工没有分配到具体的部门。子句确保了每个客户与他们的订单关联,即使没有订单的客户也会出现在结果集中,其。假设我们有两个表,一个是。

weixin_45195665的博客 1557
上一篇: mysql多条件排序
下一篇: ERROR 2003 (HY000): Can't connect to MySQL server on 'xx.xx.xx.xx' (110)
lcathm
博客等级 码龄18年 37粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值