SQL 连接 vs 子查询

原文:https://www.geeksforgeeks.org/sql-join-vs-subquery/

什么是加盟

联接是将两个或多个表中的记录组合在一起的查询。每当查询的 FROM 子句中出现多个表时,就会执行连接。查询的选择列表可以从这些表中选择任何列。如果连接条件被省略或无效,则形成笛卡尔乘积。如果这两个表中的任何一个有共同的列名,则必须在整个查询中用表或表别名来限定这些列,以避免歧义。大多数联接查询至少包含一个联接条件,要么在 FROM 子句中,要么在 WHERE 子句中。

什么是子查询

子查询、内部查询或嵌套查询是 SQL 查询中的查询,嵌入在 WHERE 子句中。子查询是嵌入在另一条 SQL 语句的子句中的 SELECT 语句。它们对于从条件依赖于同一表或另一表中的数据的表中选择行非常有用。子查询用于返回将在主查询中用作进一步限制要检索的数据的条件的数据。子查询可以放在下面的 SQL 子句中,它们是 WHERE 子句、HAVING 子句、FROM 子句。

连接的优势:

  • 联接的优点包括执行速度更快。
  • 使用连接的查询的检索时间几乎总是比子查询的检索时间快。
  • 通过使用联接,您可以最大限度地减轻数据库的计算负担,即使用一个联接查询代替多个查询。这意味着您可以更好地利用数据库的搜索、过滤、排序等功能。

连接的缺点:

  • 使用联接的缺点包括它们不像子查询那样容易阅读。
  • 查询中的更多连接意味着数据库服务器必须做更多的工作,这意味着检索数据是更耗时的过程
  • 由于存在不同类型的联接,因此对于使用哪种联接来生成正确的所需结果集是合适的联接类型可能会令人困惑。
  • 从规范化数据库中检索数据时,不能避免连接,但正确执行连接很重要,因为不正确的连接会导致严重的性能下降和不准确的查询结果。

子查询的优势:

  • 子查询将复杂查询分成独立的部分,这样复杂查询就可以分解成一系列逻辑步骤。
  • 很容易理解,代码维护也很轻松。
  • 子查询允许您在外部查询中使用另一个查询的结果。
  • 在某些情况下,子查询可以替换复杂的联接和联合。

子查询的缺点:

  • 对于 MYSQL 来说,优化器对于联接比子查询更成熟,因此在许多情况下,如果将使用子查询的语句重写为联接,该语句的执行效率会更高。
  • 我们不能在同一个 SQL 语句中修改一个表并从子查询的同一个表中进行选择。

结论: 子查询更容易编写,但是联合可能会被服务器更好地优化。例如,左外连接通常工作得更快,因为服务器对其进行了优化。