SQL 中的 FROM 不应该放在 SELECT 前面吗?(2011)

SQL 是否应该把 `FROM` 放在 `SELECT` 前面,触及查询语言如何在可读性、执行语义与工具支持之间取得平衡。评论者指出,当前这种类似英语的 `SELECT ... FROM ...` 语法会妨碍自动补全等功能,并掩盖逻辑执行顺序;而 LINQ、Kusto、PRQL 以及 DuckDB 的扩展等替代方案表明,`FROM` 优先或流水线式写法可能更符合人体工学。另一些人则认为,SQL 的历史悠久、生态锁定,以及它最初就是为让非工程师也能理解而设计的,意味着激进的语法变更不太可能发生;更现实的路径可能是改进工具,或提供配套的 DSL。

FROM 与 SELECT 的顺序

  • 许多人认为 FROM … SELECT … 更符合人们的思考方式:先定义数据源,再过滤/分组,最后投影列。
  • 支持者表示,这种写法更贴近查询的实际执行方式,也会让大型、复杂的 SQL 文件更容易管理,并更容易在 ذهن中建模。
  • 也有人为 SELECT … FROM … 辩护,认为它先从“命令”开始(select/insert/update/delete),符合语句的分类方式,也更便于在文件中扫描。
  • 两边都有人引用“更像英语”的理由:简单查询读起来像“从 Y 中选择 X”,但更复杂、包含多步骤的语句,或许用 from 放前面更合适。

工具、自动补全与 IDE 体验

  • 一个反复出现的抱怨是:在 SELECT 先写的情况下,IDE 必须等到 FROM 写出后,才能提供列名补全。
  • FROM 优先的语法(LINQ、Kusto/KQL、PRQL、DuckDB 的可选 FROM-first 模式、NRQL、ABAP OpenSQL)被赞赏为更利于智能提示,以及分步骤、可组合式查询。
  • 有人认为更智能的 IDE 可以绕过现有 SQL 的限制,但也有人认为,语言层面的支持在易用性上仍然是很大的提升。

执行顺序与语法顺序

  • 几条评论对比了 SQL 的词法顺序(SELECTFROMWHERE → …)与其“逻辑”处理顺序(FROMWHEREGROUP BYHAVINGSELECTORDER BY)。
  • 这种不一致被视为教学和心智模型上的痛点,尤其对新手而言,他们会以为更早出现的子句能“看到”更晚出现的子句。

安全性与 UPDATE 语法

  • UPDATE … SET … WHERE … 让很多人警惕,因为 SETWHERE 之前;人们担心一不小心漏掉 WHERE
  • 常见缓解办法包括:先写 WHERE,先写成 SELECT 做原型再转换为 UPDATE,以及使用显式事务(BEGIN/ROLLBACK,或会警告无 WHERE 更新的工具)。

设计目标、英语化与替代方案

  • 有人把 SQL 描述为古老、受英语影响、为非技术用户设计;其怪异之处则因为网络效应而一直保留。
  • 若干评论建议,SQL“够用”但在组合性上很笨拙,因此主张使用专门的查询语言,或编译到 SQL 的 DSL(PRQL、SaneQL、HoneySQL、类似 Datalog 的系统、QUEL 风格语法)。
  • 也有人认为数据库应该面向人提供 SQL,面向机器提供另一个更结构化的 API。