全部文档
文档中心DeepModel功能DeepQL常用语法与使用技巧DeepQL 5 分钟上手

DeepQL 5 分钟上手

如果你会写 SQL,那 DeepQL 对你来说就是「换了一种写法的 SQL」。本篇用 SQL 做对照,5 分钟带你写出第一批可用的查询。

SQL

DeepQL

SELECT order_no, status FROM orders

select Order { order_no, status }

WHERE status = 'confirmed'

filter .status = 'confirmed'

ORDER BY order_date DESC LIMIT 10

order by .order_date desc limit 10

JOIN customer ON ...

不需要 JOIN,直接 customer: { code, name }

最大的区别:DeepQL 不用写 JOIN——对象之间的关系(链接)已经在模型里定义好了,查询时直接「点」过去就行。

后文用一个简单的订单模型:

  • Order(订单头):order_no, order_date, status, customer→Customer

  • OrderLine(订单行):product_name, qty, price, order→Order

  • Customer(客户):code, name

关系:一个订单头有多条订单行,订单行通过 order 链接指向订单头;订单头通过 customer 链接指向客户。


Copy
select Order { order_no, order_date, status }

就这么简单。select 对象类型 { 要返回的字段 },字段用逗号分隔。

结果(JSON):

Copy
[
  { "order_no": "ORD001", "order_date": "2023-10-01", "status": "draft" },
  { "order_no": "ORD002", "order_date": "2023-10-02", "status": "confirmed" }
]

小技巧:不确定有哪些字段?用 select Order { * } limit 1 快速查看全部属性。

Copy
select Order { order_no, order_date, status }
filter .status = 'confirmed' and .order_date > <cal::local_date>'2023-01-01'
order by .order_date desc
limit 10
offset 0

和 SQL 的 WHERE / ORDER BY / LIMIT 一一对应,只是关键字不同:

SQL

DeepQL

说明

WHERE

filter

条件里字段前加 .(表示「当前对象的」)

AND / OR / NOT

and / or / not

完全一样

ORDER BY a, b

order by .a then .b

多字段用 then 而非逗号

LIMIT / OFFSET

limit / offset

完全一样

这是 DeepQL 最爽的地方——不用写 JOIN,直接在大括号里展开关联对象

查订单行,顺便带出订单头信息(正向链接):

Copy
select OrderLine {
    product_name,
    qty,
    price,
    order: { order_no, order_date }
}

等价于 SQL 的 SELECT ... FROM order_line JOIN orders ON ...,但你只需要写 order: { ... } 就完成了关联。

反过来:查订单头,带出它下面所有的订单行(反向链接):

Copy
select Order {
    order_no,
    lines := .<order[is OrderLine] {
        product_name, qty, price
    }
}

.<order[is OrderLine] 读作「通过 order 链接指向我的 OrderLine」。结果是嵌套的 JSON——每个订单头里包含一个订单行数组:

Copy
[
  {
    "order_no": "ORD001",
    "lines": [
      { "product_name": "商品A", "qty": 2, "price": 50.00 },
      { "product_name": "商品B", "qty": 1, "price": 99.00 }
    ]
  }
]

:= 在结果里添加计算字段,和 SQL 的 AS 类似:

Copy
select OrderLine {
    product_name,
    qty,
    price,
    line_amount := .qty * .price
}

也可以对关联数据做计算:

Copy
select Order {
    order_no,
    customer_name := <str>.customer.name['zh-cn'],
    line_count    := count(.<order[is OrderLine])
}

从外部(Python 等)传入参数,用 $参数名,前面加类型标注:

Copy
select Order { order_no, status }
filter .status = <str>$status

Python 调用:

Copy
dm.query(deepql, status="confirmed")

你想做的事

SQL 写法

DeepQL 写法

查字段

SELECT a, b FROM t

select T { a, b }

条件

WHERE a = 1

filter .a = 1

排序

ORDER BY a DESC

order by .a desc

分页

LIMIT 10 OFFSET 20

limit 10 offset 20

关联查询

JOIN ... ON ...

link: { 字段 }

反向关联

子查询或反向 JOIN

.<link[is Type] { 字段 }

别名/计算列

expr AS alias

alias := expr

参数

WHERE a = ?

filter .a = <str>$param

聚合

COUNT(*), SUM(x)

count(集合), sum(集合.x)

分组

GROUP BY

group ... by → 详见第六章

以上 5 步已经足够应对大部分日常查询。需要更多能力时,按需阅读:

章节

内容

什么时候看

一、select 与形状

形状、Splat、自由对象

想了解 * / ** / 自由对象

二、条件与排序

filter 详解、UUID 过滤

需要复杂条件

三、链接

嵌套展开、结果拉平

需要多级关联或对比嵌套 vs 扁平

四、with 与参数

with 变量、参数类型、列表传参

需要复杂参数或子查询复用

五、子查询

in / detached / 属性关联

需要集合判断或无链接关联

六、分组与汇总

group / ROLLUP / CUBE

需要分组统计

七、表达式与函数

字符串、日期、条件、聚合

需要复杂计算

八、层级与树形

parent / 递归函数

需要处理树形结构

九、自省查询

schema 元数据查询

需要查数据字典

十、进阶

窗口函数、图查询

高级分析需求

回到顶部

咨询热线

400-821-9199

我们使用 ChatGPT,基于文档中心的内容以及对话上下文回答您的问题。

ctrl+Enter to send