SQL 和 MDX 比较
________________________________________
多维表达式 (MDX) 语法乍看起来与结构化查询语言 (SQL) 的语法非常相似。在很多方面,MDX 所提供的功能也与 SQL 相似;甚至经过努力可以在 SQL 中复制某些由 MDX 提供的功能。
然而,SQL 和 MDX 之间存在一些显著区别,并且用户应当从概念上认清这些区别。以下信息将从 SQL 开发人员的角度,对认清 SQL 和 MDX 之间概念上的区别提供指导。
SQL 和 MDX 之间最显著的区别在于 MDX 具有引用多个维度的能力。尽管在 Microsoft® SQL Server™ 2000 Analysis Services 中存在单独使用 SQL 查询多维数据集的可能性,但是 MDX 所提供的命令却可以专门检索具有几乎任意多个维度的多维数据结构中的数据。
SQL 处理查询时仅涉及列和行这两个维度。因为 SQL 只设计用来处理二维表格格式数据,所以"列"和"行"这两个术语在 SQL 语法中具有意义。
比较而言,MDX 在查询中则可处理一个、两个、三个或更多的维度。因为 MDX 中可以使用多个维度,所以每个维度称作一个轴。MDX 中的"列"和"行"这两个术语在 MDX 查询中仅用作前两个轴维度的别名;还有其它指派了别名的维度,但对于 MDX 这些别名本身没有真实意义。MDX 支持这些别名是为了显示;许多 OLAP 工具不能显示具有两个以上维度的结果集。
在 SQL 中,SELECT 子句用于定义查询的列布局,而 WHERE 子句用于定义行布局。可是在 MDX 中 SELECT 子句可用于定义几个轴维度,而 WHERE 子句可用来多维数据限制于特定的维度或成员。
在 SQL 中,WHERE 子句用于筛选查询所返回的数据。在 MDX 中,WHERE 子句用于提供查询所返回的数据切片。虽然这两个概念相似,却不可等同。
SQL 查询使用 WHERE 子句包含应该或不应该在结果集中返回的项目的任意列表。虽然筛选中长的条件列表可以缩小所检索数据的范围,但是不要求子句中的元素必须产生清晰而简洁的数据子集。
然而在 MDX 中,切片的概念意味着 WHERE 子句中的各个成员标识来自不同维度的数据的不同部分。由于多维数据的结构化结构,不可能请求同一维度的多个成员的切片。因为这一点,MDX 中的 WHERE 子句能提供清晰而简洁的数据子集。
创建 SQL 查询的过程也与创建 MDX 查询的过程不同。SQL 查询的创建者将二维行集的结构形象化并加以定义,并且编写对一个或多个表的查询对该结构进行填充。相反,MDX 查询的创建者通常将多维数据集的结构形象化并加以定义,并且编写对单个多维数据集的查询对该结构进行填充。这可能导致多维数据集具有任意数量的维度,例如,可能存在一个维度的数据集。
SQL 结果集的视觉形象是直观的;集合是一个行与列组成的二维表格。但是,MDX 结果集的视觉形象就不直观。因为多维结果集可以有三个以上的维度,所以将该结构形象化比较困难。要在 SQL 中引用这些二维数据,在引用称为字段的单个数据单元时,可以使用适合于数据的任何方法,列名称和行的唯一标识均可。但是,MDX 在引用数据单元时,不管数据形成的是单个单元还是一组单元,都使用一种非常特定并且统一的语法。
尽管 SQL 和 MDX 具有相似的语法,但是 MDX 语法功能异常强大,而且,它可以非常复杂。然而,因为设计 MDX 本来意图是为了提供一种查询多维数据的简单而有效的方法,所以它采用了一致且易于理解的方式使用户认清二维查询和多维查询在概念上的区别