mysql学习教程,从入门到精通,SQL 联表查询(Join)(21)

1、SQL 联表查询(Join)

在编写SQL联表查询(Join)时,我们首先要明确查询的目的,即我们需要从哪些表中提取数据,以及这些表之间如何关联。以下是一个简单的示例,假设我们有两个表:employees(员工表)和departments(部门表)。我们的目标是查询出每个员工的姓名、部门ID以及他们所属的部门名称。

1.1、表结构

employees 表

  • employee_id INT:员工ID
  • name VARCHAR:员工姓名
  • department_id INT:部门ID
    departments 表
  • department_id INT:部门ID
  • department_name VARCHAR:部门名称

1.2、SQL 联表查询

为了实现我们的目标,我们可以使用 INNER JOIN(内连接),因为它会返回两个表中匹配的记录。如果员工所属的部门在 departments 表中存在,则该员工的信息及其部门名称将被返回。

SELECT  e.name AS employee_name,  e.department_id,  d.department_name  
FROM  employees e  
INNER JOIN departments d ON e.department_id = d.department_id;

1.3、解释

  1. SELECT 语句:我们选择了 employees 表中的 name 列(重命名为 employee_name),department_id 列,以及 departments 表中的 department_name 列。
  2. FROM 语句:指定了查询的起始表为 employees,并且我们为这个表设置了一个别名 e,以便在后续的查询中简化引用。
  3. INNER JOIN 语句:通过 INNER JOIN 语句将 employees 表与 departments 表连接起来。连接条件是 e.department_id = d.department_id,即 employees 表中的 department_id 列的值必须等于 departments 表中的 department_id 列的值。同样,我们也为 departments 表设置了一个别名 d
  4. ON 子句:指定了 JOIN 的条件,即如何连接这两个表。在这个例子中,条件是员工所属的部门ID与部门表中的部门ID相匹配。
    通过这种方式,我们可以得到每个员工及其所属部门的名称,结果集将只包含那些在 departments 表中有对应部门ID的 employees 表中的记录。如果你想要包括那些在 departments 表中没有对应部门ID的 employees 表中的记录(例如,那些尚未分配部门的员工),你可以使用 LEFT JOIN 替代 INNER JOIN。
    当然可以,以下是一些具体的SQL联表查询(Join)案例,这些案例将展示不同类型的JOIN操作(如INNER JOIN、LEFT JOIN、RIGHT JOIN等)在实际应用中的使用。

1.4、案例一:INNER JOIN(内连接)

场景:查询所有已分配部门的员工及其部门名称。
表结构

  • employees 表:包含员工ID、员工姓名和部门ID。
  • departments 表:包含部门ID和部门名称。
    SQL查询
SELECT  e.employee_id,  e.name AS employee_name,  d.department_name  
FROM  employees e  
INNER JOIN departments d ON e.department_id = d.department_id;

结果:返回所有在 departments 表中有对应部门ID的 employees 表中的记录,包括员工ID、员工姓名和部门名称。

1.5、案例二:LEFT JOIN(左连接)

场景:查询所有员工及其部门名称,包括那些尚未分配部门的员工。

SQL查询

SELECT  e.employee_id,  e.name AS employee_name,  d.department_name  
FROM  employees e  
LEFT JOIN departments d ON e.department_id = d.department_id;

结果:返回 employees 表中的所有记录,对于在 departments 表中没有对应部门ID的员工,其部门名称将显示为NULL。

1.6、案例三:RIGHT JOIN(右连接)

注意:在实际应用中,RIGHT JOIN 较少使用,因为可以通过交换表的位置和使用LEFT JOIN来达到相同的效果。但为了完整性,这里还是给出一个例子。
场景:查询所有部门及其对应的员工姓名(如果有的话)。
SQL查询

SELECT  d.department_id,  d.department_name,  e.name AS employee_name  
FROM  departments d  
RIGHT JOIN employees e ON d.department_id = e.department_id;

结果:返回 departments 表中的所有记录,对于在 employees 表中没有对应员工的部门,其员工姓名将显示为NULL。但请注意,这个查询在逻辑上与将 employeesdepartments 表的位置互换并使用LEFT JOIN是等效的。

1.7、案例四:FULL JOIN(全连接)

注意:并非所有数据库系统都支持FULL JOIN,但可以通过UNION操作结合LEFT JOIN和RIGHT JOIN来模拟。
场景:查询所有员工及其部门名称,包括那些尚未分配部门的员工和那些没有员工的部门。
模拟FULL JOIN的SQL查询

SELECT  e.employee_id,  e.name AS employee_name,  d.department_name  
FROM  employees e  
LEFT JOIN departments d ON e.department_id = d.department_id  
UNION  
SELECT  e.employee_id,  e.name AS employee_name,  d.department_name  
FROM  employees e  
RIGHT JOIN departments d ON e.department_id = d.department_id  
WHERE e.employee_id IS NULL; -- 排除LEFT JOIN中已经包含的记录

但请注意,上面的查询实际上并不完全正确,因为它会尝试从RIGHT JOIN中选择NULL的 employee_id,这在大多数情况下并不是我们想要的。一个更准确的模拟FULL JOIN的方法是分别执行LEFT JOIN和RIGHT JOIN,并确保RIGHT JOIN部分只选择那些在LEFT JOIN中未出现的记录(这通常涉及到子查询或临时表)。然而,为了简洁起见,这里不展示完整的模拟过程。
在实际应用中,如果数据库支持FULL JOIN,可以直接使用它,如下所示:

SELECT  e.employee_id,  e.name AS employee_name,  d.department_name  
FROM  employees e  
FULL JOIN departments d ON e.department_id = d.department_id;

这将返回两个表中的所有记录,对于不匹配的记录,相应的字段将显示为NULL。

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

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

相关文章

考研数据结构——C语言实现冒泡排序

冒泡排序是一种简单的排序算法,它重复地遍历要排序的列表,比较每对相邻元素,并在顺序错误的情况下交换它们。这个过程重复进行,直到没有需要交换的元素,这意味着列表已经排序完成。冒泡排序的名字来源于较小的元素会逐…

面试中这样介绍自己的项目经验,轻松拿Offer!

面试时7分靠能力,3分靠技能,而刚开始时的介绍项目又是技能中的重中之重,所以本文将从“介绍”和“引导”两大层面告诉大家如何准备面试时的项目介绍。 在面试时,经过寒暄后,一般面试官会让介绍项目经验 。常见的问法是…

点云与Open3D入门

文章目录 点云数据介绍点云 Open3D点云基础操作RGBD转换为PCDPLY转PCD 点云空间搜索K-DTree原理搜索算法 OCTree 点云滤波体素下采样点云体素化复杂点云体素化统计滤波半径滤波 点云特征提取法线估计 点云分割DBSCAN 聚类分割(运行时间较长)PANSNC平面分…

给pycharm项目设置conda环境新

创建虚拟环境 conda create -n llama python3.11 激活虚拟环境 conda activate llama 设置Pycharm环境

基于Spring Boot的宠物咖啡馆平台【附源码】

基于Spring Boot的宠物咖啡馆平台(源码L文说明文档) 目录 4 系统设计 4.1 系统概述 4.2系统结构 4.3.数据库设计 4.3.1数据库实体 4.3.2数据库设计表 5系统详细实现 5.1 管理员模块的实现 5.1.1 用户信息管理 …

CASS的拉伸命令

1、打开CASS软件,绘制一个矩形框 2、在右侧【修改】工具条中,选择【拉伸】按钮 3、 框选需要拉伸对象,注意是框选不是点选,点选的话无法拉伸图形 这个也是注明了,以交叉窗口或多边形框选对象 4、拉伸结果

基于STM32的电压检测WIFI模拟

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STM32单片机,通过滑动变阻器模拟电压传感器检测电压,通过12864显示显示电压和电压阈值,按键可以控制阈值的增加,并通过串口实时显示相关参数和状…

新零售社交电商系统的卷轴模式开发:重塑消费体验与商业生态

随着互联网的飞速发展,新零售与社交电商的深度融合已成为电商行业的新趋势。在这一背景下,“卷轴模式”作为一种创新性的商业模式,正逐步被引入到新零售社交电商系统的开发中,旨在通过更加灵活、互动性强的购物体验,吸…

[python-pdal]python-pdal安装后测试代码

测试代码: import pdal import tiledbdata "1.2-with-color.las"pipeline pdal.Reader.las(filenamedata).pipeline() print(pipeline.execute()) # 1065 points# Get the data from the first array # [array([(637012.24, 849028.31, 431.66, 143, …

双端搭建个人博客

1. 准备工作 确保你的两个虚拟机都安装了以下软件: 虚拟机1(Web服务器): Apache2, PHP虚拟机2(数据库服务器): MariaDB2. 安装步骤 虚拟机1(Web服务器) 安装Apache2和PHP 更新系统包列表: sudo apt update安装Apache2: sudo apt install apache2 -y安装PHP及其Apac…

视频汇聚/视频存储/安防视频监控EasyCVR平台RTMP推流显示离线是什么原因?

视频汇聚/视频存储/安防视频监控EasyCVR视频汇聚平台兼容性强、支持灵活拓展,平台可提供视频远程监控、录像、存储与回放、视频转码、视频快照、告警、云台控制、语音对讲、平台级联等视频能力。 EasyCVR安防监控视频综合管理平台采用先进的网络传输技术&#xff0…

[Redis][Zset]详细讲解

目录 0.前言1.常见命令1.ZADD2.ZCARD3.ZCOUNT4.ZRANGE5.ZREVRANGE6.ZRANGEBYSCORE7.ZPOPMAX8.BZPOPMAX9.ZPOPMIN10.BZPOPMIN11.ZRANK12.ZREVRANK13.ZSCORE14.ZREM15.ZREMRANGEBYRANK16.ZREMRANGEBYSCORE17.ZINCRBY 2.集合间操作1.有序集合的交集操作2.ZINTERSTORE3.有序集合的并…

网络战时代的端点安全演变

​ 在恶意网络行为者与对手在世界各地展开网络战争的日常战争中,端点安全(中世纪诗人可能会称其为“守卫大门的警惕哨兵”)当然是我们的互联数字世界的大门。 端点安全类似于我们今天称之为现代企业的数字有机体的免疫系统,可以将…

线性回归与最小二乘法

线性回归是统计学中的概念,以其建模速度快,不需要很复杂的计算并且模型解释性强等优点在机器学习中广泛应用。线性回归模型主要用于数据预测,其模型参数常用最小二乘法获得。 一、模型: 最开始人们得到了很多组带有测量误差的数…

JS中的事件和DOM操作

一、事件[重要] 1、 事件介绍 事件: 就是发生在浏览器(页面)上一件事,键盘事件,鼠标事件,表单事件,加载事件等等 2、 事件绑定方式 事件要想发生,就得将事件和标签先绑定(确定哪个标签发生什么事情,又有什么响应) 一个完整的事件有三部分 事件源(标签),哪里发出的事. 什么事(…

SAM核心代码注释总结

最近看sam2,顺便注释了下代码,方便回顾和分享。 PS: tensor的维度都基于默认参数配置。 SAM _build_sam sam模块包含三个部分,ImageEncoderViT、PromptEncoder和MaskDecoder: def _build_sam(encoder_embed_dim,encoder_depth…

HDMI20协议解析_Audio_Clock_Regeneration

HDMI20协议解析_Audio_Clock_Regeneration 1.版本说明 日期作者版本说明20240918风释雪初始版本 2.概述 当通过HDMI传输音频信号时,Audio Clock Regeneration(ACR)是必须要传输的数据包之一; HDMI传输过程中,音频采样…

大模型推理革新:探索思维图(DoT)框架的逻辑与应用

姚期智院士领衔推出了大模型新推理框架,CoT的“王冠”已难以承载。 提出了思维图(Diagram of Thought,DoT),使大模型的思考方式更接近人类。 团队为这一推理过程提供了数学基础,通过拓扑斯理论&#xff0…

分享6个icon在线生成网站,支持AI生成

在这个数字化的时代,创意和视觉标识在产品推广中可谓是愈发重要。提到图标,我们就不能不聊聊“Icon”这个小家伙。它不仅仅是个简单的视觉元素,简直是品牌信息的超级传递者。因此,图标生成器成了设计界的“万金油”,帮…

教授【优青】团队亲自指导-图解表观遗传学 | 组蛋白修饰!专业实验设计、数据分析、SCI论文辅助等全方位服务。精准高效,为农植物科研保驾护航!

教授【优青】团队亲自指导!提供专业实验设计、数据分析、SCI论文辅助等全方位服务。精准高效,为医学科研保驾护航! 专业实验外包服务,一站式解决您的所有需求; 还在犹豫?别让您的科研和论文停滞不前&#…