java面试题:MySQL中的各种JOIN的区别
表关联是频率非常高的一种数据库操作,在MySQL中,这种JOIN操作有很多类型,包括内联接、左外连接、右外连接等等,而每种连接的含义都不一样,如果死记硬背,不仅很难记住,而且也容易搞混淆,今天我们尝试使用图解的方式来讲解各种连接的内涵,因为结合了具体的例子,相信会让大家印象深刻。
MySQL中常见的表关联有如下几种:
- INNER JOIN
- LEFT JOIN
- RIGHT JOIN
- FULL OUTER JOIN
- LEFT JOIN EXCLUDING INNER JOIN
- RIGHT JOIN EXCLUDING INNER JOIN
- OUTER JOIN EXCLUDING INNER JOIN
- CROSS JOIN
1 准备环境
先创建两张表,一张是订单表,一张是客户表,订单表中的字段customer_id与客户表的主键关联。数据表创建完成后,再往表里插入简单的测试数据:
先是订单表:
CREATE TABLE `t_order` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',`order_no` int(11) DEFAULT NULL COMMENT '订单号',`customer_id` int(11) DEFAULT NULL COMMENT '客户id',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;-- 插入数据
INSERT INTO `t_order` VALUES ('1', '1001', '1');
INSERT INTO `t_order` VALUES ('2', '1002', '26');
然后是客户表:
CREATE TABLE `t_customer` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',`customer_name` varchar(255) DEFAULT NULL COMMENT '客户姓名 ',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;-- 插入数据
INSERT INTO `t_customer` VALUES ('1', 'John');
INSERT INTO `t_customer` VALUES ('2', 'Tom');
两张表中的数据分别如下:
2 INNER JOIN
INNER JOIN应该是最常用的表连接了,它只返回两个表中满足关联条件的数据:
以内连接的方式关联查询订单表和客户表:
SELECT A.id AS A_id, A.order_no, A.customer_id, B.id AS B_id, B.customer_name
FROM t_order A INNER JOIN t_customer B
ON A.customer_id=B.id
查询结果如下,可以看出,只返回了一行记录,内连接可以理解为查询两个表的交集:
3 LEFT JOIN
LEFT JOIN是左连接,它会返回左表中所有数据,即使右表没有匹配行,如果右表没有相匹配的记录,则返回NULL:
SQL语句和查询结果如下:
SELECT A.id AS A_id, A.order_no, A.customer_id, B.id AS B_id, B.customer_name
FROM t_order A LEFT JOIN t_customer B
ON A.customer_id=B.id
可以看出,左连接返回了左表的数据,对于客户id为26的记录,在客户表中并不存在,所以它们的值为NULL。
4 RIGHT JOIN
而RIGHT JOIN是右连接,跟左连接的逻辑类似,只不过它以右表为基准进行关联,它返回右表中所有数据,即使左表没有匹配行,如果左表没有相匹配的记录,则返回NULL:
SQL语句和查询结果如下:
SELECT A.id AS A_id, A.order_no, A.customer_id, B.id AS B_id, B.customer_name
FROM t_order A RIGHT JOIN t_customer B
ON A.customer_id=B.id
它返回了客户表(右表)中的所有数据,对于客户id为2的记录,订单表中没有对应的数据,所以相应的字段值为NULL。
5 FULL OUTER JOIN
对于上面提到的LEFT JOIN和RIGHT JOIN,它们分别表示左外连接和右外连接,完整的写法还需要加上OUTER关键字,也就是LEFT OUTER JOIN和RIGHT OUTER JOIN。
除了左外连接和右外连接,有时候还需要把两个表中的数据都查询出来,也就是满外连接,相当于是两个表的并集。目前使用的版本5.7还不支持这样的查询,可以使用UNION来进行模拟:
SQL语句和查询结果如下:
SELECT A.id AS A_id, A.order_no, A.customer_id, B.id AS B_id, B.customer_name
FROM t_order A LEFT JOIN t_customer B
ON A.customer_id=B.id
UNION
SELECT A.id AS A_id, A.order_no, A.customer_id, B.id AS B_id, B.customer_name
FROM t_order A RIGHT JOIN t_customer B
ON A.customer_id=B.id
6 LEFT JOIN EXCLUDING INNER JOIN
返回左表有但右表没有的数据:
SQL语句和查询结果如下:
SELECT A.id AS A_id, A.order_no, A.customer_id, B.id AS B_id, B.customer_name
FROM t_order A LEFT JOIN t_customer B
ON A.customer_id=B.id
WHERE B.id IS NULL;
7 RIGHT JOIN EXCLUDING INNER JOIN
返回右表有但左表没有的数据:
SQL语句和查询结果如下:
SELECT A.id AS A_id, A.order_no, A.customer_id, B.id AS B_id, B.customer_name
FROM t_order A RIGHT JOIN t_customer B
ON A.customer_id=B.id
WHERE A.id IS NULL;
8 OUTER JOIN EXCLUDING INNER JOIN
返回左表和右表没有相互关联的数据:
SQL语句和查询结果如下:
SELECT A.id AS A_id, A.order_no, A.customer_id, B.id AS B_id, B.customer_name
FROM t_order A LEFT JOIN t_customer B
ON A.customer_id=B.id
WHERE B.id IS NULL
UNION
SELECT A.id AS A_id, A.order_no, A.customer_id, B.id AS B_id, B.customer_name
FROM t_order A RIGHT JOIN t_customer B
ON A.customer_id=B.id
WHERE A.id IS NULL
9 CROSS JOIN
它返回两个表的笛卡尔积,也就是把两个表中的数据组合起来。
SQL语句和查询结果如下:
SELECT A.id AS A_id, A.order_no, A.customer_id, B.id AS B_id, B.customer_name
FROM t_order A CROSS JOIN t_customer B
相关文章:

java面试题:MySQL中的各种JOIN的区别
表关联是频率非常高的一种数据库操作,在MySQL中,这种JOIN操作有很多类型,包括内联接、左外连接、右外连接等等,而每种连接的含义都不一样,如果死记硬背,不仅很难记住,而且也容易搞混淆ÿ…...

C语言数组与扫雷游戏实现(详解)
扫雷游戏的功能说明 使⽤控制台实现经典的扫雷游戏游戏可以通过菜单实现继续玩或者退出游戏扫雷的棋盘是9*9的格子默认随机布置10个雷可以排查雷 ◦ 如果位置不是雷,就显示周围有几个雷 ◦ 如果位置是雷,就炸死游戏结束 ◦ 把除10个雷之外的所有雷都找出来,排雷成功,游戏结…...

C#调用WechatOCR.exe实现本地OCR文字识别
最近遇到一个需求:有大量的扫描件需要还原为可编辑的文本,很显然需要用到图片OCR识别为文字技术。本来以为这个技术很普遍的,结果用了几个开源库,效果不理想。后来,用了取巧的方法,直接使用了WX的OCR识别模…...
ComfyUI 学习笔记
目录 ComfyUI 入门教程 什么是ComfyUI? windows安装教程: 组件技巧学习 ComfyUI 入门教程 老V带你学comfyUI-基础入门 - 知乎 什么是ComfyUI? ComfyUI 是一个基于节点的 GUI,用于Stable Diffusion。你可以通过将不同的no…...

基于Linux的HTTP代理服务器搭建与配置实战
在数字化世界中,HTTP代理服务器扮演着至关重要的角色,它们能够帮助我们管理网络请求、提高访问速度,甚至在某些情况下还能保护我们的隐私。而Linux系统,凭借其强大的功能和灵活性,成为了搭建HTTP代理服务器的理想选择。…...

创建一个Vue项目(含npm install卡住不动的解决)
目录 1 安装Node.js 2 使用命令提示符窗口创建Vue 2.1 打开命令提示符窗口 2.2 初始Vue项目 2.2.1 npm init vuelatest 2.2.2 npm install 3 运行Vue项目 3.1 命令提示符窗口 3.2 VSCode运行项目 1 安装Node.js 可以看我的这篇文章《Node.js的安装》 2 使用命令提示…...
npm_config_xxx
// package.json{ "scripts": { "log": "node index.js", } }// index.js function logProcessEnv(key){ console.log(process.env[${key}], process.env[key]); } logProcessEnv(npm_config_foo); 问题: npm run log 和 yarn log…...
P8756 [蓝桥杯 2021 省 AB2] 国际象棋 状压dp统计情况数的一些小理解
目录 建议有状压基础再食用:本题的状态转移方程是 dp代码片:参考代码 建议有状压基础再食用: n行m列 等价 n列m行 ,因为n比较小,int是32位足够了,我们用比特位统计每一行的状态。 本题的状态转移方程是 dp[h][i][j]…...

春节放大招,阿里通义千问Qwen1.5开源发布
2月6日阿里发布了通义千问1.5版本,包含6个大小的模型,“Qwen” 指的是基础语言模型,而 “Qwen-Chat” 则指的是通过后训练技术如SFT(有监督微调)和RLHF(强化学习人类反馈)训练的聊天模型。 模型…...

grafana+prometheus+hiveserver2(jmx_exporter+metrics)
一、hiveserver2开启metrics,并启动jmx_exporter 1、修改hive-site.xml文件开启metrics <property><name>hive.server2.metrics.enabled</name><value>true</value> </property> <property><name>hive.service.m…...
Redis系列——Lua脚本和redis事务的应用
介绍 Lua脚本 背景 Redis是一种抽象数据类型的特定领域语言,由各种命令组成。大多数命令专门用于操作不通的数据类型。每次发送命令均需要执行至此网络请求。所以Redis提供了一个编程接口,支持服务器执行用户自定义的任意脚本。有助于减少网络流量&am…...
rtt设备驱动框架面向对象学习-i2c总线
本来想着i2c和spi是一样的,标题都想抄袭成《rtt设备驱动框架学习-i2c总线和设备》,然后看过源码发现,i2c没有分开总线和设备,我想着正常它和spi一样有总线和设备,设备存在竞争。估计是因为i2c设备可以通过i2c地址区分&…...

Golang 基础 Go Modules包管理
Golang 基础 Go Modules包管理 在 Go 项目开发中,依赖包管理是一个非常重要的内容,依赖包处理不好,就会导致编译失败,本文将系统介绍下 Go 的依赖包管理工具。 我会首先介绍下 Go 依赖包管理工具的历史,并详细介绍下…...
图数据库 之 Neo4j - 背景介绍(1)
引言 Neo4j是一种高性能的图数据库,它专门设计用于存储、管理和查询大规模的图数据。与传统的关系型数据库不同,Neo4j以图的形式存储数据,其中节点表示实体,边表示实体之间的关系。这种图数据模型非常适合表示复杂的关系和连接。…...
JAVA中的单例模式->饿汉式
一、步骤 1.构造器私有化>防止直接new // 步骤一、构造器私有化>防止直接new private GirlFriend(String name){System.out.println("构造器被调用");this.name name; } 2.类的内部创建对象 // 步骤二、类的内部创建对象(该对象是static&#x…...

从零开始手写mmo游戏从框架到爆炸(三)— 服务启动接口与网络事件监听器
导航:从零开始手写mmo游戏从框架到爆炸(零)—— 导航-CSDN博客 上一章我们完成了netty服务启动的相关抽象(https://blog.csdn.net/money9sun/article/details/136025471),这一章我们再新增一个全…...

git 合并多条提交记录
我要合并多条提交记录(合并前7条为一条),实现如下效果: 使用git rebase // 查看前10个commit git log -10 // 将7个commit压缩成一个commit;注意:vim编辑器 git rebase -i HEAD~4 // add已经跟踪的文件 g…...

C++多线程:this_thread 命名空间
std::this_thread 是 C 标准库中提供的一个命名空间,它包含了与当前线程相关的功能。这个命名空间提供了许多与线程操作相关的工具,使得在多线程环境中更容易进行编程。 源码类似于如下: namespace std{namespace this_thread{//...........…...

《山雨欲来-知道创宇 2023 年度 APT 威胁分析总结报告》
下载链接: https://pan.baidu.com/s/1eaIOyTk12d9mcuqDGzMYYQ?pwdzdcy 提取码: zdcy...

Qt信号和槽机制(什么是信号和槽,connect函数的形式,按钮的常用信号,QWidget的常用槽,自定义槽函数案例 点击按钮,输出文本)
一.什么是信号和槽 信号槽式Qt中的一个很重要的机制。信号槽实际上是观察者模式,当发生了感兴趣的事件,某一个操作就会被自动触发。当某个事件发生之后,比如按钮检测到自己被点击了一下,它就会发出一个信号。这种发出类似广播。如果有对象对…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...