MSQL系列(十四) Mysql实战-SQL语句 left join inner join On和Where语句的区别

Mysql实战-SQL语句On和Where语句的区别

前面我们讲解了Join的底层驱动表 选择原理,也知道了基本的内连接外连接两种SQL查询表连接方式
但是我们再查询多表的时候on和where语句到底有什么区别?

  • where是过滤条件 ,不满足where的一定不会出现在结果中
  • on是连接条件, 对于内连接来说 on和where效果一致
  • 对于外连接来说, 如果在被驱动表中无法匹配on的过滤条件,该记录是要加入到结果集中
  • 不符合匹配条件的被驱动表的数据,全部用NULL值填充
  • 先 on 再left join 再where
  • 使用on关键字时,会先根据on后面的条件进行筛选,条件为真时返回该行
  • on的优先级高于left join,所以left join关键字会把左表中没有匹配的所有行也都返回,然后生成临时表返回
  • where对与行的筛选是在left join之后的,也就是生成临时表之后对临时表进行筛选

下面我们来实战SQL演练一下

文章目录

      • Mysql实战-SQL语句On和Where语句的区别
        • 1.建表及测试数据
        • 2. 内连接的on连接过滤条件等同于where过滤条件
        • 3.left join 外连接 on 连接条件
        • 4.left join where 过滤条件
        • 5.更复杂的 on 和 where的对比

1.建表及测试数据

我们先创建两个表 test_user 和 test_order 这两个表作为我们的测试表及测试数据

  • test_user 5条数据, 索引只有主键id
  • test_order 3条数据,索引同样也只有主键id
#创建test_user
CREATE TABLE `test_user` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',`user_name` char(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户名字',`age` int DEFAULT NULL COMMENT '年龄',PRIMARY KEY (`id`),KEY `idx_age` (`age`),KEY `idx_name` (`user_name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';#创建表 test_order
CREATE TABLE `test_order` (`id` int NOT NULL AUTO_INCREMENT,`user_id` int NOT NULL COMMENT '用户id,就是test_user的唯一主键id',`order_name` varchar(32) NOT NULL DEFAULT '订单信息',`pay` int NOT NULL DEFAULT '0',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单表';

插入数据

#插入 user 用户数据
INSERT INTO `prepare`.`test_user` (`id`, `user_name`, `age`) VALUES (1, 'aa', 10);
INSERT INTO `prepare`.`test_user` (`id`,  `user_name`, `age`) VALUES (2, 'bb', 20);
INSERT INTO `prepare`.`test_user` (`id`,  `user_name`, `age`) VALUES (3, 'cc', 30);
INSERT INTO `prepare`.`test_user` (`id`, `user_name`, `age`) VALUES (4, 'dd', 40);#插入 order 订单数据
INSERT INTO `prepare`.`test_order` (`id`, `user_id`, `order_name`, `pay`) VALUES (1, 1,'衣服', 100);
INSERT INTO `prepare`.`test_order` (`id`, `user_id`, `order_name`, `pay`) VALUES (2, 2,'鞋子',  200);
INSERT INTO `prepare`.`test_order` (`id`, `user_id`, `order_name`, `pay`) VALUES (3, 2,'电视',  300);

根据表记录 可以知道

  • user用户表有4个用户, aa,bb,cc,dd
  • order订单表有 1,2,3 个订单, aa一条衣服, bb用户一个鞋子,一个电视

在这里插入图片描述

2. 内连接的on连接过滤条件等同于where过滤条件

当连接条件是 inner join内连接时, on连接的过滤条件 等同于 where 过滤条件

也就是说 你把过滤条件 放到 on 语句后面 或者放到 where 语句后面,效果是一致的

#on语句过滤条件
select * from test_user inner join test_order on test_user.id = test_order.user_id;
#where语句作为过滤条件
select * from test_user inner join test_order where test_user.id = test_order.user_id;

在这里插入图片描述

3.left join 外连接 on 连接条件

left join外连接的时候, on 连接条件过滤 和 where 条件过滤 区别就很大了, on 条件是 被驱动表 不匹配的也要展示, 用NULL来填充

但是 where语句就是 不满足的全部都过滤掉, 下面我们来实际看下效果

  • on语句 的过滤条件, 不符合的展示出来,用NULL填充
#找出驱动表
explain select * from test_user left join test_order on ( test_user.id = test_order.user_id)  and test_order.user_id = 2;
#查询结果
select * from test_user left join test_order on ( test_user.id = test_order.user_id)  and test_order.user_id = 2;

查看结果

  • test_user是驱动表, 那么test_order就是被驱动表
  • on 条件是 ( test_user.id = test_order.user_id) and test_order.user_id = 2
  • 是否只返回了 test_order.user_id = 2 的数据 ? 并不是, user_id 不等于2的也都返回了
  • 只不过 她们的被驱动表数据 order 的数据 全都是 NULL填充的
  • 所以 on 后面的过滤条件, 不是做过滤的,而是做匹配的, 不匹配的用NULL填充
    在这里插入图片描述在这里插入图片描述
4.left join where 过滤条件

前面我们看到了 用 on 去 连接两个表, 并且设置了 test_order.user_id = 2
但是返回结果 并不是 user_id = 2的数据, 而是 不匹配的数据用NULL来代替了

如果是 where 语句呢?
如果说 test_order.user_id = 2 挂在where语句后面 效果是什么样子呢?

#查看驱动表
explain
select * from test_user left join test_order on ( test_user.id = test_order.user_id)  where test_order.user_id = 2;#执行查询语句
select * from test_user left join test_order on ( test_user.id = test_order.user_id)  where test_order.user_id = 2;

查看执行结果

  • test_user是驱动表, 那么test_order就是被驱动表
  • on 条件是 ( test_user.id = test_order.user_id)
  • where 条件是 where test_order.user_id = 2
  • 数据结果只有 test_order.user_id = 2 的数据 才返回, 别的 都不返回
  • 所以 where 后面的过滤条件, 就是做过滤的, 只要where不满足, 结果就不会满足
    在这里插入图片描述
    在这里插入图片描述
5.更复杂的 on 和 where的对比

如果 上面的例子 你还是没区分出来 on 和 where的 区别, 我们再来一个更加直观的, 一眼就看出来区别

#on 条件
select * from test_user left join test_order on  test_user.id = test_order.user_id  and test_order.pay > 100;
#where 条件
select * from test_user left join test_order on  test_user.id = test_order.user_id  where test_order.pay > 100;

我们看下执行结果

  • on条件查询
    • pay > 100 的 数据返回
    • pay <= 100的也有一条, 但是都用NULL填充了
    • 返回了 驱动表 test_user 连接 被驱动表 test_order 的符合数据的所有数据 5条数据 且 >100 的 2条 正常展示
    • pay <= 100的数据 用NULL填充
    • on先执行 , 连接条件生成临时表, 所以数据就在那里了, 5条数据
    • 然后 匹配 pay >100 的2条, 匹配展示, 其余的 全都 NULL填充
  • where 条件查询
    • 结果 只有2条数据 pay>100 的就2条数据
    • where是基于临时表去过滤的
    • 不满足的不会呈现到返回结果

在这里插入图片描述


至此,我们已经彻底分清楚了 on语句和where语句的区别, 这对于我们能够正确的处理业务,十分重要

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

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

相关文章

网上3D虚拟数字展厅进一步增强营销效果

数字化营销已经成为了企业推广产品和服务的重要手段。由于制作成本及周期限制&#xff0c;企业或个人难以拥有个性化的3D云展厅&#xff0c;顺应市场需求和时代发展&#xff0c;3D云展数字平台作为一种新型的数字化营销工具&#xff0c;具有许多传统营销方式无法比拟的优势。 3…

怎么调整excel表里面所有单元格中,某个相同字体大小,单元格中其他文字大小不变?

环境: excel 2021 python3.8 问题描述: 怎么调整excel表里面所有单元格里面1这个字体大小,单元格里面其他文字不变? excel表里面。很多单元格都有1,1和文字都是10号字体,现在想把全部1字字体调整为16号其他字大小都不变 解决方案: 一、使用python来实现,经过测…

iOS加固原理与常见措施:保护移动应用程序安全的利器

目录 iOS加固原理与常见措施&#xff1a;保护移动应用程序安全的利器 前言 一、iOS加固的原理 1. 代码混淆 2. 加密算法 3. 防调试技术 4. 签名校验 二、iOS加固的常见措施 1. 代码混淆 2. 加密算法 3. 防调试技术 4. 签名校验 三、iOS加固的效果和注意事项 参考…

如何在macbook上删除文件?Mac删除文件的多种方法

在使用MacBook电脑时&#xff0c;桌面上经常会积累大量的文件&#xff0c;而这些文件可能已经不再需要或已经过时。为了保持桌面的整洁和提高电脑性能&#xff0c;我们需要及时删除这些文件。本文将介绍MacBook怎么删除桌面文件&#xff0c;以及macbook删除桌面文件快捷键。 一…

为什么说亚马逊、Lazada、虾皮等跨境平台测评很重要?

在亚马逊、shopee、Lazada的生态系统中&#xff0c;给店铺测评是一个重要的环节&#xff0c;优质的评论可以给潜在的买家对于产品质量更加信任&#xff0c;其次对于提高产品的销售跟排名也可以起到关键的作用 为什么测评重要&#xff1f; 1. 提高页面权重 一般页面有三个部分…

【大数据】Apache NiFi 数据同步流程实践

Apache NiFi 数据同步流程实践 1.环境2.Apache NIFI 部署2.1 获取安装包2.2 部署 Apache NIFI 3.NIFI 在手&#xff0c;跟我走&#xff01;3.1 准备表结构和数据3.2 新建一个 Process Group3.3 新建一个 GenerateTableFetch 组件3.4 配置 GenerateTableFetch 组件3.5 配置 DBCP…

Linux学习第36天:Linux RTC 驱动实验:时间是一条流淌的河

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 RTC就是实时时钟。 本笔记主要学习Linux RTC驱动试验&#xff0c;主要内容包括Linux内核RTC驱动简介、I.MX6U内部RTC分析、RTC时间查看与设置。因为Linux内核已经…

matplotlib.pyplot学习笔记

import matplotlib.pyplot as plt import numpy as np # 画单条线 plot([x], y, [fmt], *, dataNone, **kwargs) # 画多条线 plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs) >>> plot(x, y) # 创建 y 中数据与 x 中对应值的二维线图&#xff0c;使用…

【GEE】8、Google 地球引擎中的时间序列分析【时间序列】

1简介 在本模块中&#xff0c;我们将讨论以下概念&#xff1a; 处理海洋的遥感图像。 从图像时间序列创建视频。 GEE 中的时间序列分析。 向图形用户界面添加基本元素。 2背景 深水地平线漏油事件被认为是有史以来最大的海上意外漏油事件。该井释放了超过 490 万桶石油&am…

JAVA自己写什么功能可以提升技术?

JAVA自己写什么功能可以提升技术&#xff1f; 对于技术提升这个话题&#xff0c;勤于练习&#xff0c;多敲多积累这是一个必经的过程。那我们展开来详细的说一说&#xff0c;比如&#xff1a; 实现各种数据结构和算法&#xff0c;比如链表、树、图、排序、搜索等。这可以提高…

MAC设备(M1)环境下编译安装openCV for Java

最近发现一个需求&#xff0c;可以用openCV来实现&#xff0c;碰巧又新买了mac笔记本&#xff0c;就打算利用业余时间安装下openCV。这里将主要步骤记录下&#xff0c;希望能帮助有需要的人。 1、准备编译环境 #查询编译opencv相关依赖 brew info opencv查询结果如下图所示&a…

Blocking waiting for file lock on the registry index 问题解决

问题表现&#xff1a; cargo build时一直卡在Blocking waiting for file lock on the registry index。 解决方法&#xff1a; 1、之前在linux下出现过一次&#xff0c;采用这种方法解决了&#xff1a;rust - Cargo build hangs with " Blocking waiting for file lock…

虚拟展厅如何在艺术领域应用,虚拟展厅对艺术展有什么帮助

引言&#xff1a; 随着科技的不断发展&#xff0c;虚拟展厅作为一种新的展示方式&#xff0c;在艺术领域逐渐受到重视和应用。虚拟展厅利用虚拟现实技术&#xff0c;将艺术品展示于虚拟空间中&#xff0c;为观众带来更加身临其境的艺术体验。 一、虚拟展厅在艺术领域的应用 1…

批量迁移redis实例的key

我们知道migrate 命令可以迁移redis的多个key&#xff0c;但是如果redis的key有非常多&#xff0c;那用起来就很不方便了。 所以下面分享一个脚本来实现批量key的迁移&#xff0c;主要使用的命令为dump和restore 脚本如下&#xff1a; #!/bin/bash redis-cli -h host1 -p 63…

防止砍单、封号:亚马逊、沃尔玛测评方案优化建议

许多卖家和工作室的朋友们向我咨询&#xff0c;为何他们在测评过程中常常遇到砍单和封号的问题。事实上&#xff0c;这个问题并不难理解。测评所涉及到的技术问题非常复杂&#xff0c;仅仅解决IP或环境单一因素是无法实现稳定的测评的。 目前市场上存在许多技术方案&#xff0c…

工业路由器网关的网络协议之NAT技术

在物联网通讯领域&#xff0c;NAT技术能将内网的一个私有IP转换成一个公网IP去接入互联网&#xff0c;解决组建局域网络时私有IP地址无法在公网上进行路由的问题。 NAT&#xff08;Network Address Translation&#xff09;的三种方式&#xff1a; 静态NAT 1、一个私有IP对应…

9 网关的作用

1、总结&#xff1a; 1.如果离开本局域网&#xff0c;就需要经过网关&#xff0c;网关是路由器的一个网口。 2.路由器是一个三层设备&#xff0c;里面有如何寻找下一跳的规则 3.经过路由器之后 MAC 头要变&#xff0c;如果 IP 不变&#xff0c;相当于不换护照的欧洲旅游&#…

【STM32 PWM输出+串口调整PWM周期和占空比】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、PWM是什么&#xff1f;1. PWM 图解二、认识STM32的PWM功能1.哪些定时器有PWM输出功能1.1 高级定时器&#xff0c;7路PWM输出&#xff0c;3组是互补输出&…

第十八章:Swing自述

18.1 Swing概述 18.2&#xff1a;Swing常用窗体 18.2.1&#xff1a;JFrame窗体 package eightth; import java.awt.*; //导入AWT包 import javax.swing.*; //导入Swing包 public class JFreamTest { public static void main(String args[]) { // 主方法 JFra…

一种libuv实现websockets服务的解决方案

方法是libuv用多事件循环来驱动。说起来容易&#xff0c;做起来还是比下面的方法更容易&#xff1a; 上图是某位网友的方法代表子大部分网络资料。此方法对部署不友好&#xff0c;因为软件仓库提供的libwebsockets是不能用了。如何简化部署&#xff0c;利用好现有的软件仓库呢&…