关于 YMatrix
部署数据库
使用数据库
管理集群
最佳实践
高级功能
高级查询
联邦查询
Grafana 监控
备份恢复
灾难恢复
图数据库
管理手册
性能调优
故障诊断
工具指南
系统配置参数
SQL 参考
ORDER BY 是跟在 WITH 之后的子句。ORDER BY 指定输出应该排序以及如何排序。
注意,你不能对节点或关系进行排序,排序必须在属性上进行。ORDER BY 依赖比较来对输出进行排序。参见值的排序和比较。
在变量作用域方面,ORDER BY 遵循特殊规则,取决于投影的 RETURN 或 WITH 子句是聚合还是 DISTINCT。如果是聚合或 DISTINCT 投影,则只有投影中可用的变量可用。如果投影不改变输出基数(聚合和 DISTINCT 会改变),则投影子句之前可用的变量也可用。当投影子句遮蔽已存在的变量时,只有新变量可用。
最后,如果聚合表达式未在投影子句中列出,则不允许在 ORDER BY 子句中使用。此规则确保 ORDER BY 不会更改结果,只更改结果的顺序。
注意!
在YMatrix AGE中,order by 不保证全局有序。因此order by + limit不保证取全局有序的前三个。 如果需要保证全局有序,需要在 ORDER BY 之前使用 WITH 语句。
RETURN p ORDER BY p.age LIMIT 3, 每个 segment 各自排序取前 3,最终结果不一定是全局的前 3。WITH p ORDER BY p.age LIMIT 3 RETURN p, WITH 会触发数据汇聚(Motion 节点),在汇聚后做全局排序再取前 3。
ORDER BY 用于对输出进行排序。
查询
SELECT *
FROM cypher('graph_name', $$
MATCH (n)
WITH n.name as name, n.age as age
ORDER BY n.name
RETURN name, age
$$) as (name agtype, age agtype);
节点按名称排序返回。
结果
| name | age |
|---|---|
| "A" | 34 |
| "B" | 34 |
| "C" | 32 |
| (1 row) |
你可以通过在 ORDER BY 子句中列出每个变量来按多个属性排序。Cypher 将按列出的第一个变量排序,对于相等的值,转到 ORDER BY 子句中的下一个属性,依此类推。
查询
SELECT *
FROM cypher('graph_name', $$
MATCH (n)
WITH n.name as name, n.age as age
ORDER BY n.age, n.name
RETURN name, age
$$) as (name agtype, age agtype);
返回节点,先按年龄排序,然后按名称排序。
结果
| name | age |
|---|---|
| "C" | 32 |
| "A" | 34 |
| "B" | 34 |
| (1 row) |
在排序变量后添加 DESC[ENDING],排序将以逆序进行。
查询
SELECT *
FROM cypher('graph_name', $$
MATCH (n)
WITH n.name AS name, n.age AS age
ORDER BY n.name DESC
RETURN name, age
$$) as (name agtype, age agtype);
该示例返回按名称逆序排列的节点。
结果
| name | age |
|---|---|
| "C" | 32 |
| "B" | 34 |
| "A" | 34 |
| (3 rows) |
排序结果集时,升序排序中 null 始终排在结果集末尾,降序排序中排在最前面。
查询
SELECT *
FROM cypher('graph_name', $$
MATCH (n)
WITH n.name AS name, n.age AS age, n.height AS height
ORDER BY n.height
RETURN name, age, height
$$) as (name agtype, age agtype, height agtype);
节点按 height 属性排序返回,没有该属性的节点排在最后。
结果
| name | age | |
|---|---|---|
| "A" | 34 | 170 |
| "C" | 32 | 185 |
| "B" | 34 | |
| (3 rows) |