3. join操作时,过滤条件写在on和where的异同?

目录结构:

      • 先说结论
        • left join
        • right join
        • inner join
      • 参考:

先说结论

left join 和 right join 场景中,过滤条件写在on和where有区别
inner join 场景中,过滤条件写在on和where无区别

left join

原理:
       数据库在通过连接两张或多张表返回数据时,均会先生成一张中间的临时表,然后再将临时表返回给用户。
       在使用left join时,on 和 where 条件的区别如下:

  1. on条件是在生成临时表时使用的条件。注意:不管on中的条件是否为真,均会返回左边表中的所有记录。(left join的特性)
  2. where条件是在临时表生成之后,对临时表进行过滤的操作。即在临时表的基础上,条件不为真的全部过滤掉。

示例:

-- 示例数据
with tab1 as (
    select 1 as id, 10 as size union all
    select 2 as id, 20 as size union all
    select 3 as id, 30 as size
), tab2 as (
    select 10 as size, 'AAA' as name union all
    select 20 as size, 'BBB' as name union all
    select 20 as size, 'CCC' as name
)

-- 将tab2的过滤条件写在where中
select
    *
from tab1 left join tab2
on tab1.size=tab2.size
where tab2.name='BBB';
-- 	id	tab1.size	tab2.size	name
--  2	20	        20	        BBB
-- 执行流程: 先关联,再过滤。


-- 将tab2的过滤条件写在on中
select
    *
from tab1 left join tab2
on tab1.size=tab2.size
and tab2.name='BBB'; -- 过滤条件为次表
-- 	id	tab1.size	tab2.size	name
--  1   10          null        null
--  2   20          20         'BBB'
--  3   30          null        null
-- 理解: 先将tab2.name='BBB'的记录筛选出来;再去和tab1做关联。
right join

示例:

-- 示例数据
with tab1 as (
    select 1 as id, 10 as size union all
    select 2 as id, 20 as size union all
    select 2 as id, 30 as size
), tab2 as (
    select 10 as size, 'AAA' as name union all
    select 20 as size, 'BBB' as name union all
    select 20 as size, 'BBB' as name union all
    select 20 as size, 'CCC' as name
)

select
    *
from tab1 right join tab2
on tab1.size=tab2.size
where tab2.name='BBB';
--     id    tab1.size    tab2.size    name
--     2     20           20           'BBB'
--     2     20           20           'BBB'


select
    *
from tab1 right join tab2
on tab1.size=tab2.size
and tab2.name='BBB'; -- 特殊情况(过滤条件为主表)
--      id    tab1.size    tab2.size    name
--	    null  null	       10	        AAA
--      2	  20	       20	        BBB
--      2	  20	       20	        BBB
--      null  null	       20	        CCC
-- 解释: 特别注意结果数据的条数,因为tab2作为主表,所以tab2的所有数据均需返回。
inner join

示例:

-- 示例数据
with tab1 as (
    select 1 as id, 10 as size union all
    select 2 as id, 20 as size union all
    select 2 as id, 30 as size
), tab2 as (
    select 10 as size, 'AAA' as name union all
    select 20 as size, 'BBB' as name union all
    select 20 as size, 'BBB' as name union all
    select 20 as size, 'CCC' as name
)
select
    *
from tab1 inner join tab2
on tab1.size=tab2.size
where tab2.name='BBB';
--     id    tab1.size    tab2.size    name
--     2     20           20           'BBB'
--     2     20           20           'BBB'


select
    *
from tab1 right join tab2
on tab1.size=tab2.size
and tab2.name='BBB';
--     id    tab1.size    tab2.size    name
--     2     20           20           'BBB'
--     2     20           20           'BBB'

参考:

SQL语句中 left join 后用 on 还是 where,区别大了!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

matlab批量读取csv文件

matlab如何批量读取csv文件 在Matlab中,有多种方法可以批量读取CSV文件。下面是几种常用的实现方法: 方法一:使用dir函数获取文件列表 folder 文件夹路径; files dir(fullfile(folder, *.csv)); numFiles length(files);for i 1:numFi…

每日两题 / 78. 子集 17. 电话号码的字母组合(LeetCode热题100)

78. 子集 - 力扣&#xff08;LeetCode&#xff09; 通过二进制数的方式&#xff0c;若第k位为1&#xff0c;表示最终的集合中存在nums[k] 只要遍历所有可能的二进制数即可 class Solution { public:vector<vector<int>> subsets(vector<int>& nums) {…

BGP EVPN-Type2、3、5路由

文章目录 概述1、Type2 路由——MAC/IP 路由2、Type3 路由——Inclusive Multicast 路由3、Type5 路由——IP 前缀路由 概述 EVPN&#xff08;Ethernet Virtual Private Network&#xff09;是一种用于二层网络互联的 VPN 技术。 EVPN 技术采用类似于 BGP/MPLS IP VPN 的机制&…

【LeetCode:2095. 删除链表的中间节点 + 链表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

安装crossover游戏提示容量不足怎么办 如何把游戏放到外置硬盘里 Mac电脑清理磁盘空间不足

CrossOver作为一款允许用户在非原生操作系统上运行游戏和应用程序的软件&#xff0c;为不同平台的用户提供了极大的便利。然而&#xff0c;随着游戏文件大小的不断增加&#xff0c;内置硬盘的容量往往无法满足安装需求。幸运的是&#xff0c;通过一些简单的步骤&#xff0c;我们…

表---商场 nine

CREATE TABLE gao25 (id int(11) NOT NULL AUTO_INCREMENT COMMENT 自增ID,shopId int(11) NOT NULL COMMENT 店铺ID,goodsId int(11) NOT NULL COMMENT 商品ID,attrId int(11) NOT NULL COMMENT 属性名称,attrVal text NOT NULL COMMENT 属性值,createTime datetime NOT NULL …

HTTP、模块化

HTTP协议 包括请求行、请求头、请求体 http常见请求方法&#xff1a; url统一资源请求符&#xff0c;其本身也是一个字符串 响应体的内容格式是非常灵活的,常见的响应体格式有: 1.HTML 2.CSS 3. JavaScript 4.图片 5.视频 6.JSON 响应状态码&#xff1a; IP本身是一个数字…

【每日算法】理论:深度学习基础 刷题:KMP算法思想

上期文章 【每日算法】理论&#xff1a;常见网络架构 刷题&#xff1a;力扣字符串回顾 文章目录 上期文章一、上期问题二、本期理论问题1、注意力机制2、BatchNorm 和 LayerNorm 的区别3、Bert 的参数量是怎么决定的。4、为什么现在的大语言模型都采用Decoder only架构&#x…

11 c++版本的贪吃蛇

前言 呵呵 这大概是 大学里面的 c 贪吃蛇了吧 有一些 面向对象的理解, 但是不多 最近 因为想要 在单片机上面移植一下 贪吃蛇, 所以 重新拿出了一下 这份代码 然后 将它更新为 c 版本, 还是 用了一些时间 这里 具体的实现 就不赘述, 仅仅是 发一下代码 以及 具体的使用…

NXP恩智浦 S32G电源管理芯片 VR5510 安全概念 Safety Concept (万字长文详解,配21张彩图)

NXP恩智浦 S32G电源管理芯片 VR5510 安全概念 Safety Concept (万字长文详解&#xff0c;配21张彩图) 1. 简介 本应用笔记描述了与S32G处理器和VR5510 PMIC相关的安全概念。该文档涵盖了S32G和VR5510的安全功能以及它们如何相互作用&#xff0c;以确保对ASIL D安全完整性级别…

Leetcode-轮转数字

189. 轮转数组 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/rotate-array/ 目录 189. 轮转数组 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/rotate-array/ 题目 解题 第一种方法 第二种方法 题目 给定一个整数数组 …

【深度学习(1)】研0和研1如何上手深度学习及定方向

深度学习&#xff08;1&#xff09; 基础部分书籍鱼书 (理论部分) 视频课程我是土堆&#xff08;代码部分&#xff09; 提升部分李沐的动手学深度学习李沐老师的书 定方向网站&#xff1a; paperwithcode谷歌学术找论文 基础部分 书籍 鱼书 (理论部分) 适合入门&#xff0c;…

Java项目:基于SSM框架实现的汽车推荐系统分前后台(源码+数据库)

一、项目简介 本项目是一套基于SSM框架实现的汽车推荐系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能齐全…

Servlet和Tomcat运作过程

记录一下前后端请求交互过程&#xff08;不涉及Spring框架&#xff09;&#xff1a; 编写一个UserServlet 在web.xml文件中编写映射路径 编写前端

linux系统-FTP服务配置

目录 一、FTP简介 1.什么是FTP&#xff1f;&#xff1f;&#xff1f; 2.FTP的两种模式 二、安装配置FTP服务 1.关闭防火墙和核心防护 2.安装VSFTPD 3.修改配置文件 4.黑白名单设置 一、FTP简介 1.什么是FTP&#xff1f;&…

jvm中的引用类型

Java中的引用类型 1.强引用 一个对象A被局部变量、静态变量引用了就产生了强引用。因为局部变量、静态变量都是被GC Root对象关联上的&#xff0c;所以被引用的对象A&#xff0c;就在GC Root的引用链上了。只要这一层关系存在&#xff0c;对象A就不会被垃圾回收器回收。所以只要…

Linux---自定义协议

应用层协议 一、协议定制---以网络计算器为例 网络计算机功能---进行-*/^&|的运算并返回结果 请求和响应的结构体如下 // Protocol.hpp #pragma once #include <iostream> #include <memory> class Request { public:Request(){}Request(int data_x, int da…

无人机探测技术,无人机侦测频谱仪技术实现详解

频谱仪&#xff0c;又称为频谱分析仪&#xff0c;是一种用于测量电信号频谱特性的仪器。其基本原理是通过将时域信号转换为频域信号&#xff0c;进而分析信号的频率成分、功率分布、谐波失真等参数。频谱仪利用快速傅里叶变换&#xff08;FFT&#xff09;算法&#xff0c;将采集…

13 c++版本的五子棋

前言 呵呵 这大概是 大学里面的 c 五子棋了吧 有一些 面向对象的理解, 但是不多 这里 具体的实现 就不赘述, 仅仅是 发一下代码 以及 具体的使用 然后 貌似 放在 win10 上面执行 还有一些问题, 渲染的, 应该很好调整 五子棋 #include<Windows.h> #include<io…

安规电容定义和应用

安规电容 定义 失效后&#xff0c;不会导致电击&#xff0c;不危及人身安全的电容器&#xff0c;称之为安规电容 分类 分为X电容和Y电容 X电容–跨接在电力线&#xff08;L-N&#xff09;之间的电容&#xff0c;一般选用金属薄膜电容&#xff0c;X电容有多种颜色&#xff…