Skip to content

自定义 SQL:当标准查询不够用时,把复杂查询交给数据库

很多业务系统在早期都能靠标准的数据集 API 跑起来,但一旦进入报表、分析、跨表查询这些场景,问题就会马上出现:前端要发多次请求,后端要写很多拼装代码,最后只是为了拿到一张统计表或一个排行榜。

自定义 SQL 想解决的,就是这类“标准查询不够用,但又不值得为此重写一套后端”的问题。它让开发者把复杂查询直接交给数据库完成,再通过 Lovrabet 平台统一管理和调用。

图片展示了自定义SQL的流程,当标准API不够用时,用SQL一次拿到结果…

自定义 SQL 是什么

自定义 SQLLovrabet 提供的数据查询扩展能力。你可以在平台中保存一段 SQL,并在前端、服务端或 Backend Function 里按需调用它。

它不是用来替代标准 API,而是补上标准 API 不擅长的那部分能力,比如:

  • 跨表关联查询
  • 聚合统计和分组分析
  • 多条件组合筛选
  • 排行榜、趋势图、经营报表

换句话说,标准 API 负责常规的数据读写,自定义 SQL 负责更复杂、更贴近分析场景的数据查询。

它主要解决什么问题

企业里真正让人头疼的,往往不是“查一条数据”,而是“把多张表里的业务信息一次查明白”。

常见场景包括:

  • 订单列表里,除了订单本身,还要带出客户名、商品名、支付状态
  • 销售报表里,要按时间、地区、商品做汇总统计
  • 运营分析里,要根据日期范围、状态、关键词等多个条件灵活组合查询

如果只靠标准 API,这类需求通常意味着多次请求、前端拼装、重复计算。逻辑一复杂,代码会迅速膨胀,查询性能也容易变差。

而自定义 SQL 的做法更直接:让数据库一次把结果查好,应用层只负责展示和使用结果。

为什么需要它

从产品能力上看,标准 API 已经能覆盖大量日常场景;但企业系统真正有价值的数据结果,很多都来自“关联、聚合、统计、筛选”这类复杂查询。也正因为如此,自定义 SQL 才是很多项目从“能用”走向“好用”的关键补充。

它的价值主要体现在四点:

  • 查询更直接:原本需要多次请求和手动拼装的数据,可以一次拿到
  • 性能更合适:聚合和关联放在数据库层执行,通常比前端或业务层拼装更高效
  • 复用更容易:一段 SQL 在平台统一管理,多个页面和接口可以复用
  • 边界更清晰:标准 API 处理通用读写,自定义 SQL 处理复杂查询,职责不会混在一起

所以,自定义 SQL 不是“多一种写法”,而是在复杂查询场景下,用更合适的方式解决问题。

一个最常见的 Demo

以“销售排行榜”为例。业务想要看到某个时间范围内,销量最高的商品 Top 10。

如果走普通接口,往往要先查订单、再查订单明细、再查商品信息,最后在应用层自己做汇总和排序。

如果使用自定义 SQL,这件事可以直接交给数据库:

SQL
SELECT
  p.product_name,
  SUM(oi.quantity) AS totalQuantity,
  SUM(oi.subtotal) AS totalAmount
FROM dataset_order_items oi
JOIN dataset_orders o ON oi.order_id = o.id
JOIN dataset_products p ON oi.product_id = p.id
WHERE o.order_date >= #{startDate}
  AND o.order_date <= #{endDate}
GROUP BY p.product_name
ORDER BY totalAmount DESC
LIMIT 10

前端或服务端只需要调用这段 SQL:

TypeScript
const result = await client.sql.execute({
  sqlCode: "sales-ranking",
  params: {
    startDate: "2024-01-01",
    endDate: "2024-12-31",
  },
});

if (result.execSuccess && result.execResult) {
  console.log(result.execResult);
}

这样,页面拿到的就已经是可直接展示的排行榜结果,而不是一堆还要继续加工的原始数据。

写在最后

很多时候,企业并不缺数据,而是缺少一种把复杂数据结果高效提取出来的方式。自定义 SQL 的意义,就在于把这部分能力从繁琐的数据拼装中解放出来,让开发者用最熟悉的 SQL,把真正有业务价值的结果直接查出来。

这篇文章只回答“它是什么、解决什么问题、为什么需要它”。如果你想继续看具体的创建方式、参数写法、动态 SQL、调用细节和排错方法,可以继续阅读后面的专题文档。

继续阅读

基于飞书知识库同步生成,内容以飞书源文档为准