学SQL JOINS看这一篇文章就够了

目录

下面以实例进行分析

内连接

inner join 或者join(等同于inner join)

外连接

left join 或者left outer join(等同于left join)

[ left join 或者left outer join(等同于left join) ] + [ where B.column is null ]

right join 或者right outer join(等同于right join)

[ right join 或者right outer join(等同于right join) ] + [ where A.column is null ]

full join (mysql不支持,但是可以用 left join union right join代替)

full join + is null(mysql不支持,但是可以用 (left join + is null) union (right join+is null代替)

交叉连接

cross join

cross join + where

注意事项

问题分析

EXPLAIN扫描行数不同

SQL JOINS执行顺序


在数据库中,连接(Join)是用于将两个或多个表中的数据关联起来的操作。连接操作有多种类型,其中包括内连接和外连接。内连接的话只有一种而外连接的话有六种,当然还有一种连接叫做交叉连接。

  • 内连接:join , inner join
  • 外连接:left join , left outer join , right join , right outer join , union
  • 交叉连接:cross join

下面以实例进行分析

#首先创建两张表a和b
mysql> show create table a\G
*************************** 1. row ***************************
       Table: a
Create Table: CREATE TABLE `a` (
  `id` int NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
1 row in set (0.01 sec)

mysql> show create table b\G
*************************** 1. row ***************************
       Table: b
Create Table: CREATE TABLE `b` (
  `id` int NOT NULL,
  `age` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
1 row in set (0.01 sec)

两张表格式如下:

内连接

inner join 或者join(等同于inner join)

语法:

select *  from a join b on a.id=b.id;
or
select *  from a inner join b on a.id=b.id;

结果:

应用场景:

这种场景下得到的是满足某一条件的A,B内部的数据;正因为得到的是内部共有数据,所以连接方式称为内连接。

外连接

left join 或者left outer join(等同于left join)

语法:

select * from a left join b on a.id=b.id;
or
select * from a left outer join b on a.id=b.id;

结果:

结果如下,TableA中B不存在的记录填充Null

应用场景:

这种场景下得到的是A的所有数据,和满足某一条件的B的数据。

[ left join 或者left outer join(等同于left join) ] + [ where B.column is null ]

语法:

select * from a left outer join b on a.id=b.id where b.id is not null;

结果:

left join表a的数据全部显示,匹配表b的数据也显示,而b.id再次过滤掉 表b的id为空的

应用场景:

这种场景下得到的是A中的所有数据减去"与B满足同一条件 的数据",然后得到的A剩余数据。

right join 或者right outer join(等同于right join)

语法:

select * from a right outer join b on a.id=b.id;
or
select * from a right outer join b on a.id=b.id;

结果:

TableB中A不存在的记录填充Null

应用场景:

这种场景下得到的是B的所有数据,和满足某一条件的A的数据。

[ right join 或者right outer join(等同于right join) ] + [ where A.column is null ]

语法:

select * from a right join b on a.id=b.id where a.id is not null;

结果:

应用场景:

这种场景下得到的是B中的所有数据减去 "与A满足同一条件 的数据“,然后得到的B剩余数据。

full join (mysql不支持,但是可以用 left join union right join代替)

语法:

 select * from a left join b on a.id=b.id union select * from a right join b on a.id=b.id;

结果:

union过后,重复的记录会合并(id为2,3,4的三条记录)

应用场景:

这种场景下得到的是满足某一条件的公共记录,和独有的记录。

full join + is null(mysql不支持,但是可以用 (left join + is null) union (right join+is null代替)

语法:

select * from a left join b on a.id=b.id where b.id is null union select * from a right join b on a.id=b.id where a.id is null;

结果:

应用场景:

交叉连接

cross join

语法:

 select * from a cross join b;

结果:

cross join + where

语法:

select * from a cross join b where a.id=b.id;

结果:

这种情况下实际上实现了内连接的效果

注意事项

  • 一般cross join后面加上where条件,但是用cross join+on也是被解释为cross join+where(显示连接);
  • 一般内连接都需要加上on限定条件,如果不加会被解释为交叉连接;
  • 如果连接表格使用的是逗号,会被解释为交叉连接(隐式连接)。

注:隐式连接(Implicit Join)会出现数据冗余和性能问题,主要是因为它使用逗号分隔表名的方式进行连接,而没有明确指定连接条件,这样就会导致以下两个问题:

  1. 数据冗余问题: 隐式连接会产生笛卡尔积,即将左表的每一行与右表的每一行进行组合,然后返回所有可能的组合结果,包括那些并不符合连接条件的组合。这就会导致结果集中出现多余的数据,从而产生数据冗余的问题。
  2. 性能问题: 隐式连接的查询效率很低,因为它会处理大量的无用数据,浪费了系统资源和时间。当表a和表b的记录数都很大时,隐式连接会产生庞大的临时表,消耗大量内存和CPU资源。此外,由于没有明确指定连接条件,数据库引擎会对每一个可能组合进行比较,这会进一步降低查询效率。

问题分析

EXPLAIN扫描行数不同

当我们使用explain执行计划,分析select * from a join b on a.id=b.id;语句时会发现两张表的数据基本相同,通过唯一主键索引关联,数据是一对一的,为什么扫描的行数不同。

语法:

explain select * from a join b on a.id=b.id;

结果:

分析:

sql join执行流程

  1. 从a表取出一行
  2. 从取出的这一行取出字段1,然后到表b中查找a.id=b.id
  3. 取出从表b中获取到的数据,跟从表a中的数据组成一行,作为结果集的一部分

explain执行计划的第一行,实际上就是表a的全表扫描,扫描行数比较大

执行计划的第二行,实际代表的是用表a去表b中查找数据,这里用到了索引,所以扫描行数是一行。

SQL JOINS执行顺序

  1. A left join B 返回 A 表数据,附带 B 表中符合条件的数据
  2. A left join B right join C
  3. A left join B 假设等于结果 AB
  4. AB left join C 返回 AB ,附带 C中符合条件的数据

  1. A left join B 返回 A 表数据,附带 B 表中符合条件的数据
  2. A left join B right join C
  3. A left join B 假设等于结果 AB
  4. AB right join C 返回 C ,附带 AB 中符合条件的数据

通过上述两个sql可以看到sql join的执行顺序

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

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

相关文章

【有ISSN、ISBN号!往届均已完成EI检索】第三届电子信息工程、大数据与计算机技术国际学术会议(EIBDCT 2024)

第三届电子信息工程、大数据与计算机技术国际学术会议(EIBDCT 2024) 2024 3rd International Conference on Electronic Information Engineering, Big Data and Computer Technology 第三届电子信息工程、大数据与计算机技术国际学术会议(…

广告公司选择企业邮箱的策略与技巧

对于广告公司而言,选择一款适合的企业邮箱不仅能提升工作效率,更能维护并强化公司的品牌形象。以下是在选择企业邮箱时需关注的关键因素和注意事项。 1、邮件服务商的安全性。 邮件服务商应具备严密的安全防护措施,包括反垃圾邮件、防病毒、防…

macOS安装JDK8

在这篇博客的基础上进行补充。 https://blog.csdn.net/Sarah_luxy/article/details/128797756 百度搜索jdk8,选择官网进入 下载需要注册账户,提前注册登录 进入到Java SE中 选择下载 选择java归档,在历史版本里找jdk8 下拉找到jdk8 选…

老化房设备材料选型要素

一:选择高温老化试验设备时,需要考虑以下几个因素: 温度范围:根据待测材料或产品的使用环境和需求,选择合适的温度范围。确保试验设备的最高和最低温度能够满足需求。控温精度:控温精度越高,试…

Flink运行时架构核心概念

Flink运行时架构 JobManager:协调,决定何时调度下一个task,对失败任务做恢复。 ResourceManager: 负责Flink集群中的资源提供、回收、分配,它负责管理task slot。standalone模式下,不能自行启动新的taskmanagerDispatc…

Linux DataEase数据可视化分析工具本地部署与远程访问

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具,帮助用户快速分析数据并洞察业务趋势,从而实现业务…

新书推荐——《Copilot和ChatGPT编程体验:挑战24个正则表达式难题》

《Copilot和ChatGPT编程体验:挑战24个正则表达式难题》呈现了两方竞争的格局。一方是专业程序员David Q. Mertz,是网络上最受欢迎的正则表达式教程的作者。另一方则是强大的AI编程工具OpenAI ChatGPT和GitHub Copilot。 比赛规则如下:David编…

Spring Security6 快速实战

Spring Security 介绍 官网:https://spring.io/projects/spring-security Spring Security 定义 Spring Security 是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案的安全框架。Spring Security 主要实现了认证和授权,SpringSe…

多波束EM2040D甲板单元更换CPU主板记录

前段时间多波束EM2040D甲板单元的CPU主板到货了。趁着船刚好靠港避风,我们带着这块主板去替换之前借来EM2040C的CPU主板。 1、CF卡替换问题 老主板有个CF卡,见下图。最好的解决方法就是将老CF卡替换新CPU主板上的新CF卡,因为这样改动最小。…

单目相机测距(3米范围内)二维码实现方案(python代码 仅仅依赖opencv)

总体思路:先通过opencv 识别二维码的的四个像素角位置,然后把二维码的物理位置设置为 cv::Point3f(-HALF_LENGTH, -HALF_LENGTH, 0), //tl cv::Point3f(HALF_LENGTH, -HALF_LENGTH, 0), //tr cv::Point3f(HALF_LENGTH, HALF_LENGTH, 0), //br cv::P…

SAAS版专业级条码标签打印软件解决方案

一。新一代互联网打印模式 saas云标签打印软件支持条码、二维码、表格等模式组合打印,支持批量打印标签、表格模拟数据 、在线预览二维码打印 、在线条码生成打印标签 ● 条码/二维码/标签打印,支持表格批量打印标签; ● 条码/二维码尺寸…

呼叫系统的客服的计费模式有哪些?

大家都已经了解呼叫总的区分为两种呼入和呼出。呼入就是建立客服呼叫中心,呼出就是电销回访外呼中心。那么相应的计费模式也是有不同的。下面看看以下几种收费模式 : 一、按月收费模式 也叫固定客服模式,是根据上月结算的费用,企业…

C++11--右值引用

目录 基本概念 左值和右值 左值引用和右值引用 右值引用使用场景和意义 左值引用使用场景 左值引用的短板 右值引用和移动语义 右值引用引用左值 右值引用的其他使用场景 完美转发 万能引用 完美转发保持值得属性 完美转发使用得场景 基本概念 左值和右值 什么…

二维码智慧门牌管理系统升级:轻松解决重新制牌问题

文章目录 前言一、更便捷的申请方式二、系统优势 前言 随着科技的快速发展,智能化管理已经成为我们日常生活的一部分。最近,为了满足人们对门牌类型更换、门牌丢失等需要重新制牌的需求,二维码智慧门牌管理系统升级了解决方案,为…

网络安全卫士:上海迅软DSE的员工上网管理策略大揭秘!

在日常办公中,企业员工可能会在互联网上有意或无意的将一些包含内部重要信息的内容发布出去,从而造成不必要的违规及泄密风险,因此对终端用户进行规范的上网行为管理,既能有效预防重要数据泄密,同时也能提高员工办公效…

高等职业学校新媒体营销实训室解决方案

背景 随着数字化时代的来临,新媒体营销成为企业推广和品牌建设的关键手段。为了培养高职学生在新媒体领域的实际操作能力,建立一套全面、系统的实训室方案至关重要。 目标 搭建高职新媒体营销实训室,旨在培养学生的实际操作能力&#xff0…

【记忆】变上限积分的可导性

只要写出来默认连续。fx连续或者可去间断点,Fx可导,跳跃间断点,Fx不可导但连续。 图片摘自没咋了23李林解析课程

.Net core 6.0 升8.0

1 Update Visual Studio 2 3 用Nutget 更新不同套件版本 更新后结果如下:

CoSeR: Bridging Image and Language for Cognitive Super-Resolution

主页:CoSeR: Bridging Image and Language for Cognitive Super-Resolution (coser-main.github.io) 图像超分辨率技术旨在将低分辨率图像转换为高分辨率图像,从而提高图像的清晰度和细节真实性。这项技术在手机拍照等领域有着广泛的应用和需求。随着超…

Linux下安装JDK

1. 软件安装 1.1 软件安装方式 在Redhat/CentOS系统中,安装软件的方式主要有四种,这四种安装方式的特点如下: 安装方式特点二进制发布包安装【常用】软件已经针对具体平台编译打包发布,只要解压就能使用,修改配置即…