当前位置: 首页 > news >正文

MySQL:left join 后用 on 还是 where?

在MySQL中,LEFT JOIN用于返回左表(即LEFT JOIN关键字左边的表)的所有记录,即使在右表中没有匹配的记录。对于那些右表中没有匹配的记录,结果集中右表的部分会被填充为NULL。关于ONWHERE子句的使用,它们在LEFT JOIN中的作用是不同的:

  • ON 子句:用于定义连接条件,即决定哪些记录应该被连接在一起。当你需要基于左右表的某些字段值的关系来组合记录时,这些条件应该放在ON后面。如果在ON后面还有对右表的额外条件限制,这些也会在连接时应用,但不会影响左表返回所有记录的原则。
  • WHERE 子句:用于对已经通过JOIN操作产生的结果集进行进一步的过滤。当条件放在WHERE子句中时,那些不符合条件的记录(无论是左表的还是右表的)都会被移除,这可能会影响到左表返回所有记录的初衷,尤其是在处理NULL值时需格外小心。

具体案例一:

假设我们有两个表,一个是employees(员工表),另一个是departments(部门表),我们想找出所有员工及其所在的部门名称,即使某些员工没有分配到具体的部门。

employees 表:

idname
1Alice
2Bob
3Carol

departments 表:

idname
1HR
2IT
3Marketing

其中,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&#xff09…...

几种不同的方式禁止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禁止访问&#xff01;");}//禁止某个IP段…...

经典 SQL 数据库笔试题及答案整理

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

JS代码动态打印404页面源码

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

从“钓”到“管”:EasyCVR一体化视频解决方案助力水域安全管理

一、背景 随着城市化进程的加快&#xff0c;越来越多的市民热衷于钓鱼活动。钓鱼活动在带来乐趣的同时&#xff0c;也伴随着一定的安全隐患。尤其是在一些危险水域&#xff0c;也经常出现垂钓者的身影&#xff0c;非法垂钓&#xff0c;这给城市管理带来了不小的阻力。传统的人…...

springboot大学生竞赛管理系统-计算机毕业设计源码37276

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

提高LabVIEW软件的健壮性

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

不同深度的埋点事件如何微妙地改变广告系列的成本

/ 作者简介 / 本篇文章来自现金贷领域市场投放大佬 亮哥 的投稿&#xff0c;主要分享了在广告投放过程中&#xff0c;不同深度的埋点事件如何微妙地改变广告系列的成本的相关经验&#xff0c;相信会对大家有所帮助&#xff01;同时也感谢作者贡献的精彩文章。 / 前言 …...

Perl 语言进阶学习

Perl 语言进阶学习 在掌握 Perl 的基础知识后&#xff0c;进一步学习 Perl 的高级特性和应用&#xff0c;将有助于提升编程效率和解决复杂问题的能力。本文将详细介绍 Perl 语言的高级功能、最佳实践以及实际应用案例。 目录 高级数据结构 多维数组复杂数据结构 引用与匿名数…...

el-input-number @input.native触发,修改值失效

试过在方法里用this.$set()、this.$next(()>{})没生效 解决方案&#xff1a;如下...

这些实用工具函数都撕不明白还敢说自己是高级前端

很多工具函数大家都知道,比如防抖函数,节流函数,深拷贝函数等,一问都会,一写就废,用lodash的掘友们,是不是基本功都退化了?CV工程师请不要把基本功给弄丢了,下面我来整理一下项目中常用的工具函数,多练练吧,不然面试现场写不出来多丢人啊! 1.防抖函数 /*** 防抖函…...

git 如何查看 commit 77062497

在Git中&#xff0c;要查看特定commit&#xff08;如77062497&#xff09;的详细信息&#xff0c;你可以使用git show命令。如果77062497是一个完整的commit哈希值&#xff08;在Git中&#xff0c;commit哈希值通常是40位的十六进制数&#xff09;&#xff0c;你可能需要输入完…...

纯CSS瀑布流

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>瀑布流布局</title> <style>/* 瀑布…...

vue3 路由跳转新页面并传递参数与获取参数

打开新标签页面传递参数&#xff08;useRouter &#xff09; import { useRouter } from vue-router const uRouter useRouter() let page uRouter.resolve({path:/mapRollerShutter,query:{type:Split,key:1}})window.open(page.href,_blank)页面接收&#xff08;useRoute …...

NSAT-8000电源检测软件测试砖式电源模块的方案及优势

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

短链接服务Octopus-搭建实战

[WARNING] The POM for cn.throwx:octopus-contract:jar:1.0-SNAPSHOT is missing, no dependency information available 解决方案&#xff1a; cd octopus-contract/ mvn install -------------- ➜ octopus-server git:(master) ✗ mkdir -p /data/log-center/octopus/s…...

STM32(二):STM32工作原理

0、参考1、寄存器和存储器基本概念&#xff08;1&#xff09;基本概念&#xff08;2&#xff09;主要区别&#xff08;3&#xff09;联系&#xff08;4&#xff09;实际应用中的案例&#xff08;5&#xff09;总结&#xff08;6&#xff09;一些名词解释 2、STM32指南者板子-存…...

真实工作项目Java使用apache.poi生成word

加油&#xff0c;新时代打工人&#xff01; 将实体类利用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…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!

目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...

PH热榜 | 2025-06-08

1. Thiings 标语&#xff1a;一套超过1900个免费AI生成的3D图标集合 介绍&#xff1a;Thiings是一个不断扩展的免费AI生成3D图标库&#xff0c;目前已有超过1900个图标。你可以按照主题浏览&#xff0c;生成自己的图标&#xff0c;或者下载整个图标集。所有图标都可以在个人或…...

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践&#xff0c;很多人以为AI已经强大到不需要程序员了&#xff0c;其实不是&#xff0c;AI更加需要程序员&#xff0c;普通人…...