两种 SQL 查询构造器:数据导向与语法导向
来源: mechanicalrabbit.github.io
概述
这篇文章借 FunSQL.jl 说明查询构造器其实分成两类。表面上接口几乎相同,但把管道节点重新排序后,一类会改变查询语义,另一类毫无变化——差别在于管道里流动的究竟是数据还是 SQL 子句。
核心要点
- 同一段“取 100 名最年长男性患者”的查询,在 FunSQL、Active Record、Laravel、EF/LINQ 与 dbplyr 中写法几乎一致。
- 把 Order 与 Limit 移到 Where 之前:FunSQL、EF/LINQ、dbplyr 的结果会变,Active Record 与 Laravel 不变。
- 敏感于节点顺序的是数据导向构造器,它们的管道描述的是期望输出,节点处理的是假想的数据。
- 不敏感的构造器只是按顺序拼装 SQL 子句,因此重排管道对生成的 SQL 没有任何影响。
- SQL 语法强制 FROM→JOIN→WHERE→GROUP BY→HAVING→ORDER BY→LIMIT→SELECT 的固定顺序,任意管道只能靠嵌套子查询来映射。
- SQL-92 用“把查询嵌进下一个查询的 FROM”作为变通,代价是复杂查询层层嵌套、臃肿难读。
- 作者认为这正是数据导向构造器的价值:它不受子句顺序约束,能表达更自然的查询意图。
金句
SQL 语法有不少缺陷,包括僵硬的子句顺序、查询嵌套,以及 SELECT 子句荒谬的位置。
👍 0
👎 0
← 返回 Lobsters 首页