您当前的位置:首页 > 电脑百科 > 数据库 > 百科

SQL连接最全总结:提升你的数据库查询技能

时间:2023-12-06 16:08:49  来源:微信公众号  作者:自由学习屋
掌握 SQL 中的连接对于有效的数据检索和分析至关重要。通过对不同连接类型及其示例的了解,您可以构建高效且准确的查询,从而提供所需的见解。实践和实验是掌握这个关键 SQL 技能的关键。

 

SQL连接最全总结:提升你的数据库查询技能

前言(Preface)

结构化查询语言(SQL)是一种用于管理和分析存储在关系数据库中的数据的强大工具。SQL 中的一个基本概念是连接操作,它允许您基于匹配列组合两个或多个表的数据。掌握连接对于高效和准确的数据检索至关重要。在本文中,我们将重点研究 SQL 连接的核心类型——内连接、左连接、右连接、全连接和交叉连接——每一种类型在数据合并中都有其独特的用途。我们将讨论不同类型的连接,并提供示例来帮助您有效地理解和利用它们,使其成为初学者和有经验的数据库专业人员的必备资源,以增强他们对 SQL 连接的理解和应用。

SQL 中连接类型

内连接(Inner Join):只返回两张表中满足匹配条件的记录。

左连接(Left (Outer) Join):返回左表的所有行以及右表中的匹配行,对于右表中未匹配上的行,其列值在结果集中用 NULL 填充。

右连接(Right(Outer) Join):与左连接类似,只是主表为右表。返回右表的所有行以及左表中的匹配行,对于左表中未匹配上的行,其列值在结果集中用 NULL 填充。

全连接(Full (Outer) Join):返回两个表的所有行(无论是否匹配),对于左右表中未匹配上的行,其列值在结果集中用 NULL 填充。

自连接(Self Join):一种独特的连接类型,其中表与自身连接。当你需要比较同一表中的行时,就适合用自连接。

交叉连接(Cross Join):也称为笛卡尔连接,返回两个表的笛卡尔积,这意味着第一个表的每一行都与第二个表的所有行相结合。比如,若 A,B 两个表的行数分别为 m 和 n,则交叉连接后结果集中的总行数为:m * n。

语法和示例

为了进一步理解每一种连接类型,接下来我们将研究它们的语法和使用示例。假设我们在数据库中有两个表:Employees 和 Departments。Employees 表有 EmployeeID、Name 和 DeptID 列,而 Departments 表有 DeptID 和 DeptName 列。

内连接语法及示例

语法:

SELECT column1, column2, ...
FROM table1
INNER JOIN table2
ON table1.match_column = table2.match_column;

示例:

SELECT Employees.Name, Departments.DeptName
FROM Employees
INNER JOIN Departments ON Employees.DeptID = Departments.DeptID;

示例说明:该查询获取员工的姓名及其部门的名称,但仅获取分配到部门的员工的姓名。

左连接语法及示例

语法:

SELECT column1, column2, ...
FROM table1
LEFT JOIN table2
ON table1.match_column = table2.match_column;

示例:

SELECT Employees.Name, Departments.DeptName
FROM Employees
LEFT JOIN Departments ON Employees.DeptID = Departments.DeptID;

示例说明:此查询返回所有员工,包括未分配到任何部门的员工,在这种情况下,DeptName 列显示为 NULL。

右连接语法及示例

语法:

SELECT column1, column2, ...
FROM table1
RIGHT JOIN table2
ON table1.match_column = table2.match_column;

示例:

SELECT Employees.Name, Departments.DeptName
FROM Employees
RIGHT JOIN Departments ON Employees.DeptID = Departments.DeptID;

示例说明:该查询获取所有部门,包括那些没有分配任何员工的部门,这些部门的 Name 列为 NULL。

全连接语法及示例

语法:

SELECT column1, column2, ...
FROM table1
FULL OUTER JOIN table2
ON table1.match_column = table2.match_column;

示例:

SELECT Employees.Name, Departments.DeptName
FROM Employees
FULL OUTER JOIN Departments ON Employees.DeptID = Departments.DeptID;

示例说明:该查询会列出所有员工和所有部门,包括没有部门的员工和没有员工的部门。

自连接语法及示例

语法:

SELECT column1, column2, ...
FROM table1 AS alias1
JOIN table1 AS alias2
ON alias1.match_column = alias2.match_column;

示例:

SELECT A.Name AS EmployeeName, B.Name AS ManagerName
FROM Employees A
JOIN Employees B
ON A.ManagerID = B.EmployeeID;

示例说明:假设 Employees 表有一个 ManagerID 列引用经理的 EmployeeID,该查询将列出员工和他们的经理。

交叉连接语法及示例

语法:

SELECT column1, column2, ...
FROM table1
CROSS JOIN table2;

示例:

SELECT Employees.Name, Departments.DeptName
FROM Employees
CROSS JOIN Departments;

示例说明:该查询将每个员工与每个部门组合在一起,产生一个将每个员工与每个部门配对的列表。这种情况会产生很多错误的数据,另外由于笛卡尔积产生的行数量比较多,所以会影响查询性能(特别是连接表的记录数较高时)。

连接优化技术

为了确保 SQL 查询高效运行,请考虑以下优化技术:

  • 索引:在连接条件的匹配列上使用索引,这样可以有效提升匹配查询速度。
  • 连接类型:选择适当的连接类型以尽量减少返回的行数。
  • 提前过滤:在连接之前应用 WHERE 子句以减小结果集的大小。
  • 子查询最低优先级:在兼容的情况下,尽量选用 EXISTS 或 IN 子句而非子查询。
  • 连接顺序:连接中表的顺序会影响性能。较小的表或具有更多过滤器的表通常应该首先连接。
  • 避免不必要的列:只选择必要的列以减少数据负载。

常见的陷阱和如何避免它们

在使用连接时,要注意这些常见的陷阱:

  • 笛卡尔积:如果忘记 ON 子句,结果将会导致笛卡尔积,从而创建一个过大的结果集。
  • 连接类型错误:使用错误的连接类型将会返回不期望的结果。
  • 空值:在连接可能包含空值的列时要小心,因为它们可能会影响结果集。
  • 性能问题:连接使用不当,如过度使用嵌套子查询,将会导致性能问题。

结论

掌握 SQL 中的连接对于有效的数据检索和分析至关重要。通过对不同连接类型及其示例的了解,您可以构建高效且准确的查询,从而提供所需的见解。实践和实验是掌握这个关键 SQL 技能的关键。

最后,我们列举一些实际工作中频繁问到的问题及答案(面试中大概率会问到噢~~):

FAQs

  1. 什么是 SQL 连接?SQL 连接是 SQL 查询中使用的子句,用于根据两个或多个表之间的相关列组合行。
  2. 内连接是如何工作的?当两个表中至少有一个匹配时,内连接返回对应行数据。如果一个表中的行在另一个表中没有相应的匹配,则这样的行不包括在结果集中。
  3. 左连接和右连接的区别是什么?左连接返回左表中的所有行,以及右表中的匹配行。右表中未匹配行对应的列在结果集中用 NULL 填充。右连接则相反,返回右表中的所有行,以及左表中的匹配行。
  4. 你能解释一下全连接吗?当在左表或右表中存在匹配时,全连接返回所有行。全连接其实结合了左连接和右连接的结果(即左右连接的并集)。
  5. 什么是自连接,为什么要使用它?自连接是一个常规的连接,但是表是与自己连接的。它对于查询分层数据或比较同一表中的行非常有用。
  6. 什么时候使用交叉连接?当需要将一个表的每一行与另一个表的每一行进行组合时,就需要使用交叉连接。它通常用于需要创建所有可能配对组合的场景。
  7. SQL 连接如何影响查询性能?连接会显著影响性能,特别是在大型数据库中。由于全表扫描、缺乏索引和返回大型数据集,可能会出现性能问题。
  8. 写连接时会犯哪些常见错误?常见的错误包括在非索引列上进行连接,使用交叉连接无意中创建笛卡尔积,连接条件中的数据类型不匹配,以及忽略连接列中的 NULL 值。
  9. 如何处理连接条件中的 NULL 值?您需要在连接条件中使用 IS NULL,或者如果 NULL 是需要的,则需要将连接键合并为一个公共值。比如,将 NULL 统一处理为空字符串:COALESCE(match_column, '')。
  10. 什么是自然连接?自然连接基于两个表中具有相同名称和兼容数据类型的列自动连接表。由于它的隐式性质,并不太常用,因为这可能导致意想不到的结果。
  11. 可以在一个 SQL 查询中连接两个以上的表吗?当然,您可以通过在单个SQL查询中顺序添加连接子句实现多表连接。
  12. 如何选择不同的连接类型?连接类型的选择取决于表和需要检索的数据之间的关系。所以你需要明确了解每个连接的工作方式及其产生的结果集之间的差异,这样你才能选择正确的连接类型。
  13. 连接和子查询用哪个更好?这取决于具体的使用场景。对于关系数据检索来说,连接通常更快,可读性更强,而子查询对于将复杂查询分解为更简单的部分可能很有用。
  14. 外连接和内连接有什么不同?外连接(左/右/全)的结果集会包括另一个表中没有匹配的行,未匹配行对应的列用 NULL 填充。而内连接只包括两个表中具有匹配记录的行。


Tags:SQL   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
MySQL 核心模块揭秘
server 层会创建一个 SAVEPOINT 对象,用于存放 savepoint 信息。binlog 会把 binlog offset 写入 server 层为它分配的一块 8 字节的内存里。 InnoDB 会维护自己的 savepoint...【详细内容】
2024-04-03  Search: SQL  点击:(5)  评论:(0)  加入收藏
原来 SQL 函数是可以内联的!
介绍在某些情况下,SQL 函数(即指定LANGUAGE SQL)会将其函数体内联到调用它的查询中,而不是直接调用。这可以带来显著的性能提升,因为函数体可以暴露给调用查询的规划器,从而规划器...【详细内容】
2024-04-03  Search: SQL  点击:(3)  评论:(0)  加入收藏
如何正确选择NoSQL数据库
译者 | 陈峻审校 | 重楼Allied Market Research最近发布的一份报告指出,业界对于NoSQL数据库的需求正在持续上升。2022年,全球NoSQL市场的销售额已达73亿美元,预计到2032年将达...【详细内容】
2024-03-28  Search: SQL  点击:(13)  评论:(0)  加入收藏
MySQL 核心模块揭秘,你看明白了吗?
为了提升分配 undo 段的效率,事务提交过程中,InnoDB 会缓存一些 undo 段。只要同时满足两个条件,insert undo 段或 update undo 段就能被缓存。1. 关于缓存 undo 段为了提升分...【详细内容】
2024-03-27  Search: SQL  点击:(10)  评论:(0)  加入收藏
MySQL:BUG导致DDL语句无谓的索引重建
对于5.7.23之前的版本在评估类似DDL操作的时候需要谨慎,可能评估为瞬间操作,但是实际上线的时候跑了很久,这个就容易导致超过维护窗口,甚至更大的故障。一、问题模拟使用5.7.22...【详细内容】
2024-03-26  Search: SQL  点击:(8)  评论:(0)  加入收藏
从 MySQL 到 ByteHouse,抖音精准推荐存储架构重构解读
ByteHouse是一款OLAP引擎,具备查询效率高的特点,在硬件需求上相对较低,且具有良好的水平扩展性,如果数据量进一步增长,可以通过增加服务器数量来提升处理能力。本文将从兴趣圈层...【详细内容】
2024-03-22  Search: SQL  点击:(23)  评论:(0)  加入收藏
在 SQL 中写了 in 和 not in,技术总监说要炒了我……
WHY?IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢?1、效率低项目中遇到这么个情况:t1表 和 t2表 都是150w条数据,600M的样子,都不算大。但是这样一句查询 ↓select *...【详细内容】
2024-03-18  Search: SQL  点击:(5)  评论:(0)  加入收藏
应对慢SQL的致胜法宝:7大实例剖析+优化原则
大促备战,最大的隐患项之一就是慢SQL,对于服务平稳运行带来的破坏性最大,也是日常工作中经常带来整个应用抖动的最大隐患,在日常开发中如何避免出现慢SQL,出现了慢SQL应该按照什...【详细内容】
2024-03-14  Search: SQL  点击:(4)  评论:(0)  加入收藏
MySQL自增主键一定是连续的吗?
测试环境:MySQL版本:8.0数据库表:T (主键id,唯一索引c,普通字段d)如果你的业务设计依赖于自增主键的连续性,这个设计假设自增主键是连续的。但实际上,这样的假设是错的,因为自增主键不...【详细内容】
2024-03-10  Search: SQL  点击:(5)  评论:(0)  加入收藏
准线上事故之MySQL优化器索引选错
1 背景最近组里来了许多新的小伙伴,大家在一起聊聊技术,有小兄弟提到了MySQL的优化器的内部策略,想起了之前在公司出现的一个线上问题,今天借着这个机会,在这里分享下过程和结论...【详细内容】
2024-03-07  Search: SQL  点击:(26)  评论:(0)  加入收藏
▌简易百科推荐
向量数据库落地实践
本文基于京东内部向量数据库vearch进行实践。Vearch 是对大规模深度学习向量进行高性能相似搜索的弹性分布式系统。详见: https://github.com/vearch/zh_docs/blob/v3.3.X/do...【详细内容】
2024-04-03  京东云开发者    Tags:向量数据库   点击:(4)  评论:(0)  加入收藏
原来 SQL 函数是可以内联的!
介绍在某些情况下,SQL 函数(即指定LANGUAGE SQL)会将其函数体内联到调用它的查询中,而不是直接调用。这可以带来显著的性能提升,因为函数体可以暴露给调用查询的规划器,从而规划器...【详细内容】
2024-04-03  红石PG  微信公众号  Tags:SQL 函数   点击:(3)  评论:(0)  加入收藏
如何正确选择NoSQL数据库
译者 | 陈峻审校 | 重楼Allied Market Research最近发布的一份报告指出,业界对于NoSQL数据库的需求正在持续上升。2022年,全球NoSQL市场的销售额已达73亿美元,预计到2032年将达...【详细内容】
2024-03-28    51CTO  Tags:NoSQL   点击:(13)  评论:(0)  加入收藏
为什么数据库连接池不采用 IO 多路复用?
这是一个非常好的问题。IO多路复用被视为是非常好的性能助力器。但是一般我们在使用DB时,还是经常性采用c3p0,tomcat connection pool等技术来与DB连接,哪怕整个程序已经变成以...【详细内容】
2024-03-27  dbaplus社群    Tags:数据库连接池   点击:(12)  评论:(0)  加入收藏
八个常见的数据可视化错误以及如何避免它们
在当今以数据驱动为主导的世界里,清晰且具有洞察力的数据可视化至关重要。然而,在创建数据可视化时很容易犯错误,这可能导致对数据的错误解读。本文将探讨一些常见的糟糕数据可...【详细内容】
2024-03-26  DeepHub IMBA  微信公众号  Tags:数据可视化   点击:(6)  评论:(0)  加入收藏
到底有没有必要分库分表,如何考量的
关于是否需要进行分库分表,可以根据以下考量因素来决定: 数据量和负载:如果数据量巨大且负载压力较大,单一库单一表可能无法满足性能需求,考虑分库分表。 数据增长:预估数据增长...【详细内容】
2024-03-20  码上遇见你  微信公众号  Tags:分库分表   点击:(13)  评论:(0)  加入收藏
在 SQL 中写了 in 和 not in,技术总监说要炒了我……
WHY?IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢?1、效率低项目中遇到这么个情况:t1表 和 t2表 都是150w条数据,600M的样子,都不算大。但是这样一句查询 ↓select *...【详细内容】
2024-03-18  dbaplus社群    Tags:SQL   点击:(5)  评论:(0)  加入收藏
应对慢SQL的致胜法宝:7大实例剖析+优化原则
大促备战,最大的隐患项之一就是慢SQL,对于服务平稳运行带来的破坏性最大,也是日常工作中经常带来整个应用抖动的最大隐患,在日常开发中如何避免出现慢SQL,出现了慢SQL应该按照什...【详细内容】
2024-03-14  京东云开发者    Tags:慢SQL   点击:(4)  评论:(0)  加入收藏
过去一年,我看到了数据库领域的十大发展趋势
作者 | 朱洁策划 | 李冬梅过去一年,行业信心跌至冰点2022 年中,红衫的一篇《适应与忍耐》的报告,对公司经营提出了预警,让各个公司保持现金流,重整团队,想办法增加盈利。这篇报告...【详细内容】
2024-03-12    InfoQ  Tags:数据库   点击:(25)  评论:(0)  加入收藏
SQL优化的七个方法,你会哪个?
一、插入数据优化 普通插入:在平时我们执行insert语句的时候,可能都是一条一条数据插入进去的,就像下面这样。INSERT INTO `department` VALUES(1, '研发部(RD)', &#39...【详细内容】
2024-03-07  程序员恰恰  微信公众号  Tags:SQL优化   点击:(19)  评论:(0)  加入收藏
站内最新
站内热门
站内头条