在 MySQL 中模拟外部联接 (LEFT、RIGHT、INNER JOIN、OUTER JOIN)

news2024/12/22 15:04:50

上周的文章详细介绍了 SELECT 查询中的外部联接。它是一种 JOIN 类型,可以从相关表中返回匹配和不匹配的行。遗憾的是,并非所有数据库(DB)供应商都支持它,包括 MySQL。但这没关系,因为可以通过组合其他三种 JOIN 类型(即 LEFT、INNER 和 RIGHT 连接)来模拟外部联接。在本文中,我们将详细了解 LEFT 和 RIGHT 联接,以及当使用 INNER JOIN 组合它们时,如何变成 OUTER JOIN。

如果您还没有安装 Navicat,可点击 这里 下载14天全功能免费试用版

LEFT 联接

LEFT JOIN 返回左表中的所有行和右表中的匹配行。如果在右表中没有找到匹配的行,则返回 NULL。以下是它的语法:

SELECT
    select_list
FROM
    T1
LEFT JOIN T2 ON
    join_predicate;

下面的 VEN 图说明了使用 LEFT JOIN 子句可以从两个表 T1 和 T2 中获取哪些数据:

RIGHT 联接

RIGHT JOIN 返回右表中的所有行和左表中的匹配行。 如果在左表中没有找到匹配的行,则返回 NULL。以下是它的语法:

SELECT 
    select_list
FROM 
    T1
RIGHT JOIN T2 ON join_predicate;

下面的 VEN 图说明了使用 RIGHT JOIN 子句可以从两个表 T1 和 T2 中获取哪些数据:

组合联接以模拟 OUTER JOIN

整个数据库社区都知道 MySQL 不支持 FULL OUTER JOIN。这个缺陷的一个常见解决办法是使用 UNION ALL 组合来自两个表的 LEFT JOIN、INNER JOIN 和 RIGHT JOIN 的三个结果集,并将 join_column IS NULL条件添加到 LEFT 和 RIGHT 联接。

为了示范如何模拟以上的外部联接,我们将使用与上周「了解 SQL 外部联接」文章中相同的项目管理数据库编写查询,但这次是在 MySQL 中。

在左表中查找不匹配的记录

第一个查询将返回仅在左表中找到的行。以下的查询配合使用 LEFT 联接和 WHERE 子句来实现此效果,该子句指定右表中的公共(联接)列为 NULL:

在第二个表中查找不匹配的记录

第二个查询将返回仅在右表中找到的行。为此,我们将配合使用 RIGHT 联接和 WHERE 子句,该子句指定左表中的公共(联接)列为空:

在两个表中查找匹配的记录

若要查找出现在两个表中的记录,我们可以使用标准(INNER)JOIN,如下所示:

当使用 UNION ALL 组合这三个独立的查询时,会产生与 OUTER JOIN 相同的结果:

总结

在本文中,我们学习了更多有关 LEFT 和 RIGHT 联接的知识,以及当使用 INNER JOIN 组合它们时,如何变成 OUTER JOIN。和上周一样,有一件要注意的事情。当与 ORDER BY 和/或 LIMIT 查询一起使用时,这种方法在查询大型表时可能效率很低,因为它使用文件排序(filesort)。在这种情况下,你可能需要采用另一种方法。

往期回顾

1. 盗版引发设备瘫痪 | 官方严正声明:切勿在非官方渠道购买或下载 Navicat 软件

2. Navicat 荣获 Microsoft 金牌合作伙伴

3. Navicat 16.3 正式支持 OceanBase 企业版

4. 免费试用 Navicat 16

5. Navicat 发展史

6. SQL 语句中 WHERE 1=1 的作用

7. 在 SQL 中计算总行数的百分比

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

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

相关文章

【Java】构造方法及类的初始化

一. 利用构造方法给对象初始化 1. 构造方法的概念 构造方法(也称为构造器)是一个特殊的成员方法,其名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。 构造方法的作用就是给对象中的成…

心知天气api接口怎么用?

心知天气是什么?心知天气提供API吗? 心知天气是国内领先的气象服务商,由中国气象局官方授权的商业气象服务公司,基于气象数值预报和人工智能技术,提供高精度气象数据、天气监控机器人、气象数据可视化产品&#xff0c…

基于PHP+MySQL美食分享网站的设计与实现(含论文)

本系统是一个基于PHP和MySQL的美食分享网站,在本网站中用户可以通过注册登录来查看其他人分享的美食,查看周边好吃的店铺,分享和管理自己的美食,并且可以对他人分享的美食进行评论等一系类操作,通过这些操作可以让大家更加愉快的就美食进行交流 通过上图我们可以看到美食网站的…

Web APIs——DOM

JS 的组成 Web API Web API 是浏览器提供的一套操作浏览器功能和页面元素的 API ( BOM 和 DOM )。 现阶段我们主要针对于浏览器讲解常用的 API , 主要针对浏览器做交互效果。 比如我们想要浏览器弹出一个警示框, 直接使用 alert(‘弹出’) MDN 详细 API : https://d…

如何在Github精准地搜索项目

文章目录1、Github的项目有什么组成?2、如何搜索?in:name 条件in:readme 条件in:description 条件language:条件pushed: 条件stars: 条件awesome 关键字3、查看阅读项目https://blog.csdn.net/qq_45069279/article/details/107809617 https://blog.csdn.…

[附源码]SSM计算机毕业设计高校教师教学助手系统的设计与实现JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

将Nacos注册到springboot使用以及Feign实现服务调用

哈喽~大家好,这篇来看看将Nacos注册到springboot使用以及Feign实现服务调用。 🥇个人主页:个人主页​​​​​ 🥈 系列专栏:【微服务】 🥉推荐专栏: JavaEE框架 目录 …

8 年 Java 开发含泪刷题,架构岗现在好难进,有点崩溃

架构岗现在好难进,有点崩溃了。一位粉丝后台留言道。具体问了下情况,是一位 8 年工作经验的朋友,代码功底扎实,项目经验也积累了不少。 为什么要用分布式锁?分布式锁的释放,需要注意什么?锁的过…

Elastic:总结收集日志的几种方法

到目前为止,我们看到有很多中不同的方法来收集日志。甚至,我们针对同样的一个日志,有好多种方法来进行采集。在今天的这篇文章中,我来简单里回顾一下。 通过 Filebeat 采集 Filebeat 是最为常用的一种采集日志的方法。使用 Fileb…

市面上哪种耳机适合跑步用、五款最适合跑步用的蓝牙耳机分享

对于很多运动爱好者来说,跑步,就像吃饭一样,已经成为生活中非常重要的习惯,跑步时听听音乐,让跑步的过程更加愉悦,但是你的运动耳机选对了嘛?首先我们要知道一款专业的运动耳机,一定…

Zookeeper:Mac通过Docker安装Zookeeper集群

此篇为 “Mac通过Docker安装Zookeeper集群”,笔者原本计划是接下来更新Zookeeper应用系列的相关内容,但相关内容依赖Zookeeper集群,虽然前面也更新了 Linux下Zookeeper在三种模式下的部署,但是大家很可能不会有相关的Linux集群准备…

java项目-第152期ssm远程诊断系统-java毕业设计_计算机毕业设计

java项目-第152期ssm远程诊断系统-java毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《远程诊断系统》 该项目分为3个角色,管理员、用户和医生。 用户可以在前台浏览医生信息,并且可以进行在线预约, 在后台个人中心可以…

解决常见的电脑故障

1.电脑卡顿怎么办 电脑CPU使用率高的原因有很多;例如:软件方面——驱动故障、病毒影响;硬件方面——内存容量太小,风扇散热故障等。 有效的解决方法:关闭Windows通知 在【设置】-【系统】-【通知和操作】中&#xff0c…

并发编程之定时任务定时线程池

ScheduledThreadPoolExecutor 定时线程池类的类结构图 它用来处理延时任务或定时任务。 它接收SchduledFutureTask类型的任务,是线程池调度任务的最小单位,有三种提交任务的方式: schedulescheduledAtFixedRatescheduledWithFixedDelay它采用…

Numpy函数详解

目录 有关矩阵行列交换问题 法一 法二 行进行互换 列进行互换 insert函数 delete函数 append函数 where函数 默认第一个为行索引第二个为列索引。 行列索引都是以作为起始数值作为第一列或者第一行。(根据c数组的知识进行理解) 有关矩阵行列交换问题 法一 使用矩阵…

消灭空指针,Java 8 给我们更好的解决方案

前言 大家好,我是小郭。 在平时的业务开发中,空指针是我们经常遇到的问题, 他可能会导致我们的流程无法正常进行或者一些意外情况的发生。 这就是我们需要避免空指针的原因,那我们有哪些方式去解决这个问题呢? 空…

英语语法基础

英语语法知识点1   第一点:动词的变化   1、代词及be动词   主格 I we you you she/he/it they   宾格 me us you you her/him/it them   代词所有格 my our your your her/his/its their   名词性代词 mine ours yours yours hers/his/its theirs   …

FPGA数字信号、图像

1、基于FPGA的数字图像处理原理及应用 (牟新刚) 本书首先介绍FPGA程序设计和图像与视频处理的关键基础理论,然后通过实例代码详细讲解了如何利用FPGA实现直方图操作中的直方图统计/均衡化/线性拉伸/规定化、线性滤波器操作中的均值滤波器、Sobel算子(滤波、求模、求…

Redis从理论到实战:用Redis解决缓存穿透、缓存击穿问题(提供解决方案)

文章目录一、缓存穿透1、什么是缓存穿透2、解决方案二、缓存雪崩三、缓存击穿1、什么是缓存击穿2、解决方案3、互斥锁解决缓存击穿问题4、逻辑删除解决缓存击穿问题加油加油,不要过度焦虑(*^▽^*) 一、缓存穿透 1、什么是缓存穿透 缓存穿透是指客户端请求的数据在…