首页 > 解决方案 > INNER JOIN 中的表顺序

问题描述

阅读 Alan Beaulieu 的《Learning SQL》一书。关于内部联接的主题,它告诉无论 INNER JOIN 中表的顺序是什么,结果都是相同的,并给出如下理由:

如果您对帐户/员工/客户查询的所有三个版本产生相同结果的原因感到困惑,请记住 SQL 是一种非过程语言,这意味着您描述了要检索的内容以及需要涉及哪些数据库对象,但由数据库服务器决定如何最好地执行您的查询。使用从您的数据库对象中收集的统计信息,服务器必须选择三个表中的一个作为起点(所选表此后称为驱动表),然后决定以何种顺序连接其余表。因此,表出现在 from 子句中的顺序并不重要。

那么这是否意味着如果从数据库对象收集的统计数据发生变化,那么结果也会发生变化?

标签: sqljoininner-join

解决方案


那么这是否意味着如果从数据库对象收集的统计数据发生变化,那么结果也会发生变化?

不会。相同的查询将始终产生相同的结果(当然,前提是基础数据相同)。作者解释的是,数据库可以选择一种或另一种策略来处理查询(从一个或另一个表开始,使用这个或那个算法来连接行,等等)。该决定是基于许多因素做出的,其中一些是基于统计数据中可用的信息。

关键是 SQL 是一种声明性语言,而不是过程性语言:您无法选择数据库如何处理查询,您只需告诉它您想要什么结果。

但是,无论数据库选择哪种算法,都保证结果是一致的。

请注意,在某些极端情况下,数据库不保证连续执行同一查询的结果相同(例如没有行限制子句但没有 的查询order by):客户端有责任提供其结果的查询被正确定义(如果你真的想的话,语言确实给了你足够的绳索来吊死自己)。


推荐阅读