MySQL:left join 后用 on 还是 where?
在MySQL中,LEFT JOIN
用于返回左表(即LEFT JOIN关键字左边的表)的所有记录,即使在右表中没有匹配的记录。对于那些右表中没有匹配的记录,结果集中右表的部分会被填充为NULL。关于ON
和WHERE
子句的使用,它们在LEFT JOIN
中的作用是不同的:
- ON 子句:用于定义连接条件,即决定哪些记录应该被连接在一起。当你需要基于左右表的某些字段值的关系来组合记录时,这些条件应该放在
ON
后面。如果在ON
后面还有对右表的额外条件限制,这些也会在连接时应用,但不会影响左表返回所有记录的原则。 - WHERE 子句:用于对已经通过
JOIN
操作产生的结果集进行进一步的过滤。当条件放在WHERE
子句中时,那些不符合条件的记录(无论是左表的还是右表的)都会被移除,这可能会影响到左表返回所有记录的初衷,尤其是在处理NULL值时需格外小心。
具体案例一:
假设我们有两个表,一个是employees
(员工表),另一个是departments
(部门表),我们想找出所有员工及其所在的部门名称,即使某些员工没有分配到具体的部门。
employees 表:
id | name |
---|---|
1 | Alice |
2 | Bob |
3 | Carol |
departments 表:
id | name |
---|---|
1 | HR |
2 | IT |
3 | Marketing |
其中,employees
表的department_id
字段可以是NULL,表示没有分配部门。
使用 ON 示例:
SELECT employees.name, departments.name AS department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.id;
这个查询会返回所有员工的名字,以及他们对应的部门名字,如果员工没有部门(即department_id
为NULL),部门名字则为NULL。
使用 WHERE 示例:
SELECT employees.name, departments.name AS department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.id
WHERE departments.id IS NOT NULL;
这个查询试图过滤掉那些部门ID为NULL的记录,但由于使用的是LEFT JOIN
,加上WHERE
子句过滤掉NULL的部门ID实际上会导致那些没有分配部门的员工也被排除在外,违反了LEFT JOIN
的初衷,即返回左表所有记录。因此,在大多数情况下,如果你想保留左表的所有记录,应避免在WHERE
子句中过滤与右表相关的NULL值,而是应该在ON
子句中完成所有必要的连接条件和限制。
正确的做法是在ON
子句中处理所有连接条件,然后仅在确实需要进一步过滤整个结果集(而不影响左表完整性)时才使用WHERE
子句。
具体案例二:
假设我们有两个表,一个是Orders
(订单表),一个是Customers
(客户表),我们想找出所有客户的订单信息,即使某些客户还没有下过任何订单。
Orders表:
- OrderID
- CustomerID
- ProductName
Customers表:
- CustomerID
- CustomerName
使用ON的例子
如果我们想找到所有客户的订单,即使他们没有订单,我们会这样写:
SELECT Customers.CustomerName, Orders.ProductName
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
在这个查询中,ON
子句确保了每个客户与他们的订单关联,即使没有订单的客户也会出现在结果集中,其ProductName
为NULL。
使用WHERE的例子
如果我们进一步想在结果中只包括那些至少有一个订单的客户,我们可能会尝试这样写,但这是错误的做法,因为它违背了LEFT JOIN
的初衷:
SELECT Customers.CustomerName, Orders.ProductName
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
WHERE Orders.OrderID IS NOT NULL; -- 这里会过滤掉左表中无匹配项的记录
上述查询实际上会变成内连接的效果,因为WHERE
子句排除了左表中没有匹配项(即订单为NULL)的记录。
正确的使用方式
如果我们的目的是在保留所有客户的同时,筛选出有订单的客户信息,我们应该这样写:
SELECT Customers.CustomerName, Orders.ProductName
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID AND Orders.OrderID IS NOT NULL;
在这个修正的查询中,我们在ON
子句中同时指定了连接条件和筛选条件,这样既保证了左表的完整性,又对连接后的结果进行了有效的过滤,只保留了那些有订单的记录。
相关文章:
MySQL:left join 后用 on 还是 where?
在MySQL中,LEFT JOIN用于返回左表(即LEFT JOIN关键字左边的表)的所有记录,即使在右表中没有匹配的记录。对于那些右表中没有匹配的记录,结果集中右表的部分会被填充为NULL。关于ON和WHERE子句的使用,它们在…...
openfoam生成的非均匀固体Solid数据分析、VTK数据格式分析、以及paraview官方用户指导文档和使用方法
一、openfoam生成的非均匀固体Solid数据分析 二、VTK数据格式分析 三、paraview官方用户指导文档和使用方法 官网文档链接:在paraview软件中,点击工具栏中的help->paraview guide 即可直接跳转到浏览器打开官网指导页面。 官网链接如下:…...

JVM:类的生命周期
文章目录 一、介绍二、加载阶段三、连接阶段1、验证阶段2、准备阶段3、解析阶段 四、初始化阶段 一、介绍 类的生命周期描述了一个类加载、连接(验证、准备和解析)、初始化、使用、卸载的整个过程。 二、加载阶段 加载(Loading)…...

几种不同的方式禁止IP访问网站(PHP、Nginx、Apache设置方法)
1、PHP禁止IP和IP段访问 <?//禁止某个IP$banned_ip array ("127.0.0.1",//"119.6.20.66","192.168.1.4");if ( in_array( getenv("REMOTE_ADDR"), $banned_ip ) ){die ("您的IP禁止访问!");}//禁止某个IP段…...

经典 SQL 数据库笔试题及答案整理
最近有蛮多小伙伴在跳槽找工作,但对于年限稍短的软件测试工程师,难免会需要进行笔试,而在笔试中,基本都会碰到一道关于数据库的大题,今天这篇文章呢,就收录了下最近学员反馈上来的一些数据库笔试题…...

JS代码动态打印404页面源码
JS代码动态打印404页面源码,适合做网站错误页,具有js动态打印效果,喜欢的朋友可以拿去 源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务…...

从“钓”到“管”:EasyCVR一体化视频解决方案助力水域安全管理
一、背景 随着城市化进程的加快,越来越多的市民热衷于钓鱼活动。钓鱼活动在带来乐趣的同时,也伴随着一定的安全隐患。尤其是在一些危险水域,也经常出现垂钓者的身影,非法垂钓,这给城市管理带来了不小的阻力。传统的人…...

springboot大学生竞赛管理系统-计算机毕业设计源码37276
摘 要 随着教育信息化的不断发展,大学生竞赛已成为高校教育的重要组成部分。传统的竞赛组织和管理方式存在着诸多问题,如信息不透明、效率低下、管理不便等。为了解决这些问题,提高竞赛组织和管理效率,本文设计并实现了一个基于Sp…...

提高LabVIEW软件的健壮性
提高LabVIEW软件的健壮性,即增强其在各种操作条件下的可靠性和稳定性,是开发过程中非常重要的一环。健壮的软件能够在面对意外输入、极端环境和系统故障时依然表现出色,确保系统的连续性和可靠性。以下是详细的方法和策略,从多个角…...

不同深度的埋点事件如何微妙地改变广告系列的成本
/ 作者简介 / 本篇文章来自现金贷领域市场投放大佬 亮哥 的投稿,主要分享了在广告投放过程中,不同深度的埋点事件如何微妙地改变广告系列的成本的相关经验,相信会对大家有所帮助!同时也感谢作者贡献的精彩文章。 / 前言 …...
Perl 语言进阶学习
Perl 语言进阶学习 在掌握 Perl 的基础知识后,进一步学习 Perl 的高级特性和应用,将有助于提升编程效率和解决复杂问题的能力。本文将详细介绍 Perl 语言的高级功能、最佳实践以及实际应用案例。 目录 高级数据结构 多维数组复杂数据结构 引用与匿名数…...

el-input-number @input.native触发,修改值失效
试过在方法里用this.$set()、this.$next(()>{})没生效 解决方案:如下...
这些实用工具函数都撕不明白还敢说自己是高级前端
很多工具函数大家都知道,比如防抖函数,节流函数,深拷贝函数等,一问都会,一写就废,用lodash的掘友们,是不是基本功都退化了?CV工程师请不要把基本功给弄丢了,下面我来整理一下项目中常用的工具函数,多练练吧,不然面试现场写不出来多丢人啊! 1.防抖函数 /*** 防抖函…...
git 如何查看 commit 77062497
在Git中,要查看特定commit(如77062497)的详细信息,你可以使用git show命令。如果77062497是一个完整的commit哈希值(在Git中,commit哈希值通常是40位的十六进制数),你可能需要输入完…...

纯CSS瀑布流
<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>瀑布流布局</title> <style>/* 瀑布…...
vue3 路由跳转新页面并传递参数与获取参数
打开新标签页面传递参数(useRouter ) import { useRouter } from vue-router const uRouter useRouter() let page uRouter.resolve({path:/mapRollerShutter,query:{type:Split,key:1}})window.open(page.href,_blank)页面接收(useRoute …...

NSAT-8000电源检测软件测试砖式电源模块的方案及优势
砖式电源模块类型 砖式电源,顾名思义其外观尺寸像块砖,具有体积小、功率大、安装方便等特点。砖式电源模块具备高可靠性和高稳定性,能够为设备提供稳定的电力输出,在通信、工业、医疗等领域广泛应用。 根据尺寸大小,砖…...

短链接服务Octopus-搭建实战
[WARNING] The POM for cn.throwx:octopus-contract:jar:1.0-SNAPSHOT is missing, no dependency information available 解决方案: cd octopus-contract/ mvn install -------------- ➜ octopus-server git:(master) ✗ mkdir -p /data/log-center/octopus/s…...

STM32(二):STM32工作原理
0、参考1、寄存器和存储器基本概念(1)基本概念(2)主要区别(3)联系(4)实际应用中的案例(5)总结(6)一些名词解释 2、STM32指南者板子-存…...
真实工作项目Java使用apache.poi生成word
加油,新时代打工人! 将实体类利用poi转成Word文件 demo示例 package com.fqpais.util;import com.fqpais.business.domain.TestReportTemplate; import com.fqpais.common.utils.StringUtils; import org.apache.poi.xwpf.usermodel.*; import org.slf4…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...