天天看點

MDX和SQL差別

開始學習OLAP相關的知識,學習cube、hierarchy、level、member、drill、dimension、measure等等專業名詞的含義,又接觸了類sql的一個資料抽取文法:MDX,在wordpress上,找到一遍比較詳細的介紹MDX與SQL差別的文章。

原文:http://codex.wordpress.org.cn/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 本來意圖是為了提供一種查詢多元資料的簡單而有效的方法,是以它采用了一緻且易于了解的方式使使用者認清二維查詢和多元查詢在概念上的差別。