首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第4章 数据更新
4-1 数据的插入(INSERT语句的使用方法)
什么是INSERT
INSERT语句的基本语法
列清单的省略
插入NULL
插入默认值
从其他表中复制数据
4-2 数据的删除(DELETE语句的使用方法)
DROP TABLE语句和DELETE语句
DELETE语句的基本语法
指定删除对象的DELETE语句(搜索型DELETE)
4-3 数据的更新(UPDATE语句的使用方法)
UPDATE语句的基本语法
指定条件的UPDATE语句(搜索型UPDATE)
使用NULL进行更新
多列更新
4-4 事务
什么是事务
创建事务
ACID特性
第5章 复杂查询
5-1 视图
视图和表
创建视图的方法
视图的限制① ——定义视图时不能使用ORDER BY子句
视图的限制② ——对视图进行更新
删除视图
5-2 子查询
子查询和视图
子查询的名称
标量子查询
标量子查询的书写位置
使用标量子查询时的注意事项
5-3 关联子查询
普通的子查询和关联子查询的区别
关联子查询也是用来对集合进行切分的
结合条件一定要写在子查询中
第6章 函数、谓词、CASE表达式
6-1 各种各样的函数
函数的种类
算术函数
字符串函数
日期函数
转换函数
6-2 谓词
什么是谓词
LIKE谓词——字符串的部分一致查询
BETWEEN谓词——范围查询
IS NULL、IS NOT NULL——判断是否为NULL
IN谓词——OR的简便用法
使用子查询作为IN谓词的参数
EXIST谓词
6-3 CASE表达式
什么是CASE表达式
CASE表达式的语法
CASE表达式的使用方法
第7章 集合运算
7-1 表的加减法
什么是集合运算
表的加法——UNION
集合运算的注意事项
包含重复行的集合运算——ALL选项
选取表中公共部分——INTERSECT
记录的减法——EXCEPT
7-2 联结(以列为单位对表进行联结)
什么是联结
内联结——INNER JOIN
外联结——OUTER JOIN
3张以上的表的联结
交叉联结——CROSS JOIN
联结的特定语法和过时语法
当前位置:
首页>>
技术小册>>
SQL基础教程(中)
小册名称:SQL基础教程(中)
### 外联结——OUTER JOIN 在SQL(Structured Query Language,结构化查询语言)中,联结(JOIN)操作是数据检索中一个极其强大的工具,它允许我们从两个或多个相关的表中基于共同的字段(通常是主键和外键)来合并数据。联结类型多种多样,其中外联结(OUTER JOIN)是一种特别有用的类型,它扩展了内联结(INNER JOIN)的能力,能够返回至少在一个表中有匹配的行,即便在另一个表中没有匹配的行。外联结包括左外联结(LEFT OUTER JOIN)、右外联结(RIGHT OUTER JOIN)和全外联结(FULL OUTER JOIN),尽管并非所有数据库系统都直接支持全外联结。 #### 一、外联结概述 外联结的主要目的是解决当两个表进行联结时,如果某个表中没有匹配的行,那么这些行将被排除在结果集之外的问题。通过使用外联结,我们可以确保至少一个表中的所有行都会出现在结果集中,即使它们在另一个表中没有匹配的行。这些没有匹配的行在结果集中会以NULL值填充对应列。 #### 二、左外联结(LEFT OUTER JOIN) 左外联结是最常用的外联结类型之一。它返回左表(LEFT JOIN左侧的表)中的所有行,即使右表(RIGHT JOIN右侧的表)中没有匹配的行。如果右表中没有匹配的行,则结果中这些行的右表部分将包含NULL值。 **语法示例**: ```sql SELECT Orders.OrderID, Customers.CustomerName FROM Orders LEFT OUTER JOIN Customers ON Orders.CustomerID = Customers.CustomerID; ``` 在这个例子中,我们联结了`Orders`表和`Customers`表,基于`CustomerID`字段。查询将返回所有订单,以及与之关联的顾客名称(如果存在)。如果某个订单没有对应的顾客(例如,顾客记录已被删除或从未存在),则该订单的`CustomerName`将显示为NULL。 #### 三、右外联结(RIGHT OUTER JOIN) 与左外联结相反,右外联结返回右表中的所有行,即使左表中没有匹配的行。如果左表中没有匹配的行,则结果中这些行的左表部分将包含NULL值。 **语法示例**: ```sql SELECT Orders.OrderID, Customers.CustomerName FROM Orders RIGHT OUTER JOIN Customers ON Orders.CustomerID = Customers.CustomerID; ``` 注意,虽然上述查询在技术上可行,但在实际应用中,使用右外联结的情况相对较少,因为大多数数据库设计遵循从左到右的阅读习惯,且左外联结通常可以通过调整联结的顺序和查询逻辑来替代右外联结。 #### 四、全外联结(FULL OUTER JOIN) 全外联结结合了左外联结和右外联结的特性,返回两个表中的所有行。当某行在另一个表中没有匹配时,该行的对应部分将包含NULL值。全外联结对于需要同时查看两个表中所有行的情况特别有用,无论它们之间是否存在匹配关系。 **语法示例(注意:并非所有数据库系统都直接支持FULL OUTER JOIN)**: ```sql SELECT Orders.OrderID, Customers.CustomerName FROM Orders FULL OUTER JOIN Customers ON Orders.CustomerID = Customers.CustomerID; ``` 这个查询将返回所有订单和顾客,无论它们之间是否有直接的关联。如果某个订单没有对应的顾客,或者某个顾客没有订单,那么相应的列将显示为NULL。 #### 五、使用外联结的注意事项 1. **性能考虑**:外联结可能会影响查询的性能,尤其是当处理大型数据集时。优化联结条件、索引和查询逻辑可以显著提高性能。 2. **结果集的理解**:外联结的结果集可能包含NULL值,这需要开发者在编写应用程序时特别注意,确保能正确处理这些NULL值。 3. **替代方案**:在某些情况下,外联结可以通过子查询、UNION操作或其他SQL技巧来实现相同或类似的结果,但可能具有不同的性能特性。 4. **数据库系统差异**:不同的数据库系统(如MySQL、PostgreSQL、SQL Server等)在外联结的语法和支持方面可能存在细微差异。因此,编写可移植的SQL代码时需要注意这些差异。 5. **使用场景**:外联结在需要保留一个表中所有记录,同时显示与之关联的另一个表中记录的场合非常有用,如报告生成、数据分析等。 #### 六、外联结的实际应用 外联结在实际应用中有着广泛的用途。例如,在电子商务系统中,你可能需要列出所有商品及其最近的购买记录,即使某些商品从未被购买过。此时,你可以使用左外联结将商品表与订单详情表联结起来,以确保所有商品都出现在结果集中,而那些没有购买记录的商品将在订单详情部分显示为NULL。 又如,在客户关系管理(CRM)系统中,你可能需要生成一份包含所有客户及其最近一次互动(如电话联系、邮件发送等)的报告。通过右外联结客户表和互动记录表,你可以确保即使某些客户最近没有互动记录,他们的信息仍然会出现在报告中。 总之,外联结是SQL中一个非常强大且灵活的工具,它允许我们根据需要在两个或多个表之间灵活地合并数据。通过理解并掌握外联结的语法和使用方法,我们可以更有效地从数据库中检索和整合信息。
上一篇:
内联结——INNER JOIN
下一篇:
3张以上的表的联结
该分类下的相关小册推荐:
高性能的Postgres SQL
PostgreSQL入门教程
SQL基础教程(上)
SQL基础教程(下)