0

0

如何实现SQL的外连接?LEFT JOIN与RIGHT JOIN的区别

蓮花仙者

蓮花仙者

发布时间:2025-09-06 15:05:02

|

1074人浏览过

|

来源于php中文网

原创

外连接通过LEFT JOIN、RIGHT JOIN和FULL OUTER JOIN实现,保证至少一个表的数据完整;例如LEFT JOIN返回左表所有行及右表匹配行,无匹配则补NULL,适用于查找无订单客户等场景。

如何实现sql的外连接?left join与right join的区别

外连接,简单来说,就是把两个表连接起来的时候,即使其中一个表里没有对应的数据,也把另一个表的数据展示出来。核心在于“外”,它保证了至少一个表的数据完整性。

解决方案:

SQL外连接主要通过

LEFT JOIN
RIGHT JOIN
FULL OUTER JOIN
实现。

  • LEFT JOIN
    (或
    LEFT OUTER JOIN
    ): 返回左表的所有行,以及右表中与左表匹配的行。如果右表中没有匹配的行,则右表对应的列显示为
    NULL
  • RIGHT JOIN
    (或
    RIGHT OUTER JOIN
    ): 与
    LEFT JOIN
    相反,返回右表的所有行,以及左表中与右表匹配的行。如果左表中没有匹配的行,则左表对应的列显示为
    NULL
  • FULL OUTER JOIN
    : 返回左表和右表的所有行。当左表或右表中的行没有匹配的行时,对应的列显示为
    NULL
    。并非所有SQL数据库都支持
    FULL OUTER JOIN

举个例子:

假设有两个表,

Customers
(客户) 和
Orders
(订单):

Customers 表:

CustomerID CustomerName
1 Alice
2 Bob
3 Charlie

Orders 表:

OrderID CustomerID OrderDate
101 1 2023-10-26
102 2 2023-10-27
103 1 2023-10-28

使用

LEFT JOIN
:

SELECT
    Customers.CustomerID,
    Customers.CustomerName,
    Orders.OrderID,
    Orders.OrderDate
FROM
    Customers
LEFT JOIN
    Orders ON Customers.CustomerID = Orders.CustomerID;

结果:

FreeTTS
FreeTTS

FreeTTS是一个免费开源的在线文本到语音生成解决方案,可以将文本转换成MP3,

下载
CustomerID CustomerName OrderID OrderDate
1 Alice 101 2023-10-26
1 Alice 103 2023-10-28
2 Bob 102 2023-10-27
3 Charlie NULL NULL

注意,Charlie 虽然没有订单,但仍然出现在结果中。

使用

RIGHT JOIN
:

SELECT
    Customers.CustomerID,
    Customers.CustomerName,
    Orders.OrderID,
    Orders.OrderDate
FROM
    Customers
RIGHT JOIN
    Orders ON Customers.CustomerID = Orders.CustomerID;

结果:

CustomerID CustomerName OrderID OrderDate
1 Alice 101 2023-10-26
2 Bob 102 2023-10-27
1 Alice 103 2023-10-28

这里,因为Orders表里的所有Order都有对应的CustomerID,所以结果和只取Orders表数据的结果差不多,但如果Orders表里有CustomerID不存在于Customers表,那么结果就会有所不同。

LEFT JOIN
RIGHT JOIN
区别

LEFT JOIN
返回左表的所有行,
RIGHT JOIN
返回右表的所有行。 关键在于 "左" 和 "右" 是相对于
JOIN
关键字而言的。 理解这一点,就能避免混淆。 有时候,可以通过交换表的位置,将
RIGHT JOIN
转换为
LEFT JOIN
,这样代码的可读性会更好,也更符合大多数人的习惯。 例如,上面的
RIGHT JOIN
可以改写为:

SELECT
    Customers.CustomerID,
    Customers.CustomerName,
    Orders.OrderID,
    Orders.OrderDate
FROM
    Orders
LEFT JOIN
    Customers ON Customers.CustomerID = Orders.CustomerID;

结果一致,但逻辑更清晰。

如何处理多表之间的外连接?

在实际应用中,经常需要连接多个表。 多表连接的核心在于理解连接的顺序和条件。 可以把多表连接看作是多个两表连接的组合。 例如,如果需要连接

Customers
Orders
Products
(产品) 三个表,可以先将
Customers
Orders
进行连接,然后再将结果与
Products
进行连接。

SELECT
    Customers.CustomerName,
    Orders.OrderDate,
    Products.ProductName
FROM
    Customers
LEFT JOIN
    Orders ON Customers.CustomerID = Orders.CustomerID
LEFT JOIN
    Products ON Orders.ProductID = Products.ProductID;

注意:连接顺序很重要,不同的连接顺序可能会导致不同的结果。

外连接的性能优化技巧有哪些?

  • 索引: 确保连接列上有索引。索引可以显著提高连接查询的性能。 这是最基本也是最重要的优化手段。
  • 避免在
    WHERE
    子句中使用
    NULL
    值判断:
    NULL
    值判断可能会导致索引失效。 尽量避免在
    WHERE
    子句中使用
    IS NULL
    IS NOT NULL
  • 选择合适的连接类型: 根据实际需求选择合适的连接类型。 例如,如果只需要左表的数据,就不要使用
    FULL OUTER JOIN
  • 优化查询语句: 尽量减少查询的数据量。 可以使用
    WHERE
    子句过滤掉不需要的数据。
  • 使用物化视图: 对于复杂的外连接查询,可以考虑使用物化视图来提高性能。 物化视图是将查询结果预先存储起来,可以避免每次都执行复杂的查询。

外连接在实际开发中的应用场景?

外连接在数据分析、报表生成等场景中非常常见。 例如:

  • 查找没有订单的客户: 可以使用
    LEFT JOIN
    找到所有客户,然后使用
    WHERE
    子句过滤掉有订单的客户。
  • 统计每个产品的销售额: 可以使用
    LEFT JOIN
    Products
    表和
    Orders
    表连接起来,然后使用
    GROUP BY
    子句和
    SUM
    函数统计每个产品的销售额。
  • 生成用户画像: 可以使用多个
    LEFT JOIN
    将用户表和各种行为表连接起来,然后分析用户的行为特征。

外连接看似简单,但要真正掌握并灵活运用,需要不断实践和思考。 只有理解了外连接的本质,才能在实际开发中游刃有余。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

684

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

323

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

348

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1117

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

359

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

717

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

577

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

419

2024.04.29

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
R 教程
R 教程

共45课时 | 5.4万人学习

SQL 教程
SQL 教程

共61课时 | 3.5万人学习

C 教程
C 教程

共75课时 | 4.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号