SQL 多表查询实用技巧:ON 和 WHERE 的区别速览 - 教程

news/2025/10/17 13:34:35/文章来源:https://www.cnblogs.com/yxysuanfa/p/19147627

在 SQL 面试和实际开发中,多表查询是绕不过去的重点。尤其是 ON 和 WHERE 的区别,很多初学者常常混淆,结果写出的语句逻辑错误,甚至导致材料结果不一致。本文带你快速理清这两者的区别和应用场景,避免踩坑。

一、基础概念回顾

在多表查询中,常见的写法有两种:

1. 在 JOIN ... ON 中写条件

用于指定两张表之间的连接关系,比如主外键的对应。

2. 在 WHERE 中写条件

用于对最终结果集再进行筛选,类似于过滤器。

简单来说,ON 是连接条件,WHERE 是结果集过滤条件。

二、ON 与 WHERE 的差异

1. INNER JOIN 中差异不大

当使用 INNER JOIN 时,无论把条件写在 ON 还是 WHERE 中,结果基本一致。因为内连接本身就是取两表交集部分。

示例:

-- 条件写在 ON

SELECT s.id, s.name, c.course_name

FROM Student s

INNER JOIN Course c ON s.id = c.student_id;

-- 条件写在 WHERE

SELECT s.id, s.name, c.course_name

FROM Student s

INNER JOIN Course c

WHERE s.id = c.student_id;

两者的结果相同。

2. OUTER JOIN 中差异显著

在 LEFT JOIN 或 RIGHT JOIN 中,ON 和 WHERE 的位置不同,结果可能差别很大。

● 条件写在 ON 中

保证了外连接的特性,比如 LEFT JOIN 会保留左表全部数据,即使右表没有匹配记录。

● 条件写在 WHERE 中

会对结果集进行二次过滤,可能导致外连接退化为内连接。

示例:

-- 条件写在 ON 中(会保留所有学生,即使没有课程)

SELECT s.id, s.name, c.course_name

FROM Student s

LEFT JOIN Course c ON s.id = c.student_id;

-- 条件写在 WHERE 中(只保留有课程的学生,左连接失效)

SELECT s.id, s.name, c.course_name

FROM Student s

LEFT JOIN Course c ON s.id = c.student_id

WHERE c.course_name IS NOT NULL;

第一条语句会保留所有学生;第二条语句会丢掉没有课程的学生,等同于 INNER JOIN。

三、常见面试陷阱

1. 问:为什么 LEFT JOIN 还写了 WHERE c.col IS NOT NULL,结果和 INNER JOIN 一样?

因为 WHERE 把空值过滤掉了,丢掉了外连接的“补全”功能。

2. 问:实际项目里该怎么写?

连接条件写在 ON,过滤条件写在 WHERE,语义清晰,不容易混淆。

3. 问:能否凭借 ON 写过滤条件?

可以,但要谨慎。比如 ON c.status = 'active',这意味着只在连接时考虑满足条件的行,不会再保留其他结果。

四、最佳实践总结

ON:定义两表之间的连接关系。

WHERE:在结果集上再做过滤。

INNER JOIN:两者差别不大。

OUTER JOIN:差别显著,容易出错,必须小心。

一句口诀:

“连接写在 ON,过滤放 WHERE,OUTER JOIN 特别注意不要混用。”

五、结语

多表查询是 SQL 的高频考点,也是研发常见的操作。真正理解 ON 和 WHERE 的区别,不仅能避免逻辑 bug,还能在面试中体现你对 SQL 细节的掌握。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/938861.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows 11 或 Windows 10 注册表修改企业版为专业版

Windows 11 或 Windows 10 版本标识修改指南( qwen 指导版) 本文档详细介绍了如何修改Windows 11/10 的版本标识信息,包括ProductName、EditionID和CompositionEditionID等注册表键值。 概述 此方法仅修改注册表中的…

低代码平台核心概念与设计理念

低代码平台核心概念与设计理念 1. 低代码平台概述 1.1 定义和特性 低代码平台(Low-Code Development Platform, LCDP)是一种通过可视化建模与配置,最小化手写代码量,从而快速构建和交付应用程序的软件开发平台。其…

PyTorch nn.Linear 终极详解:从零理解线性层的一切(含可视化+完整代码) - 指南

PyTorch nn.Linear 终极详解:从零理解线性层的一切(含可视化+完整代码) - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font…

C# Avalonia 16- Animation- ExpandElement2

C# Avalonia 16- Animation- ExpandElement2ExpandElement2.axaml代码<Window xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="…

2025年10月洗碗机品牌榜单推荐:五强性能全解析

在选择洗碗机品牌时,关键在于找到最适合自身实际需求的解决方案。中国家电协会2024年发布的《家用洗碗机行业服务标准白皮书》显示,国内洗碗机保有量已突破2200万台,年复合增长率保持在18%左右;其中,一级保管等级…

PolarDB Supabase 助力 Qoder、Cursor、Bolt.diy 完成 VibeCoding 最后一公里

引言:在“摩擦力”中追寻心流 Vibecoding——是每一位开发者都在追寻的理想境界:一种思想与代码完全同步、创造力毫无阻碍的沉浸式“心流”状态。然而,在日常工作中会常被各种“摩擦力”无情打断:繁琐的后端配置、…

问题一

问题一模型蓝方航迹离散为序列 ({(t_i,\mathbf{r}i,\mathbf{v}i)}^{N-1})(1 s 采样),(\mathbf{r}i=(x_i,y_i,z_i)),(\mathbf{v}i=(v,v,v));trajectory.py 中 TrajectoryPoint 对象承载这些数据。 红方 A 型雷达集…

2025年陶瓷过滤机厂家权威推荐榜:盘式/矿用/全自动陶瓷真空过滤机,真空脱水机,尾矿干排设备,圆盘过滤机源头企业深度解析

2025年陶瓷过滤机厂家权威推荐榜:盘式/矿用/全自动陶瓷真空过滤机,真空脱水机,尾矿干排设备,圆盘过滤机源头企业深度解析行业背景与发展趋势随着现代工业对固液分离技术要求的不断提高,陶瓷过滤机作为高效节能的分…

00-第一个C语言程序-Hello,world

一、第一个学习的C语言程序点击查看代码 #include <stdio.h> int main() {printf("hello, world\n");return 0; }![image](https://img2024.cnblogs.com/blog/3625321/202510/3625321-202510171318569…

提取ai字幕

提取B站视频AI字幕方法 先关闭AI字幕,然后再进入控制里面的网络 之后再打开AI字幕,拉拉进度条,让字幕显示出来之后在过滤器里面输入过滤词"ai_subtitle",之后会出现两个点开开头不是web的一行,里面的响应…

乙二醇

大3浪 内部的浪结构 还差一跌

左右互搏--- 一种高效的CLI工作方法实践

左右互搏--- 一种高效的CLI工作方法实践目录方案一:一个 Claude 写代码,另一个 iFlow或Claude 审查和测试方案二. 多仓库检出方案三:用 git worktree实施建议用无头模式配合自定义脚本Claude Code 34条使用技巧 本文…

图论初步 - L

一、图 1. 图的概念 图是一种数据结构,由节点和连接它们的边构成。 数学上,一般使用 \(G = (V, E)\) 表示一个点集为 \(V\),边集为 \(E\) 的图。 与一个顶点 \(u\) 关联的边的个数叫做顶点 \(u\) 的的度,用 \(d(u)…

2025 集装箱吊机厂家推荐:乳山华江以智能技术+硬核质量破局,解决选机难题!

随着全球贸易复苏与物流基建升级,集装箱吊机作为货物周转核心装备,市场需求在 2025 年持续扩大。数据显示,该领域年复合增长率已达 6.5%,智能化与绿色化成为行业竞争核心。但市场扩容也导致厂商技术实力、产品稳定…

使用python脚本大批量自动化处理图片上的ai水印

import os import time from pywinauto.application import Application from pywinauto.keyboard import send_keys import traceback from pywinauto import mousedef get_app_and_main_window(app_path):app = App…

springboot结合阿里巴巴easyexcel,实现一键导出数据到Excel中

技术说明: springboot:2.1.4.RELEASE jQuery Ajax mysql:8.0.32 作业背景 我现在有个实体类,数据库里面有1000行数据,我需要实现全部自动导出到Excel表格中,接下来就是实现这个功能的额, pom.xml<dependency…

深入解析:PX4 无人机地面调试全攻略:从机械到参数的系统优化

深入解析:PX4 无人机地面调试全攻略:从机械到参数的系统优化pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

以江协科技STM32入门教程的方式打开FreeRTOS——STM32C8T6如何移植FreeRTOS - 教程

以江协科技STM32入门教程的方式打开FreeRTOS——STM32C8T6如何移植FreeRTOS - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fon…

2025年陶瓷过滤板厂家推荐排行榜,白刚玉陶瓷过滤板,棕刚玉陶瓷过滤板,扇形陶瓷板,真空陶瓷过滤板,陶瓷滤膜,陶瓷过滤机配件公司推荐

2025年陶瓷过滤板厂家推荐排行榜:白刚玉、棕刚玉、扇形陶瓷板专业解析行业背景与发展现状在工业生产过程中,固液分离技术一直是关键环节,而陶瓷过滤板作为核心过滤材料,其性能直接影响生产效率和产品质量。随着环保…