当前位置: 首页 > news >正文

【MySQL基础】左右连接实战:掌握数据关联的完整视图

1 左右连接基础概念

左连接(left join)和右连接(right join)是MySQL中两种重要的表连接方式,它们与内连接不同,能够保留不匹配的记录,为我们提供更完整的数据视图。
核心区别
  • left join:保留左表所有记录,右表无匹配则显示null
  • right join:保留右表所有记录,左表无匹配则显示null
  • inner join::只返回匹配成功的记录(不保留任何表的全部记录)

2 创建测试数据

-- 创建部门表
drop table if exists departments;
create table departments (dept_id int primary key,dept_name varchar(50) not null
) default charset=utf8mb4;
commit;-- 创建员工表
drop table if exists employees;
create table employees (emp_id int primary key,emp_name varchar(50) not null,dept_id int,salary decimal(10,2),constraint fk_dept foreign key (dept_id) references departments(dept_id)
) default charset=utf8mb4;
commit;-- 插入测试数据
insert into departments values 
(10, '研发部'),
(20, '市场部'),
(30, '财务部'),
(40, '人事部');
insert into employees values 
(101, '张三', 10, 12000),
(102, '李四', 20, 9000),
(103, '王五', 10, 15000),
(104, '赵六', null, 8000),
(105, '钱七', 50, 10000);  
commit;

3 左连接(left join)实战

3.1 基本左连接查询

-- 查询所有员工及其部门信息(包括没有部门的员工)
select e.emp_name, ifnull(d.dept_name, '无部门') as dept_name, e.salary
from employees e
left join departments d on e.dept_id = d.dept_id;
  • 查询结果
mysql> select e.emp_name, ifnull(d.dept_name, '无部门') as dept_name, e.salary-> from employees e-> left join departments d on e.dept_id = d.dept_id;
+----------+-----------+----------+
| emp_name | dept_name | salary   |
+----------+-----------+----------+
| 张三     | 研发部    | 12000.00 |
| 王五     | 研发部    | 15000.00 |
| 李四     | 市场部    |  9000.00 |
| 赵六     | 无部门    |  8000.00 |
| 钱七     | 无部门    | 10000.00 |
+----------+-----------+----------+
5 rows in set (0.04 sec)mysql> 

3.2 查找没有部门的员工

-- 使用left join的特殊用法
select e.emp_id, e.emp_name
from employees e
left join departments d on e.dept_id = d.dept_id
where d.dept_id is null;
  • 查询结果
mysql> select e.emp_id, e.emp_name-> from employees e-> left join departments d on e.dept_id = d.dept_id-> where d.dept_id is null;
+--------+----------+
| emp_id | emp_name |
+--------+----------+
|    104 | 赵六     |
|    105 | 钱七     |
+--------+----------+
2 rows in set (0.00 sec)mysql> 

4 右连接(right join)实战

4.1 基本右连接查询

-- 查询所有部门及其员工信息(包括没有员工的部门)
select d.dept_name, ifnull(e.emp_name, '无员工') as emp_name
from employees e
right join departments d on e.dept_id = d.dept_id;
  • 查询结果
mysql> select d.dept_name, ifnull(e.emp_name, '无员工') as emp_name-> from employees e-> right join departments d on e.dept_id = d.dept_id;
+-----------+-----------+
| dept_name | emp_name  |
+-----------+-----------+
| 研发部    | 张三      |
| 研发部    | 王五      |
| 市场部    | 李四      |
| 财务部    | 无员工    |
| 人事部    | 无员工    |
+-----------+-----------+
5 rows in set (0.00 sec)mysql> 

4.2 查找没有员工的部门

-- 使用right join的特殊用法
select d.dept_id, d.dept_name
from employees e
right join departments d on e.dept_id = d.dept_id
where e.emp_id is null;
  • 查询结果
mysql> select d.dept_id, d.dept_name-> from employees e-> right join departments d on e.dept_id = d.dept_id-> where e.emp_id is null;
+---------+-----------+
| dept_id | dept_name |
+---------+-----------+
|      30 | 财务部    |
|      40 | 人事部    |
+---------+-----------+
2 rows in set (0.00 sec)mysql> 

5 左右连接对比演示

-- 左连接结果
select '左连接' as join_type, e.emp_name, d.dept_name
from employees e
left join departments d on e.dept_id = d.dept_id;-- 右连接结果
select '右连接' as join_type, e.emp_name, d.dept_name
from employees e
right join departments d on e.dept_id = d.dept_id;-- 内连接结果(对比用)
select '内连接' as join_type, e.emp_name, d.dept_name
from employees e
inner join departments d on e.dept_id = d.dept_id;
  • 查询结果
mysql> -- 左连接结果
mysql> select '左连接' as join_type, e.emp_name, d.dept_name-> from employees e-> left join departments d on e.dept_id = d.dept_id;
+-----------+----------+-----------+
| join_type | emp_name | dept_name |
+-----------+----------+-----------+
| 左连接    | 张三     | 研发部    |
| 左连接    | 王五     | 研发部    |
| 左连接    | 李四     | 市场部    |
| 左连接    | 赵六     | NULL      |
| 左连接    | 钱七     | NULL      |
+-----------+----------+-----------+
5 rows in set (0.00 sec)mysql> 
mysql> -- 右连接结果
mysql> select '右连接' as join_type, e.emp_name, d.dept_name-> from employees e-> right join departments d on e.dept_id = d.dept_id;
+-----------+----------+-----------+
| join_type | emp_name | dept_name |
+-----------+----------+-----------+
| 右连接    | 张三     | 研发部    |
| 右连接    | 王五     | 研发部    |
| 右连接    | 李四     | 市场部    |
| 右连接    | NULL     | 财务部    |
| 右连接    | NULL     | 人事部    |
+-----------+----------+-----------+
5 rows in set (0.00 sec)mysql> 
mysql> -- 内连接结果(对比用)
mysql> select '内连接' as join_type, e.emp_name, d.dept_name-> from employees e-> inner join departments d on e.dept_id = d.dept_id;
+-----------+----------+-----------+
| join_type | emp_name | dept_name |
+-----------+----------+-----------+
| 内连接    | 张三     | 研发部    |
| 内连接    | 王五     | 研发部    |
| 内连接    | 李四     | 市场部    |
+-----------+----------+-----------+
3 rows in set (0.01 sec)mysql> 

7 性能优化建议

7.1 索引优化

-- 为连接字段创建索引
alter table employees add index idx_dept (dept_id);
alter table departments add index idx_dept (dept_id);

7.2 查询改写技巧

-- 某些情况下,left join和right join可以相互转换
select e.emp_name, d.dept_name
from departments d
left join employees e on d.dept_id = e.dept_id;-- 等价于
select e.emp_name, d.dept_name
from employees e
right join departments d on e.dept_id = d.dept_id;

7.3 避免过度使用

  • 当只需要匹配记录时,优先使用inner join
  • 大数据表连接时,注意结果集大小

8 总结

记住关键原则:left join保留左表全部记录,right join保留右表全部记录。根据业务需求选择合适的连接方式,可以大大提高查询的灵活性和数据分析的完整性。

相关文章:

【MySQL基础】左右连接实战:掌握数据关联的完整视图

1 左右连接基础概念 左连接(left join)和右连接(right join)是MySQL中两种重要的表连接方式,它们与内连接不同,能够保留不匹配的记录,为我们提供更完整的数据视图。 核心区别: left join:保留左表所有记录,…...

建筑工程行业如何选OA系统?4大主流产品分析

工程行业项目的复杂性与业务流程的繁琐性对办公效率提出了极高要求。而OA 系统(办公自动化系统)的出现,为工程企业提供了一种全新的、高效的管理模式。 工程行业OA系统选型关键指标 功能深度:项目管理模块完整度、文档版本控制能…...

动态科技感html导航网站源码

源码介绍 动态科技感html导航网站源码,这个设计完美呈现了科幻电影中的未来科技界面效果,适合展示技术类项目或作为个人作品集的入口页面,自适应手机。 修改卡片中的链接指向你实际的HTML文件可以根据需要调整卡片内容、图标和颜色要添加更…...

CLIPGaze: Zero-Shot Goal-Directed ScanpathPrediction Using CLIP

摘要 目标导向的扫描路径预测旨在预测人们在搜索视觉场景中的目标时的视线移动路径。大多数现有的目标导向扫描路径预测方法在面对训练过程中未出现的目标类别时,泛化能力较差。此外,它们通常采用不同的预训练模型分别提取目标提示和图像的特征,导致两者之间存在较大的特征…...

wsl-docker环境下启动ES报错vm.max_map_count [65530] is too low

问题描述 在windows环境下用Docker Desktop(wsl docker)启动 elasticsearch时报错 max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]解决方案 方案一 默认的vm.max_map_count值是65530,而es需要至少262…...

js chrome 插件,下载微博视频

起因, 目的: 最初是想下载微博上的NBA视频,因为在看网页上看视频很不方便,快进一次是10秒,而本地 VLC 播放器,快进一次是5秒。另外我还想做点视频剪辑。 对比 原来手动下载的话,右键检查,复制…...

游戏引擎学习第212天

"我们将同步…"α 之前我们有一些内容是暂时搁置的,因为在调整代码的过程中,我们做了一些变动以使代码更加简洁,这样可以把数据放入调试缓冲区并显示出来,这一切现在看起来已经好多了。尽管现在看起来更好,…...

PXE远程安装服务器

目录 搭建PXE远程安装服务器 1、准备Linux安装源: 2、安装并启用TFTP服务: 3、准备Linux内核、初始化镜像文件 4、准备PXE引导程序 5、安装并启用DHCP服务 6、(1)配置启动菜单文件(有人应答) ‌6、(2&#xff09…...

软件测试之功能测试详解

一、测试项目启动与研读需求文档 (一) 组建测试团队 1、测试团队中的角色 2、测试团队的基本责任 尽早地发现软件程序、系统或产品中所有的问题。 督促和协助开发人员尽快地解决程序中的缺陷。 帮助项目管理人员制定合理的开发和测试计划。 对缺陷进行…...

Python深度学习基础——卷积神经网络(CNN)(PyTorch)

CNN原理 从DNN到CNN 卷积层与汇聚 深度神经网络DNN中,相邻层的所有神经元之间都有连接,这叫全连接;卷积神经网络 CNN 中,新增了卷积层(Convolution)与汇聚(Pooling)。DNN 的全连接…...

pytorch 反向传播

文章目录 概念计算图自动求导的两种模式 自动求导-代码标量的反向传播非标量变量的反向传播将某些计算移动到计算图之外 概念 核心:链式法则 深度学习框架通过自动计算导数(自动微分)来加快求导。 实践中,根据涉及号的模型,系统会构建一个计…...

VSCode解决中文乱码方法

目录 一、底层原因 二、解决方法原理 三、解决方式: 1.预设更改cmd临时编码法 2.安装插件法: 一、底层原因 当在VSCode中遇到中文显示乱码的问题时,这通常是由于文件编码与VSCode的默认或设置编码不匹配,或…...

pandas.DataFrame.dtypes--查看和验证 DataFrame 列的数据类型!

查看每列的数据类型,方便分析是否需要数据类型转换 property DataFrame.dtypes[source] Return the dtypes in the DataFrame. This returns a Series with the data type of each column. The result’s index is the original DataFrame’s columns. Columns with…...

高性能服务开发利器:redis+lua

Redis 与 Lua 脚本的结合,其核心价值在于 ​原子性操作​ 和 ​减少网络开销。 一、Redis 执行 Lua 脚本的优势​ ​原子性​ Lua 脚本在 Redis 中原子执行,避免多命令竞态条件。 ​减少网络开销​ 将多个 Redis 命令合并为一个脚本,减少客…...

开源智能体MetaGPT记忆模块解读

MetaGPT 智能体框架 1. 框架概述 MetaGPT 是一个​​多智能体协作框架​​,通过模拟软件公司组织架构与工作流程,将大语言模型(LLM)转化为具备专业分工的智能体,协同完成复杂任务。其最大特点是能够将​​自然语言需…...

Docker部署MySQL大小写不敏感配置与数据迁移实战20250409

Docker部署MySQL大小写不敏感配置与数据迁移实战 🧭 引言 在企业实际应用中,尤其是使用Java、Hibernate等框架开发的系统,MySQL默认的大小写敏感特性容易引发各种兼容性问题。特别是在Linux系统中部署Docker版MySQL时,默认行为可…...

【RabbitMQ】延迟队列

1.概述 延迟队列其实就是队列里的消息是希望在指定时间到了以后或之前取出和处理,简单来说,延时队列就是用来存放需要在指定时间被处理的元素的队列。 延时队列的使用场景: 1.订单在十分钟之内未支付则自动取消 2.新创建的店铺,…...

深兰科技携多款AI医疗创新成果亮相第七届世界大健康博览会

4月8日,以“AI赋能 健康生活”为主题的2025年(第七届)世界大健康博览会(以下简称健博会)在武汉隆重开幕。应参展企业武汉市三甲医院——武汉中心医院的邀请,深兰科技最新研发的新一代智慧医疗解决方案和产品在其展位上公开亮相。 本届展会吸引了来自18个…...

20周年系列|美创科技再度入围「年度高成长企业」系列榜单

近日,资深产业信息服务平台【第一新声】发布「2024年度科技行业最佳CEO及高成长企业榜」,美创科技凭借在数据安全领域的持续创新和广泛行业实践, 再度入围“年度网络安全高成长企业”、“年度高科技高成长未来独角兽企业TOP30”。 美创科技作…...

saltstack分布式部署

一、saltstack分布式 在minion数量过多时,通过部署salt代理,减轻master负载 1、在master上删除说有minion证书 2、在minion上删除旧master信息 3、安装部署salt-syndic 4、修改minion 5、在master上签署代理的证书 6、在代理上签署minion证书 7、测试...

CCRC 与 EMVCo 双认证:中国智能卡企业的全球化突围

在全球经济一体化的浪潮中,智能卡行业正经历着前所未有的变革与发展。中国智能卡企业凭借技术优势与成本竞争力,在国内市场成绩斐然。然而,要想在国际市场站稳脚跟,获取权威认证成为关键一步。CCRC 与 EMVCo 双认证,宛…...

逆向工程的多层次解析:从实现到领域的全面视角

目录 前言1. 什么是逆向工程?2. 实现级逆向:揭示代码背后的结构2.1 抽象语法树的构建2.2 符号表的恢复2.3 过程设计表示的推导 3. 结构级逆向:重建模块之间的协作关系3.1 调用图与依赖分析3.2 程序与数据结构的映射 4. 功能级逆向&#xff1a…...

【Docker项目实战】使用Docker部署ToDoList任务管理工具

【Docker项目实战】使用Docker部署ToDoList任务管理工具 一、ToDoList介绍1.1 ToDoList简介1.2 ToDoList主要特点二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、下载ToDoList镜像…...

基于SpinrgBoot+Vue的医院管理系统-026

一、项目技术栈 Java开发工具:JDK1.8 后端框架:SpringBoot 前端:Vue开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 二、功能介绍 (1)…...

如何进行数据安全风险评估总结

一、基于场景进行安全风险评估 一、概述 数据安全风险评估总结(一)描述了数据安全风险评估的相关理论,数据安全应该关注业务流程,以基础安全为基础,以数据生命周期及数据应用场景两个维度为入口进行数据安全风险评估。最后以《信息安全技术 信息安全风险评估规范》为参考,…...

用 npm list -g --depth=0 探索全局包的秘密 ✨

用 npm list -g --depth0 探索全局包的秘密 🚀✨ 嗨,各位开发者朋友们!👋 今天我们要聊一个超实用的小命令——npm list -g --depth0!它就像一个“全局包侦探”🕵️‍♂️,能帮你快速查出系统中…...

依靠视频设备轨迹回放平台EasyCVR构建视频监控,为幼教连锁园区安全护航

一、项目背景 幼教行业连锁化发展态势越发明显。在此趋势下,幼儿园管理者对于深入了解园内日常教学与生活情况的需求愈发紧迫,将这些数据作为提升管理水平、优化教育服务的重要依据。同时,安装监控系统不仅有效缓解家长对孩子在校安全与生活…...

新闻发稿软文发布投稿选择媒体时几大注意

企业在选择新闻稿发布媒体时,需要综合考虑以下几个关键因素: 1. 匹配媒体定位 企业应根据自身品牌定位和传播目标,选择与之契合的媒体平台。确保新闻稿的内容和风格与媒体的定位高度一致,从而提高稿件被采纳的可能性。 2. 衡量…...

[Scade One] Swan与Scade 6的区别 - signal 特性的移除

signal 特性移除 在 Scade One 引入的Swan中,移除了Scade 6中存在的signal 特性。比如 Scade 6 中的signal声明 sig sig_o;或者signal使用,比如 o sig_o; 在Swan中已经被移除。 不过Swan仍旧保留了对布尔流的emit操作,比如 emit a if c …...

亚马逊推出“站外代购革命“:跨境购物进入全平台整合时代

一、创新功能解析:平台边界消融的购物新范式 亚马逊最新推出的External Product Fulfillment(EPF)服务,正以技术创新重构全球电商格局。这项被称作"代购终结者"的功能具备三大核心突破: 全链路智能化 • 智能…...

Java 常用安全框架的 授权模型 对比分析,涵盖 RBAC、ABAC、ACL、基于权限/角色 等模型,结合框架实现方式、适用场景和优缺点进行详细说明

以下是 Java 常用安全框架的 授权模型 对比分析,涵盖 RBAC、ABAC、ACL、基于权限/角色 等模型,结合框架实现方式、适用场景和优缺点进行详细说明: 1. 授权模型类型与定义 模型名称定义特点RBAC(基于角色的访问控制)通…...

达梦数据库迁移问题总结

问题一、DTS工具运行乱码 开启图形化 [rootlocalhost ~]# xhost #如果命令不存在执行sudo yum install xorg-x11-server-utils xhost: unable to open display "" [rootlocalhost ~]# su - dmdba 上一次登录: 三 4月 9 19:50:44 CST 2025 pts/0 上…...

JS | 函数柯里化

函数柯里化(Currying):将一个接收多个参数函数,转换为一系列只接受一个参数的函数的过程。即 逐个接收参数。 例子: 普通函数: function add(a, b, c) {return a b c; } add(1, 2, 3); // 输出 6柯里化…...

Elasticsearch中的基本全文搜索和过滤

Elasticsearch中的基本全文搜索和过滤 知识点参考: https://www.elastic.co/guide/en/elasticsearch/reference/current/full-text-filter-tutorial.html#full-text-filter-tutorial-range-query 1. 索引设计与映射 多字段类型(Multi-Fields) &#xff…...

蓝桥杯嵌入式第十五届

一、底层 根据它的硬件配置可以看出来这套题目使用到了按键、LED、LCD、输入捕获这几个功能 (1)输入捕获功能 首先在CubeMx里面的配置 题目中说到了我们使用的是PA15和PB4(实际在板子上对应的的是R39和R40),所以我们…...

基于ueditor编辑器的功能开发之给编辑器图片增加水印功能

用户需求,双击编辑器中的图片的时候,出现弹框,用户可以选择水印缩放倍数、距离以及水印所放置的方位(当然有很多水印插件,位置大小透明度用户都能够自定义,但是用户需求如此,就自己写了&#xf…...

DDR中的DLL

在DDR4内存系统中,DLL(Delay Locked Loop,延迟锁相环)是一个非常重要的组件,用于确保数据信号(DQS)和时钟信号(CK)之间的同步。以下是DLL的作用以及DLL on和DLL off的影响…...

Python学习之jieba

Python学习之jieba jieba是优秀的中文分词第三方库,由于中文文本之间每个汉字都是连续书写的,我们需要通过特定的手段来获得其中的每个词组,这种手段叫做分词,我们可以通过jieba库来完成这个过程。jieba库的分词原理:利用一个中文词库,确定汉字之间的关联频率,汉字向概率大的组…...

快速幂fast_pow

快速幂算法讲解 快速幂算法是一种高效计算幂运算的算法,其核心思想是利用指数的二进制分解,把幂运算的时间复杂度从 O(p) 降低到 O(logp)。 原理 假设要计算 an,将 n 表示成二进制形式:n2k1​2k2​⋯2km​,那么 ana…...

Go并发背后的双引擎:CSP通信模型与GMP调度|Go语言进阶(4)

为什么需要理解CSP与GMP? 当我们启动一个Go程序时,可能会创建成千上万个goroutine,它们是如何被调度到有限的CPU核心上的?为什么Go能够如此轻松地处理高并发场景?为什么有时候我们的并发程序会出现奇怪的性能瓶颈&…...

42、JavaEE高级主题:WebSocket详解

WebSocket 一、WebSocket协议与实现 WebSocket是一种基于TCP协议的全双工通信协议,能够在客户端和服务器之间建立实时、双向的通信通道。通过WebSocket,客户端和服务器可以在任何时候发送数据,并立即接收到对方的响应。 1.1 WebSocket协议…...

UGUI源代码之Text—实现自定义的字间距属性

以下内容是根据Unity 2020.1.01f版本进行编写的 UGUI源代码之Text—实现自定义的字间距属性 1、目的2、参考3、代码阅读4、准备修改UGUI源代码5、实现自定义Text组件,增加字间距属性6、最终效果 1、目的 很多时候,美术在设计的时候是想要使用文本的字间…...

【AI】MCP概念

一文讲透 MCP(附 Apifox MCP Server 内测邀请) 7分钟讲清楚MCP是什么?统一Function calling规范,工作量锐减至1/6,人人手搓Manus!? | 一键链接千台服务器,几行代码接入海量外部工具…...

HarmonyOS:使用geoLocationManager (位置服务)获取位置信息

一、简介 位置服务提供GNSS定位、网络定位(蜂窝基站、WLAN、蓝牙定位技术)、地理编码、逆地理编码、国家码和地理围栏等基本功能。 使用位置服务时请打开设备“位置”开关。如果“位置”开关关闭并且代码未设置捕获异常,可能导致应用异常。 …...

深入解析原生鸿蒙中的 RN 日志系统:从入门到精通!

全文目录: 开篇语📖 目录🎯 前言:鸿蒙日志系统究竟有多重要?🛠️ 鸿蒙 RN 日志系统的基础结构📜 1. 日志的作用⚙️ 2. 日志分类 🔧 如何在鸿蒙 RN 中使用日志系统🖋️ 1…...

【前端】【Nuxt3】Nuxt3中usefetch,useAsyncData,$fetch使用与区别

一、Nuxt3 中不同数据获取方式的请求行为对比 (一)总结:请求行为一览 useFetch 和 useAsyncData 是 Nuxt 推荐的数据获取 API,自动集成 SSR 与客户端导航流程。$fetch 是更底层的请求方法,不具备自动触发、缓存等集成…...

【Linux系统】Linux基础指令

l i n u x linux linux 命令是对 L i n u x Linux Linux 系统进行管理的命令。对于 L i n u x Linux Linux 系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件, L i n u x Linux Linux 系统管理的命令是它正常运…...

Android中Jetpack设计理念、核心组件 和 实际价值

一、Jetpack 的定义与定位(基础必答) Jetpack 是 Google 推出的 Android 开发组件集合,旨在: 加速开发:提供标准化、开箱即用的组件 消除样板代码:解决传统开发中的重复劳动问题 兼容性保障:…...

flutter开发音乐APP(前提准备)

1、项目的一些环境: 2、接口文档: 酷狗音乐 NodeJS 版 API 3、接口数据结构化 Instantly parse JSON in any language | quicktype UI样式借鉴参考: Coffee-Expert/Apple-Music-New-UI: Apple Music Clone on Flutter, with redesigned UI…...

网络协议学习

最近在适配ESP32的网络驱动,借此机会先学习一下网络通信协议。 以太网帧、IP包及TCP与UDP的报文格式 提问腾讯元宝提示词: TCP窗口是干什么的拥塞窗口是什么的...