干货 | SQL 外部联接 Outer Join
外部联接(Outer Join)是所有 SQL 联接类型中最不为人知的。也许是因为与其他联接类型相比,外部联接的需求较少。无论如何,外部联接本身并没有什么奇特的。正如我们将在这篇文章中看到的几个外部联接的示例,应该足以消除你对它们的任何误解和困惑。
本文将首先讲述 Outer Join 语句的语法和用途,然后会有一些示例说明。
OUTER JOIN 语法
当左(表 A)或右(表 B)表记录中存在匹配项时,OUTER JOIN(或 FULL OUTER JOIN)关键字会返回两个联接表的所有记录。下面的 VEN 图描述了潜在的匹配项和 OUTER JOIN 语法:
因此,FULL OUTER JOIN 会从返回两个表中不匹配的行,以及两个表中的匹配行。换句话说,无论两个表的联接字段(Clave)值是否匹配,查询都会返回行。
还是一头雾水?不用担心,我们将在下一节中看看一些示例,就能一清二楚。
OUTER JOIN 的实践
在本教程中,我们将使用广为人知的 Northwind 示例数据库。
以下 SQL 语句选择所有客户和所有订单:
SELECT Customers.CustomerName, Orders.OrderID FROM Customers FULL OUTER JOIN Orders ON Customers.CustomerID=Orders.CustomerID ORDER BY Customers.CustomerName;
由 OUTER JOIN 查询生成的结果集的特征之一是,你可能会在任一联接列中看到 Null 值,因为联接列可能出现在一个表中,但不会出现在另一个表中。在下面的屏幕截图中,我们可以看到Navicat Premium 16中上述查询及其结果:
当然,你不会在两个表列中看到 Null,因为值必须至少出现在一个表中。值得注意的是,在 ContactName 列中出现 Null 是有问题的,因为这意味着订单与现有客户无关。这指出数据库设计存在缺陷,很可能是缺少外键约束。
我们的第二个示例是从项目管理数据库中获取数据,即项目经理和项目。以下是 SQL 语句:
SELECT m.name member, p.title project FROM pm.members m FULL OUTER JOIN pm.projects p ON p.id = m.project_id;
同样,我们可以看到 Null 值(至少一个 Null 值)
在这种情况下,结果表明 Jack Daniel 目前没有项目。这是否构成问题将取决于该组织的具体业务。在任何给定时间,项目经理没有项目或未分配项目可能是完全合理的。
总结
希望今天的文章能够帮助你了解外部联接在查询中的用途和用法。最后一件要注意的事:外部联接可能会产生非常大的结果集,因此要谨慎使用它们,并加入筛选子句(例如 WHERE)以尽量减少返回的行数。
往期回顾
相关文章
- 解决开启SQL Server sql Always on Group 事务日志增大的问题
- C#面试题(转载) SQL Server 数据库基础笔记分享(下) SQL Server 数据库基础笔记分享(上) Asp.Net MVC4中的全局过滤器 C#语法——泛型的多种应用
- 对于SQL的Join,在学习起来可能是比较乱的。我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚。Coding Horror上有一篇文章,通过文氏图 Venn diagrams 解释了SQL的Join。我觉得清楚易懂,转过来。 交差集" cross join 《Linux命令行与shell脚本编程大全
- sql 批量修改,Update Select 嵌套更新或批量更新一句SQL语句搞定,
- SQL Server 中 EXEC全称execute 与 SP_EXECUTESQL动态执行sql代码语句 的区别
- SQL案例分析-地铁换乘线路查询.sql
- 本人收藏的Sql server经典t-sql语句(备忘录,持续更新中)
- SQL Server 占用内存太高,查找占用内存高以及影响其性能的sql语句及解决方法
- 第七十一章 SQL命令 SELECT(三)
- 第五十六章 SQL函数 $EXTRACT
- Sql Server-查询一列的数据进行拼接
- 基于C#(MVC5)+SQL Server 2008 实现(Web)博客网站【100010199】
- 浅析SQL中 in 与 exists 用法的区别及其各自执行流程、not in/not exists区别、sql优化应该如何选择in还是exists
- [Oracle工程师手记] 利用 DBMS_SQLTUNE.report_sql_monitor 生成 SQL 语句的监控信息
- 怎样使用oracle 的DBMS_SQLTUNE package 来执行 Sql Tuning Advisor 进行sql 自己主动调优
- 【bat】sql server在多台服务器上执行SQL脚本
- SQL Server数据库损坏、检测以及简单的修复办法【转】
- sql server存储引擎启动错误(SQL Server could not spawn FRunCM thread)
- 【sql server镜像】SQL SERVER 基于数据库镜像的主从同步(数据库镜像实践汇总)
- SSAS(SQL Server 分析服务)、***S(SQL Server报表服务)、SSIS(SQL Server集成服务)