如果你会写 SQL,那 DeepQL 对你来说就是「换了一种写法的 SQL」。本篇用 SQL 做对照,5 分钟带你写出第一批可用的查询。
|
SQL |
DeepQL |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
不需要 JOIN,直接 |
最大的区别:DeepQL 不用写 JOIN——对象之间的关系(链接)已经在模型里定义好了,查询时直接「点」过去就行。
后文用一个简单的订单模型:
Order(订单头):order_no, order_date, status, customer→Customer
OrderLine(订单行):product_name, qty, price, order→Order
Customer(客户):code, name
关系:一个订单头有多条订单行,订单行通过 order 链接指向订单头;订单头通过 customer 链接指向客户。
select Order { order_no, order_date, status }
就这么简单。select 对象类型 { 要返回的字段 },字段用逗号分隔。
结果(JSON):
[
{ "order_no": "ORD001", "order_date": "2023-10-01", "status": "draft" },
{ "order_no": "ORD002", "order_date": "2023-10-02", "status": "confirmed" }
]
小技巧:不确定有哪些字段?用 select Order { * } limit 1 快速查看全部属性。
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 |
说明 |
|---|---|---|
|
|
|
条件里字段前加 |
|
|
|
完全一样 |
|
|
|
多字段用 |
|
|
|
完全一样 |
这是 DeepQL 最爽的地方——不用写 JOIN,直接在大括号里展开关联对象。
查订单行,顺便带出订单头信息(正向链接):
select OrderLine {
product_name,
qty,
price,
order: { order_no, order_date }
}
等价于 SQL 的 SELECT ... FROM order_line JOIN orders ON ...,但你只需要写 order: { ... } 就完成了关联。
反过来:查订单头,带出它下面所有的订单行(反向链接):
select Order {
order_no,
lines := .<order[is OrderLine] {
product_name, qty, price
}
}
.<order[is OrderLine] 读作「通过 order 链接指向我的 OrderLine」。结果是嵌套的 JSON——每个订单头里包含一个订单行数组:
[
{
"order_no": "ORD001",
"lines": [
{ "product_name": "商品A", "qty": 2, "price": 50.00 },
{ "product_name": "商品B", "qty": 1, "price": 99.00 }
]
}
]
用 := 在结果里添加计算字段,和 SQL 的 AS 类似:
select OrderLine {
product_name,
qty,
price,
line_amount := .qty * .price
}
也可以对关联数据做计算:
select Order {
order_no,
customer_name := <str>.customer.name['zh-cn'],
line_count := count(.<order[is OrderLine])
}
从外部(Python 等)传入参数,用 $参数名,前面加类型标注:
select Order { order_no, status }
filter .status = <str>$status
Python 调用:
dm.query(deepql, status="confirmed")
|
你想做的事 |
SQL 写法 |
DeepQL 写法 |
|---|---|---|
|
查字段 |
|
|
|
条件 |
|
|
|
排序 |
|
|
|
分页 |
|
|
|
关联查询 |
|
|
|
反向关联 |
子查询或反向 JOIN |
|
|
别名/计算列 |
|
|
|
参数 |
|
|
|
聚合 |
|
|
|
分组 |
|
|
以上 5 步已经足够应对大部分日常查询。需要更多能力时,按需阅读:
|
章节 |
内容 |
什么时候看 |
|---|---|---|
|
形状、Splat、自由对象 |
想了解 | |
|
filter 详解、UUID 过滤 |
需要复杂条件 | |
|
嵌套展开、结果拉平 |
需要多级关联或对比嵌套 vs 扁平 | |
|
with 变量、参数类型、列表传参 |
需要复杂参数或子查询复用 | |
|
in / detached / 属性关联 |
需要集合判断或无链接关联 | |
|
group / ROLLUP / CUBE |
需要分组统计 | |
|
字符串、日期、条件、聚合 |
需要复杂计算 | |
|
parent / 递归函数 |
需要处理树形结构 | |
|
schema 元数据查询 |
需要查数据字典 | |
|
窗口函数、图查询 |
高级分析需求 |
回到顶部
咨询热线
