您可能已經聽說過 DB2 Viper 的新架構,這種架構支持表格和分層數據結構。實際上,前一篇文章已經總結了 DB2 中新的 XML 特性,描述了如何創建數據庫對象和用 XML 數據填充這些數據庫對象,並解釋了如何使用 SQL 和 SQL/XML 操作 XML 數據。本文繼續探索 DB2 XML 功能,這一次將焦點放在 DB2 對 XQuery 的新的支持上。
DB2 將 XQuery 當作最好的語言,允許用戶直接編寫 XQuery 表達式,而不是將 XQueries 封裝或嵌入到 SQL 語句中。而且,DB2 的查詢引擎是在本地處理 XQueries,這意味著它在解析、計算和優化 XQueries 之前不必在幕後將它們翻譯成 SQL。當然,如果您選擇編寫同時包括 XQuery 和 SQL 表達式的 “雙語bilingual)” 查詢,那麼 DB2 同樣會處理和優化這些查詢。
與 “用 SQL 查詢 DB2 XML 數據” 中對 SQL/XML 的描述一樣,本文也提到了一些常見的查詢任務,並告訴您如何使用 XQuery 來完成這些目標。不過首先我們還是簡要地考慮一下 XQuery 與 SQL 的不同之處。
關於 XQuery
XQuery 在很多關鍵方面都與 SQL 有所不同,這很大程度上是因為這兩種語言是針對兩種具有不同特征的數據模型而設計的。XML 文檔包含層次結構,並且有其固有的順序。而基於 SQL 的數據庫管理系統所支持的表格數據結構是平面的flat),並且是基於集合的;因此,行之間不存在順序。
這兩種數據模型的不同導致它們各自的查詢語言有很多基本的不同。例如,XQuery 支持路徑表達式,以允許程序員在 XML 的層次結構中導航,而純 SQL沒有 XML 擴展)則不支持。XQuery 支持有類型的和無類型的數據,而 SQL 數據總是以指定類型定義的。XQuery 沒有 null 值,因為 XML 文檔會忽略缺失的或未知的數據。當然,SQL 使用 null 來表示缺失的或未知的數據值。XQuery 返回一系列的 XML 數據,而 SQL 則返回各種 SQL 數據類型的結果集。
這只是 XQuery 和 SQL 之間的基本不同點中的一部分。提供一份詳盡的列表超出了本文的范圍,不過即將發表的 IBM Systems Journal 將更詳細地討論這些語言的不同。現在我們就探索一下 XQuery 語言的一些基本方面,並看看如何使用它來查詢 DB2 Viper 中的 XML 數據。
樣本數據庫
本文中的查詢訪問在 “DB2 Viper 快速入門”developerWorks,2006 年 4 月)中創建的樣本表。清單 1 給出了樣本數據庫中 “items” 和 “clients” 表的定義:
create table items (
id int primary key not null,
brandname varchar(30),
itemname varchar(30),
sku int,
srp decimal(7,2),
comments xml
)
create table clients(
id int primary key not null,
name varchar(50),
status varchar(10),
contactinfo xml
)
圖 1 中顯示了 “items.comments” 列中包含的樣本 XML 數據,而 圖 2 中則顯示了 “clients.contactinfo” 列中包含的樣本 XML 數據。隨後的例子查詢將引用這兩個 XML 文檔中的一個或兩個中的特定元素。
圖 1. 存儲在 “items” 表的 “comments” 列中的樣本 XML 文檔
圖 2. 存儲在 “clients” 表的 “contactinfo” 列中的樣本 XML 文檔