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

语法

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

示例

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

sql 复制代码
-- 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

sql 复制代码
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来实现相同的结果。

语法

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

示例

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

使用RIGHT JOIN

sql 复制代码
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取决于你的具体需求。

相关推荐
师太,答应老衲吧1 小时前
SQL实战训练之,力扣:2020. 无流量的帐户数(递归)
数据库·sql·leetcode
Channing Lewis3 小时前
salesforce case可以新建一个roll up 字段,统计出这个case下的email数量吗
数据库·salesforce
毕业设计制作和分享4 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
ketil274 小时前
Redis - String 字符串
数据库·redis·缓存
Hsu_kk5 小时前
MySQL 批量删除海量数据的几种方法
数据库·mysql
编程学无止境5 小时前
第02章 MySQL环境搭建
数据库·mysql
knight-n5 小时前
MYSQL库的操作
数据库·mysql
包饭厅咸鱼6 小时前
QML----复制指定下标的ListModel数据
开发语言·数据库
生命几十年3万天6 小时前
redis时间优化
数据库·redis·缓存
Elastic 中国社区官方博客6 小时前
释放专利力量:Patently 如何利用向量搜索和 NLP 简化协作
大数据·数据库·人工智能·elasticsearch·搜索引擎·自然语言处理