sql - INNER JOIN 中的表顺序
问题描述
阅读 Alan Beaulieu 的《Learning SQL》一书。关于内部联接的主题,它告诉无论 INNER JOIN 中表的顺序是什么,结果都是相同的,并给出如下理由:
如果您对帐户/员工/客户查询的所有三个版本产生相同结果的原因感到困惑,请记住 SQL 是一种非过程语言,这意味着您描述了要检索的内容以及需要涉及哪些数据库对象,但由数据库服务器决定如何最好地执行您的查询。使用从您的数据库对象中收集的统计信息,服务器必须选择三个表中的一个作为起点(所选表此后称为驱动表),然后决定以何种顺序连接其余表。因此,表出现在 from 子句中的顺序并不重要。
那么这是否意味着如果从数据库对象收集的统计数据发生变化,那么结果也会发生变化?
解决方案
那么这是否意味着如果从数据库对象收集的统计数据发生变化,那么结果也会发生变化?
不会。相同的查询将始终产生相同的结果(当然,前提是基础数据相同)。作者解释的是,数据库可以选择一种或另一种策略来处理查询(从一个或另一个表开始,使用这个或那个算法来连接行,等等)。该决定是基于许多因素做出的,其中一些是基于统计数据中可用的信息。
关键是 SQL 是一种声明性语言,而不是过程性语言:您无法选择数据库如何处理查询,您只需告诉它您想要什么结果。
但是,无论数据库选择哪种算法,都保证结果是一致的。
请注意,在某些极端情况下,数据库不保证连续执行同一查询的结果相同(例如没有行限制子句但没有 的查询order by
):客户端有责任提供其结果的查询被正确定义(如果你真的想的话,语言确实给了你足够的绳索来吊死自己)。
推荐阅读
- java - 如何将 SQL 转换为具有联合和内连接的 HQL?
- javascript - 旋转画布内的蒙版图像
- python-3.x - 有没有办法将数据从数据库输出到 tkinter 列表框?
- gdb - Gdb 无法连接到 stm32 上的 OpenOCD
- python-3.x - TensorFlow 无效形状(InvalidArgumentError)
- powershell - 使用 PowerShell 调用 cmd.exe,异步生成多个实例。不要等待 cmd.exe 关闭
- discord.js - 如何修复“提供的参数既不是用户也不是角色”。
- javascript - 如何在 A-Frame 中离线使用库存字体?
- python - 如何用列表中的单词制作二进制熊猫矩阵?
- amazon-web-services - 具有其他实例类型的 Auto Scaling 组无法在 AWS 上运行