XQuery和SQL都是用于从数据中检索信息的查询语言,但它们面向的数据模型和使用方式存在明显区别。SQL服务于关系型数据库,数据以行和列的二维表形式存在;XQuery则面向XML文档,数据以树状的节点层次结构组织。两者在语法目标和核心能力上既有交集也有分野。

XQuery和SQL的相似之处
这两种语言都允许开发者描述想要什么数据,而不是一步步告诉引擎怎么拿。它们都具备以下共性:
- 都支持条件过滤,只返回满足条件的数据
- 都能对结果进行排序和分组
- 都支持连接操作,把多个数据源关联起来
- 都拥有函数库,可做字符串、数值和日期处理
简单的查询对照
假设我们有一张用户表,以及一份等价的用户XML。两者取年龄大于20的人名时,写法如下:
-- SQL查询 SELECT name FROM users WHERE age > 20;
(: XQuery查询 :) for $u in /users/user where $u/age > 20 return $u/name
XQuery和SQL的不同之处
数据模型差异
SQL操作的是严格模式的二维关系表,列类型固定;XQuery操作的是灵活的XML树,元素可嵌套、可缺失。SQL里用JOIN关联表,XQuery里用路径如/book/chapter/title直接下行。
语法结构差异
SQL是声明式关键字语言,以SELECT-FROM-WHERE为主干;XQuery基于XPath并引入FLWOR表达式(for、let、where、order by、return),更像是带查询能力的函数式语言。
| 对比维度 | SQL | XQuery |
|---|---|---|
| 目标数据 | 关系表 | XML文档 |
| 定位方式 | 表名与列名 | XPath路径 |
| 结果形态 | 行集合 | XML节点序列 |
代码示例:XML嵌套处理
XQuery可自然表达层次结构,下面统计每本书的章节数:
for $b in /library/book
return
<book-stat>
<title>{ $b/title/text() }</title>
<chapters>{ count($b/chapter) }</chapters>
</book-stat>
同样逻辑在SQL中需先拆成多表,再用GROUP BY聚合,无法原生保留文档形状。
何时选哪种
当数据已经在MySQL、PostgreSQL等关系库内,且结构稳定,SQL是天然选择。当系统间用XML报文通信,或配置、文档本身就是树状结构,XQuery能直接用路径抽取字段,避免先把XML转表再查。两者也可配合使用:用XQuery把XML转成关系数据,再交SQL分析。
简言之,SQL管表,XQuery管树;会SQL的人学XQuery,重点在建立路径与节点思维。