SQL 连接与子查询
什么是联接?
连接是组合来自两个或多个表的记录的查询。只要查询的 FROM 子句中出现多个表,就会执行连接。查询的选择列表可以从任何这些表中选择任何列。如果连接条件被省略或无效,则形成笛卡尔积。如果这些表中的任何两个具有共同的列名,则必须在整个查询中使用表或表别名来限定这些列以避免歧义。大多数连接查询至少包含一个连接条件,要么在 FROM 子句中,要么在 WHERE 子句中。
什么是子查询?
子查询或内部查询或嵌套查询是 SQL 查询中的查询并嵌入在 WHERE 子句中。子查询是嵌入在另一个 SQL 语句的子句中的 SELECT 语句。它们对于从表中选择具有取决于同一表或另一个表中的数据的条件的行非常有用。子查询用于返回将在主查询中使用的数据,作为进一步限制要检索的数据的条件。子查询可以放在以下 SQL 子句中,它们是 WHERE 子句、HAVING 子句、FROM 子句。
加盟优势:
- 连接的优点包括执行速度更快。
- 使用连接的查询的检索时间几乎总是比子查询快。
- 通过使用连接,您可以最大化数据库的计算负担,即,而不是使用一个连接查询进行多个查询。这意味着您可以更好地利用数据库的搜索、过滤、排序等功能。
连接的缺点:
- 使用连接的缺点包括它们不像子查询那样容易阅读。
- 查询中的更多连接意味着数据库服务器必须做更多的工作,这意味着检索数据的过程更耗时
- 由于存在不同类型的连接,因此可能会混淆哪种连接是用于生成正确所需结果集的合适连接类型。
- 从规范化数据库检索数据时无法避免连接,但正确执行连接很重要,因为不正确的连接会导致严重的性能下降和不准确的查询结果。
子查询的优点:
- 子查询将复杂查询分成独立的部分,以便可以将复杂查询分解为一系列逻辑步骤。
- 它易于理解,代码维护也很轻松。
- 子查询允许您在外部查询中使用另一个查询的结果。
- 在某些情况下,子查询可以代替复杂的联接和联合。
子查询的缺点:
- MYSQL 的连接优化器比子查询更成熟,因此在许多情况下,如果将使用子查询的语句重写为连接,则可以更有效地执行它。
- 我们不能在同一 SQL 语句的子查询中修改表并从同一表中进行选择。
结论 :
子查询更容易编写,但服务器可能会更好地优化联合。例如,左外连接通常工作得更快,因为服务器对其进行了优化。