SQL中的left join和right join及具体实例

LEFT JOIN(或称为左连接)是SQL中的一种连接类型,它用于从两个或多个表中基于共同的列将数据组合起来。在使用LEFT JOIN时,查询的结果集包含左表(LEFT JOIN语句中指定的第一个表)的所有记录,以及右表中匹配的记录。如果左表中的某条记录在右表中没有匹配的记录,那么右表中对应的列将返回空值(NULL)。

工作原理

假设有两个表:表A和表B。当执行A LEFT JOIN B时,结果将包括表A的所有记录。对于表A中的每条记录,如果在表B中存在一条或多条匹配记录(基于连接条件),这些记录将被包括在结果集中。如果表A中的某条记录在表B中没有匹配记录,那么表B中的列在结果集中将显示为NULL

使用场景

LEFT JOIN特别适用于需要查询一个表中的记录,并且同时从另一个表中获取相关信息(如果存在的话)的情况。例如,从员工表中获取所有员工的信息,并从部门表中获取他们所属部门的名称,即使某些员工没有分配部门。

语法

SELECT columns
FROM table1
LEFT JOIN table2 ON table1.common_column = table2.common_column;
  • table1:左表,其所有记录都将出现在结果集中。
  • table2:右表,只有匹配的记录会出现在结果集中。
  • common_column:连接条件,通常是两个表中都存在的列,用于匹配记录。

示例

假设有两个表:Employees(员工表)和Departments(部门表),其中Employees表包含员工信息,Departments表包含部门信息。

-- Employees
+------------+-----------+-------------+
| EmployeeID | Name      | DepartmentID|
+------------+-----------+-------------+
| 1          | John Doe  | 1           |
| 2          | Jane Smith| 2           |
| 3          | Alice Jones| NULL       |
+------------+-----------+-------------+-- Departments
+-------------+---------------+
| DepartmentID| Name          |
+-------------+---------------+
| 1           | IT            |
| 2           | HR            |
+-------------+---------------+

要获取所有员工的姓名和他们所属部门的名称,可以使用LEFT JOIN

SELECT Employees.Name, Departments.Name AS DepartmentName
FROM Employees
LEFT JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;

结果集将包括所有员工的姓名,即使某些员工(如Alice Jones)没有分配部门:

+------------+---------------+
| Name       | DepartmentName|
+------------+---------------+
| John Doe   | IT            |
| Jane Smith | HR            |
| Alice Jones| NULL          |
+------------+---------------+

这个例子展示了LEFT JOIN如何确保左表(Employees)的所有记录都出现在结果集中,同时从右表(Departments)中获取匹配的记录。

------------------------------------------

SQL中也存在RIGHT JOIN(或称为右连接)。RIGHT JOIN的工作原理与LEFT JOIN相反,它返回从右表(RIGHT JOIN语句中指定的第二个表)的所有记录,以及左表中匹配的记录。如果右表中的某条记录在左表中没有匹配的记录,那么左表中对应的列将返回空值(NULL)。

工作原理

当执行A RIGHT JOIN B时,结果集将包括表B的所有记录。对于表B中的每条记录,如果在表A中存在一条或多条匹配记录(基于连接条件),这些记录将被包括在结果集中。如果表B中的某条记录在表A中没有匹配记录,那么表A中的列在结果集中将显示为NULL

使用场景

RIGHT JOIN适用于需要查询一个表中的记录,并且同时从另一个表中获取相关信息(如果存在的话)的场合,特别是当你更关注右表中的记录时。不过,在实践中,LEFT JOIN的使用更为频繁,因为你可以通过调整表的顺序来达到同样的目的。如果需要使用RIGHT JOIN的场景,通常可以通过将表的顺序颠倒,然后使用LEFT JOIN来实现相同的结果。

语法

SELECT columns
FROM table1
RIGHT JOIN table2 ON table1.common_column = table2.common_column;
  • table1:左表,只有匹配的记录会出现在结果集中。
  • table2:右表,其所有记录都将出现在结果集中。
  • common_column:连接条件,通常是两个表中都存在的列,用于匹配记录。

示例

假设我们仍然使用上述的EmployeesDepartments表,但这次我们想要列出所有部门,以及分配给每个部门的员工姓名(如果有的话)。

使用RIGHT JOIN

SELECT Departments.Name AS DepartmentName, Employees.Name
FROM Employees
RIGHT JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;

结果集将包括所有部门的名称,即使某些部门没有分配员工:

+---------------+------------+
| DepartmentName| Name       |
+---------------+------------+
| IT            | John Doe   |
| HR            | Jane Smith |
+---------------+------------+

如果有更多部门而没有员工分配到这些部门,那么这些部门也会出现在结果集中,相应的员工Name字段为NULL

在实际应用中,LEFT JOINRIGHT JOIN可以根据需要互换使用,主要看哪个表是你查询的焦点以及你希望结果集包含哪个表的全部记录。

-----------------------------

LEFT JOINRIGHT JOIN是SQL中用于执行表连接操作的两种类型,它们都用于将两个或多个表的行组合起来。尽管它们在功能上相似,主要的区别在于它们各自如何处理主表和次表中的非匹配行。

LEFT JOIN

  • 定义LEFT JOIN(左连接)返回左表(LEFT JOIN语句中的第一个表)的所有行,即使在右表(第二个表)中没有匹配的行。
  • 使用场景:当你需要从左表获取所有记录,并从右表中获取那些匹配的记录时,即使某些左表中的记录在右表中没有匹配项。
  • 结果:如果左表中的行在右表中没有找到匹配,那么右表的列将以NULL值出现在结果集中。

RIGHT JOIN

  • 定义RIGHT JOIN(右连接)返回右表(RIGHT JOIN语句中的第二个表)的所有行,即使在左表(第一个表)中没有匹配的行。
  • 使用场景:当你需要从右表获取所有记录,并从左表中获取那些匹配的记录时,即使某些右表中的记录在左表中没有匹配项。
  • 结果:如果右表中的行在左表中没有找到匹配,那么左表的列将以NULL值出现在结果集中。

对比总结

  • 主要区别:主要区别在于它们各自关注的表不同。LEFT JOIN关注左表的完整性,而RIGHT JOIN关注右表的完整性。
  • 互换性:在大多数情况下,LEFT JOINRIGHT JOIN可以互换使用,只需交换它们的表位置即可。例如,A LEFT JOIN B的结果可以通过B RIGHT JOIN A获得,反之亦然。
  • 使用频率:在实践中,LEFT JOIN的使用比RIGHT JOIN更为常见,部分原因是人们习惯于从左到右的阅读顺序,使得LEFT JOIN在逻辑上更直观。当需要使用RIGHT JOIN的场景时,很多开发者倾向于调整查询,使用LEFT JOIN来达到相同的结果。

选择LEFT JOIN还是RIGHT JOIN取决于你的具体需求。

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

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

相关文章

音视频数字化(音频数字化)

在音视频领域,人们始终追求无限还原现场效果,因此音频越逼真越好,视频越清晰越好。之所以我们需要将音视频信号由模拟转为数字,目的是在录制、存储、编辑、复制、回放等环节的不失真,尽量保持原有细节,不因以上操作,导致音画的质量下降。 为此,视频系统分辨率越来越高,…

【Java程序设计】【C00207】基于(JavaWeb+SSM)的宠物领养管理系统(论文+PPT)

基于(JavaWebSSM)的宠物领养管理系统(论文PPT) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的宠物领养系统 本系统分为前台系统、管理员、收养者和寄养者4个功能模块。 前台系统:游客打开系统…

k8s-HPA

前提条件 安装有**Metrics Server**,HPA的运行监控指标需要由Metrics Server 提供 文档:https://github.com/kubernetes-sigs/metrics-server?tabreadme-ov-file#readme 快速自动缩放,每15秒收集一次指标(可配置)。 资源效率,为集群中的每…

网络防御安全:2-6天笔记

第二章:防火墙 一、什么是防火墙 防火墙的主要职责在于:控制和防护。 防火墙可以根据安全策略来抓取流量之后做出对应的动作。 二、防火墙的发展 区域: Trust 区域,该区域内网络的受信任程度高,通常用来定义内部…

计算机中的缓存与内存

在现代计算机系统中,缓存和内存扮演着至关重要的角色,它们共同协作以实现高性能和高效率的数据处理。本文将深入探讨缓存和内存的概念、功能以及它们在计算机系统中的作用。 缓存与内存:概念与功能 1. 内存(RAM)&…

代码随想录算法训练营第三十二天| 738.单调递增的数字 ,968.监控二叉树

738.单调递增的数字 代码随想录 从后往前遍历 class Solution {public int monotoneIncreasingDigits(int n) {String s String.valueOf(n);char[] chars s.toCharArray();int start s.length();for (int i s.length() - 2; i > 0; i--) {if (chars[i] > chars[i 1…

数据库管理-第142期 DBA?DBA!(20240131)

数据库管理142期 2024-01-31 数据库管理-第142期 DBA?DBA!(20240131)正文总结 数据库管理-第142期 DBA?DBA!(20240131) 作者:胖头鱼的鱼缸(尹海文&#xff09…

VSCode 设置代理

Open Visual Studio Code, click the settings icon in the lower left corner, and click Settings.

yii2 mongodb 操作

->where([<>,review,""]) 不等于空 $where [newstypeid>[$in>$categoryIdArr]]; 类似mysql in操作 &#xff08;$categoryIdArr是数组&#xff09; ->where([label>[$regex >赞美诗]]) 模糊搜索操作 $where [status>1,name>[$rege…

C++语法 内存区域 和 引用

代码区 存放函数体的二进制代码 由操作系统进行管理 全局区 存放全局变量和静态变量以及常量 存放全局变量 静态变量 常量&#xff08;字符串常量 全局const常量&#xff09; 栈区 由编译器自动分配释放&#xff0c;存放函数的参数值&#xff0c;局部变量等。不要返回局部…

【论文笔记】Multi-Chain Reasoning:对多思维链进行元推理

目录 写在前面1. 摘要2. 相关知识3. MCR方法3.1 生成推理链3.2 基于推理链的推理 4. 实验4.1 实验设置4.2 实验结果 5. 提及文献 写在前面 文章标题&#xff1a;Answering Questions by Meta-Reasoning over Multiple Chains of Thought论文链接&#xff1a;【1】代码链接&…

【yarn】 kill 一个spark任务

要关闭一个正在运行的Spark任务&#xff0c;你可以使用以下命令来终止执行&#xff1a; yarn application -kill <application_id>将 <application_id> 替换为你要关闭的Spark应用程序的ID。这个ID通常以 application_ 开头&#xff0c;后面跟着一串数字。 请确保…

【数据分享】1929-2023年全球站点的逐日最高气温数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01; 之前我们分享过1929-2023年全球气象站…

LRU(Least Recently Used)

在 Vue.js 中&#xff0c;<keep-alive> 组件使用了 LRU&#xff08;Least Recently Used&#xff09;算法来缓存组件。LRU 算法是一种缓存淘汰策略&#xff0c;它根据最近使用的时间来确定哪些数据被保留在缓存中。 <keep-alive> 组件是 Vue.js 提供的一个抽象组件…

Git 怎么设置用户的权限

在团队协作的软件开发中&#xff0c;对于版本控制系统Git来说&#xff0c;确保代码与数据的安全性至关重要。为了实现这一目标&#xff0c;Git提供了灵活且可定制的用户权限管理机制。下面将简单的探讨一下Git如何设置用户的权限&#xff0c;以及如何保护代码和数据。 用户身份…

Nginx 多项目部署,vue刷新404 解决方案

网上找的资料大多都解决不了&#xff0c;废话不多说直接告诉你解决方法。 环境是 TP6 VUE前端官网 VUE 后台管理 部署 两个项目 刷新 404 解决方案 Nginx 配置 直接贴图 如果解决了&#xff0c;给我顶起来&#xff0c;让更多人 快速的解决。

Elasticsearch的使用场景深入详解

Elasticsearch的使用场景深入详解 在当今数据驱动的时代&#xff0c;随着数据量的爆炸式增长&#xff0c;对于快速、高效的数据检索和分析的需求越来越迫切。Elasticsearch作为一种分布式搜索和分析引擎&#xff0c;以其强大的全文搜索、实时分析功能和易用性&#xff0c;广泛…

南京观海微电子---如何减少时序报告中的逻辑延迟

1. 引言 在FPGA逻辑电路设计中&#xff0c;FPGA设计能达到的最高性能往往由以下因素决定&#xff1a; ▪ 工作时钟偏移和时钟不确定性&#xff1b; ▪ 逻辑延迟&#xff1a;在一个时钟周期内信号经过的逻辑量&#xff1b; ▪ 网络或路径延迟&#xff1a;Vivado布局布线后引…

取出list中指定数量数据操作,操作完了删除这些数据

直接看代码吧,有注释 package com.ep.crm.task;import java.util.ArrayList; import java.util.List; import java.util.Random;public class Test {public static void main(String[] args) {List<String> list new ArrayList<String>();// 生成随机整数Random …

element-ui button 组件源码分享

element-ui button 源码分享&#xff0c;基于对源码的理解&#xff0c;编写一个简单的 demo&#xff0c;主要分三个模块来分享&#xff1a; 一、button 组件的方法。 1.1 在方法这块&#xff0c;button 组件内部通过暴露 click 方法实现&#xff0c;具体如下&#xff1a; 二、…