SQL中on和where的区别

news2024/9/28 9:33:36

SQL中on和where的区别
  前言,在工作写SQL使用中,在涉及到多个表的关联时,既可以通过on进行数据过滤,又可以使用where进行数据过滤,

确实有点不太了解这两个关键字在left join后的区别,所以就去查了些资料,方便以后回顾。

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

在使用 left join 时,on 和 where 条件的区别如下:

1、on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
2、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
下面有两个表,用户表和用户地址表:表示用户和地址是1对多的关系

CREATE TABLE `t_user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '姓名',
  `age` int DEFAULT NULL COMMENT '年龄',
  `is_delete` int DEFAULT '0' COMMENT '0表示未删除,1表示已删除',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表';
 
INSERT INTO `demo`.`t_user` (`id`, `name`, `age`, `is_delete`) VALUES (1, '张三', 23, 0);
INSERT INTO `demo`.`t_user` (`id`, `name`, `age`, `is_delete`) VALUES (2, '李四', 24, 1);
INSERT INTO `demo`.`t_user` (`id`, `name`, `age`, `is_delete`) VALUES (3, '王五', 25, 0);
 
 
CREATE TABLE `t_address` (
  `id` int NOT NULL AUTO_INCREMENT,
  `user_id` int DEFAULT NULL COMMENT '用户id',
  `address` varchar(255) DEFAULT NULL COMMENT '地址',
  `is_delete` int DEFAULT NULL COMMENT '0表示未删除,1表示已删除',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户地址表';
 
INSERT INTO `demo`.`t_address` (`id`, `user_id`, `address`, `is_delete`) VALUES (1, 1, '北京朝阳', 0);
INSERT INTO `demo`.`t_address` (`id`, `user_id`, `address`, `is_delete`) VALUES (2, 1, '北京丰台', 0);
INSERT INTO `demo`.`t_address` (`id`, `user_id`, `address`, `is_delete`) VALUES (3, 2, '北京西城', 1);
INSERT INTO `demo`.`t_address` (`id`, `user_id`, `address`, `is_delete`) VALUES (4, 5, '北京海淀', 1);

在这里插入图片描述
如果要查询已存在用户的地址信息,应该写在on后面还是where条件后面呢?请看下面示例:

条件都写在on后面(×)

如果将条件都写在on 后面,会发现用户表中is_delete为1的数据并没有被过滤(即使在on后面写了过滤条件‘u.is_delete = 0’)

SELECT
    u.`name`,
    u.age,
    u.is_delete,
    a.address
FROM
    t_user u
    LEFT JOIN t_address a ON u.id = a.user_id and u.is_delete = 0
    AND a.is_delete = 0;

在这里插入图片描述
条件都写在where后面(×)

如果将条件都写在on 后面,会发现王五这个用户信息没有了,王五只是没有地址,不应该他也被过滤掉

SELECT
    u.`name`,
    u.age,
    u.is_delete,
    a.address
FROM
    t_user u
    LEFT JOIN t_address a ON u.id = a.user_id
WHERE
    u.is_delete = 0
    AND a.is_delete = 0;

在这里插入图片描述
正确写法

在被left join的‘地址表’中的条件应该写在on后面

主表的条件应该写在where条件后面,如下:

SELECT
    u.`name`,
    u.age,
    u.is_delete,
    a.address
FROM
    t_user u
    LEFT JOIN t_address a ON u.id = a.user_id and a.is_delete = 0
WHERE
    u.is_delete = 0;

在这里插入图片描述
总结:

left join 进行表关联时,关联表(主表)的过滤条件放在where后面,被关联表(子表)的过滤条件放在on后面!

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

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

相关文章

从产业链视角审视工作

从产业链视角审视工作:定位、价值与成长 作为一名技术博客博主,我经常收到各种关于职业发展、技术成长和学习路径的问题。最近,我看了一份学习报告,其中提到了一种非常有趣且实用的视角——从产业链的角度去审视自己的工作。这种视…

【实战指南】揭秘Pandas:从零开始掌握数据处理与分析的超级工具箱

目录 Series 创建 Series 访问数据 DataFrame 创建 DataFrame 读取 CSV 文件 写入 CSV 文件 基本操作 查看前几行: 查看后几行: 描述性统计: 选择列: 选择行: 条件筛选: 排序: 合并数据: Pandas 是一个强大的 Python 库,主要用于数据分析和数据处理…

【INTEL(ALTERA)】为什么我使用 PIO 边缘捕获中断的 Nios® II 设计不能正常工作?

目录 说明 解决方法 说明 当用户选择了不正确的边缘捕获设置,从而阻止触发中断时,可能会出现此问题。 在 PIO(并行 I/O)英特尔 FPGA IP内核中,如果“启用单个位设置/清除”选项被关闭,则将任何值写入边…

智驭未来:人工智能与目标检测的深度交融

在科技日新月异的今天,人工智能(AI)如同一股不可阻挡的浪潮,正以前所未有的速度重塑着我们的世界。在众多AI应用领域中,目标检测以其独特的魅力和广泛的应用前景,成为了连接现实与智能世界的桥梁。本文旨在…

精讲:java之多维数组的使用

一、多维数组简介 1.为什么需要二维数组 我们看下面这个例子?“ 某公司2022年全年各个月份的销售额进行登记。按月份存储,可以使用一维数组。如果改写为按季度为单位存储怎么办呢? 或许现在学习了一维数组的你只能申请四个一维数组去存储每…

探索Kotlin:从K1到K2

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 嘿,小伙伴们!今天我们来聊聊Kotlin,这个在安卓开发圈里越来越火的编程语言。…

轴心轨迹的绘制(包含降噪前处理,MATLAB)

由于旋转机械振动波形的噪声干扰大,直接对振动数据特征提取和选择的故障诊断方法,其精度容易受到噪声影响。当前,基于图像的旋转机械故障诊断技术已经得到飞速的发展。针对旋转机械的故障诊断问题,传统方法趋向于从振动数据中提取…

用6000万茅台案,了解什么是外挂?

近日,一起涉案金额高达6000余万元的案件出现在人们视野中。此前浙江丽水云和县公安局侦破了一起非法利用软件抢购电商平台茅台酒案。 据了解,犯罪嫌疑人以非法牟利为目的,开发了抢购软件,以有偿原价抢购电商平台飞天茅台酒为噱头&…

android13 rom frameworks 蓝牙自动接收文件

总纲 android13 rom 开发总纲说明 目录 1.前言 2.源码查找 3.我们先实现第一种改法 4.实现第二种改法 5.第三种改法代码参考 6.编译测试 1.前言 我们从导航栏这里,点开这个蓝牙的接收框,弹出来的对话框,使用android studio 的layout inspector可以发现这个是 Bluetoo…

如何用IP地址申请SSL证书实现网络安全

互联网是一个全球性的网络,它将世界各地的计算机系统和设备连接在一起。在这个庞大的网络中,每个设备都需要一个唯一的标识符,即IP(Internet Protocol)地址,以便其他设备能够找到并与其通信。然而&#xff…

解密 AI 客服:LangChain+ChatGPT 打造智能客服新时代

你需要了解 ChatGPT ChatGPT 是 OpenAI 开发的一种基于人工智能技术的自然语言处理模型。它可以通过对大量文本数据进行训练,自动生成高质量的回答和对话。ChatGPT 具有高效、准确、自然的特点,可以帮助人们更加高效地处理信息和交流。 ChatGPT 有很多…

硅纪元视角 | 电信公司出招!AI机器人全面反击AI诈骗电话

在数字化浪潮的推动下,人工智能(AI)正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展,捕捉行业动态;提供深入的新闻解读,助您洞悉技术背后的逻辑;汇聚行业专家的见解,…

基于GWO-CNN-BiLSTM数据回归预测(多输入单输出)-灰狼优化算法优化CNN-BiLSTM

基于GWO-CNN-BiLSTM数据回归预测(多输入单输出)-灰狼优化算法优化CNN-BiLSTM 1.数据均为Excel数据,直接替换数据就可以运行程序。 2.所有程序都经过验证,保证程序可以运行。 3.具有良好的编程习惯,程序均包含简要注释。 获取方式 https:/…

强化学习中的蒙特卡洛算法和时序差分算法

在强化学习(Reinforcement Learning, RL)中,价值函数的估计是核心任务之一。蒙特卡洛(Monte Carlo, MC)方法和时序差分(Temporal Difference, TD)方法是两种常用的策略,用于估计状态…

儿童房灯具什么牌子好?几款儿童房灯具款式墙裂分享

随着科技的不断发展和生活方式的改变,儿童青少年近视率的增长趋势引起了人们的关注。近视不仅对孩子们的视力健康构成威胁,还可能对他们的学习和日常生活带来不便。因此,如何有效地预防和改善儿童青少年的视力问题成为了一个亟待解决的课题。…

NodeJS校园快递智能互助平台-计算机毕业设计源码58554

摘 要 随着校园人口的增加和生活节奏的加快,校园快递成为一个重要的服务需求。然而,传统的校园快递方式存在一些问题,例如无法满足快速和高效的需求,易发生丢失或损坏的情况,同时也给快递人员和用户带来不便。因此&am…

AI转绘_animatediff-cli-prompt-travel

这个工具有两种主要模式:它可以直接通过提示创建视频,或者它可以对现有视频进行风格化。还有方法可以提高视频的分辨率。 正如工具名称所示,它的一个主要特点是"提示旅行"。这意味着你可以例如使用特定的提示用于前20帧&#xff0…

多个标签页中复用同一 QTableView

在 PyQt 中实现在多个标签页中复用同一个 QTableView 实例,复用同一个 QTableView 实例可以减少内存和资源的使用。每个 QTableView 实例都会消耗一定的内存和处理资源,如果每个标签页都创建一个新的实例,会增加系统的负担。通过复用实例&…

TQZC706开发板教程:在ZC706+ADRV9009硬件平台运行ADI Linux

本教程使用2024-06-18的ADI镜像文件,创建ZC706ADRV9009的linux工程进行测试。 首先需要下载ADI的镜像文件下载地址如所示: https://wiki.analog.com/resources/tools-software/linux-software/adi-kuiper_images/release_notes#r2_patch_1 烧写完成后若…

JavaSE 面向对象程序设计进阶 IO流 字节流详解 抛出异常

input output 像水流一样读取数据 存储和读取数据的解决方案 内存中数据不能永久化存储 程序停止运行 数据消失 File只能对文件本身进行操作 不能读写文件里存储的数据 读写数据必须要有IO流 可以把程序中的数据保存到文件当中 还可以把本地文件中的数据读取到数据当中 分…