Hướng dẫn SQL & XQuery cho IBM DB2, Phần 7: Giới thiệu về XML và XQuery

Cơ sở của XML và truy vấn XML

Hướng dẫn này giới thiệu pureXML và XQuery, bắt đầu từ một tổng quan cơ bản của các đặc trưng và các lợi thế của kiểu dữ liệu XML, sau đó so sánh nó với các bảng quan hệ tiêu chuẩn. Rồi những người sử dụng được yêu cầu viết các XQuery để lấy ra các phần tử XML, lọc dữ liệu dựa vào các giá trị XML, biến đổi đầu ra XML, và sử dụng nhiều mệnh đề khác nhau để lựa chọn dữ liệu chính xác hơn. Hướng dẫn kết thúc bằng một phần về phối hợp XQuery và SQL. Hướng dẫn này là Phần 7 của loạt bài hướng dẫn SQL & XQuery cho IBM® DB2®. (Chú ý: bạn phải cài đặt DB2 9 để làm các bài tập thực hành trong hướng dẫn này.)

Jessica Cao, Chuyên viên phát triển các công cụ đào tạo, IBM

Jessica Cao là một sinh viên ngành Nghệ thuật - Khoa học và ngành Khoa học máy tính tại Trường đại học McMaster. Chị sẽ tốt nghiệp văn bằng kép hạng danh dự vào tháng Tư 2009. Jessica đang làm việc trong chương trình hỗ trợ và lập kế hoạch kênh kỹ năng quản lý thông tin DB2 của phòng thí nghiệm IBM Toronto, nhằm chuyên chú sâu hơn vào lập trình, biên tập và kỹ năng viết



Bruce Creighton, Chuyên viên lập kế hoạch các phần kỹ năng, IBM

Bruce Creighton là chuyên viên lập kế hoạch các phần kỹ năng trong khoa Phát triển và Lập kế hoạch đào tạo Quản lý thông tin. Với vai trò này, ông lập kế hoạch đầu tư về nội dung đào tạo và cân bằng đầu tư giữa các lĩnh vực mà IBM có thu lợi nhuận với các lĩnh vực mà tại đó yêu cầu về phát triển các kỹ năng là quan trọng, cần cung cấp đào tạo miễn phí



Pat Moffatt, Giám đốc Chương trình quản lý thông tin, Sáng kiến học đường, IBM

Pat Moffatt là giám đốc Chương trình quản lý thông tin thuộc Sáng kiến học đường IBM. Thông qua chương trình sáng kiến học đường này, bà muốn làm ra sẵn những nguồn tài nguyên thích hợp phục vụ giảng dạy về quản lý thông tin để giúp các giảng viên đại học tích hợp chủ đề phần mềm quản lý thông tin vào trong chương trình đào tạo của họ



20 05 2009

Trước khi bạn bắt đầu

Về loạt bài này

Loạt bài hướng dẫn này dạy các chủ đề SQL từ cơ bản đến nâng cao và các chủ đề XQuery cơ bản. Nó cũng chỉ ra cách diễn đạt các câu hỏi nghiệp vụ thường gặp bằng các truy vấn cơ sở dữ liệu sử dụng các câu truy vấn SQL hay các câu truy vấn XQuery. Những người phát triển ứng dụng và những người quản trị cơ sở dữ liệu có thể sử dụng hướng dẫn này để nâng cao các kỹ năng truy vấn cơ sở dữ liệu của mình. Các thành viên tham gia sáng kiến học đường IBM có thể sử dụng loạt hướng dẫn này như một phần trong chương trình giảng dạy cơ sở dữ liệu của họ.

Tất cả các ví dụ trong bài này là dựa trên Aroma, một cơ sở dữ liệu mẫu chứa các dữ liệu doanh thu về các sản phẩm cà phê và chè đã bán trong các cửa hàng trên khắp nước Mỹ. Mỗi ví dụ gồm có ba phần:

  • Một câu hỏi kinh doanh dưới dạng ngôn ngữ thường ngày
  • Một hoặc nhiều ví dụ truy vấn , được biểu diễn bằng SQL hay Xquery
  • Một bảng các kết quả trả về từ cơ sở dữ liệu

Hướng dẫn này được thiết kế để cho phép các học viên học tập ngôn ngữ SQL và XQuery. Cũng như học bất cứ cái gì khác, việc bổ sung thêm các bài tập thực hành là rất quan trọng. Dữ liệu và các định nghĩa bảng sẽ tạo điều kiện thuận lợi cho các bài tập thực hành này.

Đối với các sinh viên sử dụng tài liệu này như một phần của khoá học, hãy nhận từ thầy hướng dẫn của mình các chỉ dẫn để kết nối tới cơ sở dữ liệu Aroma và tìm hiểu mọi sự khác biệt giữa hướng dẫn và cài đặt tại máy cục bộ của mình.

Hướng dẫn này được viết cho Express-C 9 DB2 trên nền UNIX®, Linux® và Windows® (trước đây gọi là Viper).

Về hướng dẫn này

Hướng dẫn này giới thiệu cho người đọc làm quen với pureXML và XQuery. Vị trí duy nhất nơi XML được sử dụng trong cơ sở dữ liệu Aroma là các cột Comments. Cột này được đề cập trong Phần 1 của loạt bài này và đó là trọng tâm của hướng dẫn này, Phần 7.

Hướng dẫn này bắt đầu với một tổng quan cơ bản của các đặc trưng và lợi thế của kiểu dữ liệu XML, sau đó so sánh nó với các bảng quan hệ tiêu chuẩn. Hướng dẫn này yêu cầu người đọc viết các XQuery để lấy ra các phần tử XML, lọc dữ liệu dựa vào các giá trị XML, biến đổi đầu ra XML, và sử dụng nhiều mệnh đề khác nhau để lựa chọn dữ liệu chính xác hơn. Hướng dẫn này kết thúc bằng một phần về phối hợp XQuery và SQL và kết hợp sức mạnh của cả hai ngôn ngữ đó.

Kết nối tới một cơ sở dữ liệu

Bạn cần kết nối tới một cơ sở dữ liệu trước khi có thể sử dụng các câu lệnh SQL để truy vấn hay xử lý dữ liệu. Lệnh CONNECT kết hợp một kết nối cơ sở dữ liệu với một tên người sử dụng.

Thông qua người hướng dẫn tìm ra tên cơ sở dữ liệu bạn cần nối tới. Đối với loạt bài này, tên cơ sở dữ liệu là aromadb.

Để kết nối tới cơ sở dữ liệu aromadb, gõ lệnh sau đây vào trong bộ xử lý dòng lệnh DB2:

CONNECT TO aromadb USER userid USING password

Thay thế "userid" và "password" bằng số ID và mật khẩu của người sử dụng mà bạn đã nhận được từ thầy hướng dẫn. Nếu máy không hỏi userid và password thì chỉ cần gõ vào lệnh sau đây:

CONNECT TO aromadb

Thông điệp sau báo cho bạn biết rằng đã tạo kết nối thành công:

Database Connection Information
Database server      = DB2/NT 9.0.0
SQL authorization ID = USERID
Local database alias = AROMADB

Khi đã kết nối được, bạn có thể bắt đầu sử dụng cơ sở dữ liệu.


Về XML

XML là gì?

XML...

  • là chuẩn để trao đổi dữ liệu giữa các hệ thống, các nền tảng, các ứng dụng, và các tổ chức khác nhau
  • độc lập với nhà cung cấp và nền tảng
  • có độ linh hoạt cao
  • phù hợp với tổ hợp bất kỳ các dữ liệu có cấu trúc, không có cấu trúc và nửa cấu trúc
  • dễ dàng mở rộng -- có thể định nghĩa các thẻ mới khi cần
  • có thể dễ dàng được biến đổi thành XML "khác" và thậm chí thành các định dạng khác như HTML
  • có thể dễ dàng được kiểm tra về sự tuân theo một lược đồ

Tất cả những điều này có thể thực hiện được thông qua nhiều công cụ và tiêu chuẩn có sẵn, như các bộ phân tách XML, XSLT, và lược đồ XML. Chúng giải phóng các ứng dụng khỏi gánh nặng giải quyết những nét đặc biệt của các định dạng dữ liệu độc quyền sở hữu. Trong một thời đại mà các định dạng thông báo, các biểu mẫu nghiệp vụ và các dịch vụ thường xuyên thay đổi, XML làm giảm chi phí và thời gian cần thiết để duy trì lôgíc ứng dụng một cách tương ứng.

Ngoài việc sử dụng XML để trao đổi dữ liệu, các doanh nghiệp đang giữ một số lượng lớn các dữ liệu kinh doanh quan trọng theo định dạng XML. Điều này có nhiều lý do:

  • Một số doanh nghiệp phải giữ lại các tài liệu XML theo định dạng nguyên bản của chúng để kiểm toán và tuân thủ các quy định, ví dụ các tài liệu tài chính và tư pháp cũng như eForms (biểu mẫu điện tử), đặc biệt trong khu vực chính phủ
  • XML có thể là một mô hình dữ liệu thích hợp hơn so với một lược đồ quan hệ. Điều này không chỉ đúng cho các ứng dụng hướng nội dung mà còn cho cả một số ứng dụng hướng dữ liệu nhất định,
    ví dụ, trong các ứng dụng khoa học đời sống, dữ liệu về bản chất có độ phức tạp và có cấu trúc thứ bậc rất cao và lại còn có thể chứa một lượng đáng kể các thông tin không có cấu trúc. Hầu hết dữ liệu về hệ gen hiện nay vẫn còn được lưu giữ theo các định dạng tệp tin phẳng độc quyền sở hữu, nhưng đang có các nỗ lực để thực hiện chuyển chúng sang XML.

Các cơ sở dữ liệu quan hệ đang tạo cơ hội hỗ trợ về lưu trữ, xử lý, tìm kiếm, và lấy ra dữ liệu XML. Điều này thường dựa vào việc lưu trữ các tài liệu XML trong các LOB hoặc chia nhỏ và sắp xếp XML vào một lược đồ quan hệ.

Các giải pháp này có các hạn chế cố hữu về chức năng và hiệu năng. Nói chung, việc lưu trữ dựa vào LOB cho phép chèn vào và lấy ra toàn bộ tài liệu nhanh chóng nhưng phải chịu một hiệu năng thấp khi thực hiện tìm kiếm và trích ra, do phải phân tách XML trong khi thực hiện truy vấn. Điều này có thể được cải thiện chút ít nếu các chỉ mục được tạo ra khi chèn tài liệu vào cơ sở dữ liệu. Khi việc tạo chỉ mục đã gánh chịu công việc phân tách XML nói ở trên, nó có thể tăng tốc độ các truy vấn để tìm kiếm các tài liệu phù hợp với các điều kiện tìm kiếm đã cho. Tuy vậy, việc trích ra các đoạn tài liệu và việc cập nhật ở mức dưới tài liệu vẫn đòi hỏi việc phân tách XML tốn kém.

Trong các phần trước của loạt bài hướng dẫn này, bạn đã học về SQL bao gồm lệnh SELECT và ngôn ngữ định nghĩa dữ liệu (DDL). XML là một cách tổ chức dữ liệu khác và sử dụng XQuery hay XPath để truy vấn dữ liệu.

Dữ liệu quan hệ được trình bày như là các hàng và các cột dữ liệu theo định dạng bảng. Dữ liệu XML bao gồm các thẻ và dữ liệu gắn với nhau.

Dữ liệu mẫu

		<Comments>
		    <comment>
		        <comment_ID>5301</comment_ID>
		        <customer_info>
		            <fname>Scott</fname>
		            <lname>Phillips</lname>
		            <email>Scott_Phillips@hotmail.com</email>
		        </customer_info>
		        <feedback>
		            <type>opinion</type>
		            <content>Gold Tips was highly enjoyable!</content>
		        </feedback>
		        <store_rating>
		            <score>5</score>
		            <out_of>5</out_of>
		        </store_rating>
		        <store_response>
		            <required>no</required>
		        </store_response>
		    </comment>
		    <comment>
		        <comment_ID>5302</comment_ID>
		        <customer_info>
		            <fname>Barbara</fname>
		            <lname>Adams</lname>
		            <phone>6138617611</phone>
		        </customer_info>
		        <feedback>
		            <type>question</type>
		            <content>What are the top teas brands?</content>
		        </feedback>
		        <store_rating>
		            <score>4</score>
		            <out_of>5</out_of>
		        </store_rating>
		        <store_response>
		            <required>yes</required>
		            <completed>yes</completed>
		            <action>Please see our "All About Tea" 
		            page at www.aroma.com/tea</action>
		        </store_response>
		    </comment>
		</Comments>

Chỉ dựa vào một mình dữ liệu mẫu, bạn có thể xác định địa chỉ email của Scott Phillips không? Đơn giản là dò theo các mức phân cấp được tạo ra bởi các thẻ lồng vào nhau. Vì XML lưu các thẻ và dữ liệu cùng với nhau, nên dữ liệu tự miêu tả và dễ hiểu.

DB2 9

DB2 9 là máy chủ dữ liệu lai đầu tiên, mức công nghiệp để quản lý dữ liệu theo cả định dạng quan hệ lẫn định dạng pureXML. DB2 đã có các tính năng cao trong lưu trữ và truy nhập dữ liệu quan hệ dựa trên SQL tiêu chuẩn và tối ưu lưu trữ dữ liệu, ví dụ như các kỹ thuật phân vùng dữ liệu, chỉ mục cao cấp và tối ưu hóa truy vấn. Bây giờ, DB2 đưa vào thêm một cơ chế lưu trữ dữ liệu được tối ưu hóa cho dữ liệu XML bên cạnh cơ chế quan hệ hiện có.

Những người phát triển ứng dụng bây giờ có thể lưu giữ dữ liệu XML trực tiếp bên trong một máy chủ DB2 và hưởng các lợi ích về các giao dịch, khả năng phục hồi nhanh dữ liệu cao cấp, truy nhập an toàn, và tất nhiên là khả năng tìm kiếm một số lượng lớn dữ liệu XML khi sử dụng XQuery.

Dữ liệu XML so với dữ liệu quan hệ

Ba thuộc tính cơ bản của XML làm cho nó khác với mô hình quan hệ:

  • XML là tự mô tả. Các tài liệu chứa đựng không chỉ dữ liệu, mà còn có siêu dữ liệu cần thiết. Kết quả là, một tài liệu XML có thể được tìm kiếm hay cập nhật không đòi hỏi một định nghĩa biểu đồ tĩnh. Các mô hình quan hệ, mặt khác, đòi hỏi các định nghĩa biểu đồ tĩnh hơn. Tất cả các hàng của một bảng phải có cùng lược đồ.
  • XML có phân cấp. Các tài liệu không chỉ trình bày thông tin cơ bản, mà còn cả thông tin về mối quan hệ của các mục dữ liệu với nhau dưới dạng phân cấp. Các mô hình quan hệ yêu cầu biểu diễn tất cả thông tin quan hệ hoặc bằng các mối quan hệ khóa chính hoặc khóa ngoài hay bằng cách trình bày thông tin đó trong bảng quan hệ khác.
  • XML là hướng chuỗi. Thứ tự sắp xếp là quan trọng. Mô hình quan hệ là hướng tập hợp, thứ tự sắp xếp không quan trọng.

Không cái nào trong số các điểm khác biệt ấy biểu thị rằng XML là tốt hơn hơn hay xấu hơn so với các mô hình quan hệ thuần túy. Thật ra, XML và mô hình quan hệ là các giải pháp bổ sung nhau. Một vài dữ liệu vốn đã phân cấp, trong khi dữ liệu khác lại có sẵn theo bảng; một số dữ liệu có lược đồ cứng, trong khi dữ liệu khác có lược đồ ít cứng nhắc hơn; một số dữ liệu cần tuân theo một thứ tự định trước trong khi dữ liệu khác lại không như vậy.

Khi nào sử dụng XML

Việc trình bày dữ liệu XML có ích trong các hoàn cảnh sau:

  • Khi lược đồ hay thay đổi.
    Nếu lược đồ của dữ liệu thường thay đổi, thì việc trình bày dữ liệu dưới dạng quan hệ có thể khá phiền hà do các chi phí và khó khăn khi thay đổi lược đồ quan hệ đi kèm. Bản chất tự mô tả của XML làm cho sự thay đổi lược đồ đơn giản hơn.
  • Khi dữ liệu vốn đã phân cấp.
    Một vài dữ liệu có sẵn theo bảng và một mô hình quan hệ làm cho nó có ý nghĩa hơn. Dữ liệu khác có phân cấp tự nhiên, và XML thường trình bày nó tốt nhất.
  • Khi dữ liệu trình bày các đối tượng nghiệp vụ trong đó các bộ phận hợp thành không còn có ý nghĩa nữa khi bị loại bỏ khỏi bối cảnh của chúng.
    Ví dụ, xem xét mối quan hệ thông thường giữa một nhân viên và số điện thoại của người đó, trong đó một nhân viên có thể có nhiều số điện thoại: một cho văn phòng, một cho Fax, một cho nhà, và một cho di động. Nếu mẫu sử dùng thường xuyên nhất là để lấy ra các số điện thoại trong bối cảnh của một nhân viên, thì chằng có ý nghĩa gì khi chuẩn hóa dữ liệu và đưa vào hẳn một bảng để theo dõi vô số các số điện thoại liên quan đến một nhân viên. Một sự lựa chọn tốt hơn có thể là giữ các số điện thoại ấy trong bảng nhân viên và trình bày chúng bằng XML.
  • Khi các ứng dụng có thuộc tính thưa.
    Một số ứng dụng có một số lượng lớn các thuộc tính có khả năng nhưng hầu hết các thuộc tính đó xuất hiện thưa thớt hay vắng mặt với bất kỳ mục dữ liệu đã cho nào. Một ví dụ kinh điển là một tài liệu danh mục hàng hóa của thương gia; số lượng các thuộc tính khác nhau để theo dõi một mục của tài liệu đã cho là rất lớn, bao gồm kích thước, màu, sắc, kiểu dệt và các yêu cầu về năng lực và một danh sách gần như vô tận về các khía cạnh khác. Đối với đối tượng đã cho bất kỳ, chỉ một tập con của các thuộc tính này có liên quan; kiểu dệt của một áo len làm cho nó có nghĩa nhưng kiểu dệt của một máy cắt cỏ thì chẳng có nghĩa gì. Việc sử dụng một bảng quan hệ để mô tả các đặc tính của đối tượng có thể chi phí đắt và quá phức tạp. Việc trình bày thông tin thuộc tính mô tả ấy như các dữ liệu XML cho phép trình bày tự nhiên hơn cũng như việc tìm kiếm ít phức tạp và ít tốn kém hơn.
  • Khi dữ liệu khối lượng nhỏ nhưng có cấu trúc cao.
    Trong nhiều ứng dụng, thông tin có cấu trúc là điều quyết định đối với ứng dụng nhưng nó tồn tại với số lượng rất nhỏ. Dù cho thông tin đó có thể được trình bày theo mô hình quan hệ bình thường, cách tiếp cận này có thể dẫn tới các lược đồ quan hệ cồng kềnh. Việc sử dụng một cột XML với nhiều khung nhìn có thể làm giảm đáng kể số các đối tượng được quản lý trong một cơ sở dữ liệu, và như vậy giảm bớt chi phí về quyền sở hữu.

Tạo ra một cơ sở dữ liệu có hỗ trợ XML

Trong Phần 1 của loạt tài liệu này, bạn đã tạo ra cơ sở dữ liệu Aroma của mình với một tệp tin batch. Vì bạn có thể muốn tạo ra các cơ sở dữ liệu riêng của mình trong tương lai, phần này hướng dẫn bạn cách tạo ra một cơ sở dữ liệu để hỗ trợ các đặc tính XML.

Tạo một cơ sở dữ liệu với Trung tâm điều khiển

Trong ứng dụng Trung tâm điều khiển DB2, nhấp chuột phải vào vào thư mục All Databases . ChọnCreate Databse -> Standard. Cửa sổ Create Database Wizard sẽ bật lên. Điền vào tên cơ sở dữ liệu của bạn và chọnt Enable database for XML.

Bộ mã XML
Bộ mã

Nhấp Next hai lần để đi tới màn hình Region. Đặt giá trị Country/Region tới giá trị thích hợp và thay đổi giá trị cài đặt bộ mã thành UTF-8. Nhấp UTF-8. Nhấp Finish để hoàn thành tạo ra sở dữ liệu của bạn.

Tạo ra một cơ sở dữ liệu với Bộ xử lý dòng lệnh

Để tạo ra cơ sở dữ liệu giống như vậy khi sử dụng CLP DB2, nhập vào mã sau đây:

db2 create db aromadb using codeset utf-8 territory us

Chú ý chỉ rõ UTF -8 làm bộ mã cho cơ sở dữ liệu. Việc sử dụng các đặc tính XML chỉ hạn chế cho các cơ sở dữ liệu nào được định nghĩa dùng bộ mã UTF-8 và chỉ có một phân vùng cơ sở dữ liệu. Khi tạo ra các cơ sở dữ liệu riêng của bạn trong tương lai, đừng quên tính đến tham số này.


Về cột comments

Trong cơ sở dữ liệu Aroma, bảngSales có một cột được gọi là Comments (các ý kiến góp ý).

Nó có thông tin sau :

  • Mã nhận diện của một góp ý (Comment ID)
  • Thông tin khách hàng: tên, thông tin tiếp xúc (điện thoại và/ hoặc email)
  • Trả lời của cửa hàng (Nếu yêu cầu)
  • Sự phản hồi của khách hàng: có thể hoặc là ý kiến, gợi ý hoặc câu hỏi
  • Đánh giá xếp hạng một cửa hàng theo 5 mức

Dữ liệu mẫu

<Comments>
    <comment>
        <comment_ID>5301</comment_ID>
        <customer_info>
            <fname>Scott</fname>
            <lname>Phillips</lname>
            <email>Scott_Phillips@hotmail.com</email>
        </customer_info>
        <feedback>
            <type>opinion</type>
            <content>Gold Tips was highly enjoyable!</content>
        </feedback>
        <store_rating>
            <score>5</score>
            <out_of>5</out_of>
        </store_rating>
        <store_response>
            <required>no</required>
        </store_response>
    </comment>
    <comment>
        <comment_ID>5302</comment_ID>
        <customer_info>
            <fname>Barbara</fname>
            <lname>Adams</lname>
            <phone>6138617611</phone>
        </customer_info>
        <feedback>
            <type>question</type>
            <content>What are the top teas brands?</content>
        </feedback>
        <store_rating>
            <score>4</score>
            <out_of>5</out_of>
        </store_rating>
        <store_response>
            <required>yes</required>
            <completed>yes</completed>
            <action>Please see our "All About Tea" page at www.aroma.com/tea</action>
        </store_response>
    </comment>
</Comments>

Tại sao là XML?

Các lợi thế của XML đã được bàn luận trong các phần trước đây, nhưng tại sao chọn XML trên các cột của bảng quan hệ trong trường hợp cụ thể này?

  • Tính linh hoạt:
    - các cửa hàng có thể yêu cầu thông tin đa dạng từ các khách hàng
    - theo thời gian, các cửa hàng có thể cải tiến phương pháp của họ để nhận được ý kiến phản hồi, như vậy dẫn đến các kiểu dữ liệu khác nhau
    - ví dụ, các khảo sát khuyến mại có thể khác với các khảo sát bán hàng thông thường; sự thay đổi này có thể dễ dàng được lưu trữ bằng XML chứ không phải bảng quan hệ
  • Sự khéo léo:
    - cấu trúc bảng không đòi hỏi thay đổi cùng với dữ liệu
  • Tự mô tả:
    - giám đốc/nhân viên của cửa hàng có thể hiểu các ý kiến góp ý của khách hàng dưới dạng XML mà không cần giải thích thêm
  • Sự phân cấp:
    - dữ liệu có phân cấp tự nhiên
    - thông tin khách hàng không có nghĩa nếu làm mất đi bối cảnh của ý kiến đóng góp

Các câu hỏi ví dụ

  • Các ý kiến góp ý được lưu trong cơ sở dữ liệu Aroma là gì?
  • Các ý kiến góp ý nhận được tại các cửa hàng New York là gì?
  • Các ý kiến góp ý nào yêu cầu cửa hàng trả lời? Những cái nào trong số các ý kiến này chưa được giải quyết (trả lời) xong ?
  • Hiển thị tất cả các ý kiến góp ý chưa được giải quyết trong một danh sách HTML.
  • Hiển thị tất cả các ý kiến góp ý và nhóm chúng lại thành ba loại khác nhau (bình luận, gợi ý và câu hỏi).
  • Đếm và hiển thị số lượng các ý kiến góp ý của mỗi kiểu.
  • Tính toán và hiển thị trung bình mức xếp hạng do tất cả ý kiến góp ý đưa ra.

Các lưu ý về cách dùng

Trong cơ sở dữ liệu Sales, cột comments chỉ có giá trị cho những hàng nào bắt đầu từ tháng Ba 2006.


Về XQuery

Trong các ví dụ trước đây, lệnh SELECT SQL được dùng để trích ra dữ liệu. Có thể thực hiện các truy vấn liên quan đến dữ liệu XML bằng ngôn ngữ truy vấn riêng của nó có tên là XQuery.

XQuery khác với SQL về một số phương diện then chốt, phần lớn là do các ngôn ngữ này được thiết kế để làm việc với các mô hình dữ liệu khác nhau, mà các mô hình này có các đặc tính khác nhau. Các tài liệu XML có chứa các mức phân cấp và sở hữu một thứ tự có sẵn. Các cấu trúc dữ liệu dạng bảng được các DBMS dựa trên SQL hỗ trợ là phẳng và dựa trên tập hợp; vì thế, các hàng không theo thứ tự.

Các sự khác nhau giữa các mô hình dữ liệu này dẫn đến một số khác biệt cơ bản trong các ngôn ngữ truy vấn riêng tương ứng của chúng. Bảng ở dưới liệt kê một vài ví dụ.

XQuerySQL
Hỗ trợ các biểu thức đường dẫn để cho phép các lập trình viên dẫn hướng thông qua cấu trúc phân cấp của XMLKhông hỗ trợ các biểu thức đường dẫn
Hỗ trợ cả hai dữ liệu có định kiểu và không định kiểuLuôn luôn được định nghĩa với một kiểu cụ thể
Không cần các giá trị NULL vì các tài liệu XML bỏ qua dữ liệu thiếu hoặc không được biếtSử dụng các giá trị NULL để thể hiện các giá trị thiếu hoặc không được biết
Trả về các chuỗi dữ liệu XMLTrả về các tập hợp kết quả của các kiểu dữ liệu SQL khác nhau

Hai loại biểu thức XQuery

Hướng dẫn này tập trung vào hai loại biểu thức XQuery quan trọng: các biểu thức "FLWOR" và các biểu thức đường dẫn.

Biểu thức FLWOR giống như một biểu thức SELECT-FROM-WHERE trong SQL -- nó được dùng để duyệt qua một danh sách các mục và trả về một vài thứ được tính toán từ mỗi mục tùy trường hợp. Mặt khác, một biểu thức đường dẫn, dẫn hướng thông qua hệ phân cấp của các phần tử XML và trả về các phần tử tìm thấy ở cuối đường dẫn.

Giống như một biểu thức SELECT-FROM-WHERE trong SQL, biểu thức XQuery FLWOR có thể chứa vài mệnh đề bắt đầu bằng các từ khóa nhất định. Các từ khóa sau đây được dùng để bắt đầu các mệnh đề trong một biểu thức FLWOR:

1. forLặp lại một chuỗi nhập vào, chấp nhận một biến lần lượt cho mỗi danh mục nhập vào
2. letCông bố một biến và gán cho nó một giá trị. Giá trị này có thể là một danh sách có nhiều danh mục
3. whereChỉ rõ tiêu chuẩn lọc các kết quả truy vấn
4. order byChỉ rõ thứ tự phân loại kết quả
5. returnĐịnh kết quả được trả về

Một biểu thức đường dẫn trong XQuery gồm có một loạt các "bước", phân cách nhau bằng các ký tự dấu gạch nghiêng. Trong dạng đơn giản nhất của nó, mỗi bước dẫn hướng xuống dưới trong hệ phân cấp XML để tìm ra phần tử con của các phần tử do các bước trước trả về. Mỗi bước trong một biểu thức đường dẫn có thể cũng chứa một thuộc tính để lọc các phần tử do bước đó trả về, chỉ giữ lại các phần tử thỏa mãn một điều kiện nào đó.

Ví dụ, đối với dữ liệu mẫu cho trong phần trước, giả thiết rằng biến $comments gắn với một danh sách các tài liệu XML chứa các phần tử <comment> các phần tử, tiếp theo là biểu thức đường dẫn bốn bước $comments/comment/feedback[type = "suggestion"]/content sẽ trả về danh sách các nội dung về các ý kiến góp ý loại "suggestion" (gợi ý).

Trong nhiều trường hợp, có thể sử dụng hoặc một biểu thức FLWOR hoặc một biểu thức đường dẫn để viết một truy vấn.


Lấy ra các phần tử XML

Câu hỏi

Các ý kiến góp ý nào của khách hàng được lưu giữ trong cơ sở dữ liệu Aroma?

Ví dụ truy vấn FLWOR

xquery for $y in db2-fn:xmlcolumn('AROMA.SALES.COMMENTS')
return $y

Ví dụ truy vấn đường dẫn

xquery
db2-fn:xmlcolumn('AROMA.SALES.COMMENTS')

Hai truy vấn, có cùng kết quả

<Comments>
    <comment>
        <comment_ID>1</comment_ID>
        <customer_info>
            <fname>Christopher</fname>
            <lname>Davis</lname>
            <phone>4147301265</phone>
            <email>Christopher.D@hotmail.com</email>
        </customer_info>
        <feedback>
            <type>opinion</type>
            <content>The employee named Heather Gray was very helpful.</content>
        </feedback>
        <store_rating>
            <score>5</score>
            <out_of>5</out_of>
        </store_rating>
        <store_response>
            <required>no</required>
        </store_response>
    </comment>
</Comments>

<Comments>
    <comment>
        <comment_ID>101</comment_ID>
        <customer_info>
            <fname>Cynthia</fname>
            <lname>Thomas</lname>
   	        <email>CThomas@hotmail.com</email>
        </customer_info>
        <feedback>
            <type>question</type>
            <content>What countries are major tea consumers?</content>
        </feedback>
        <store_rating>
            <score>4</score>
            <out_of>5</out_of>
        </store_rating>
        <store_response>
            <required>yes</required>
            <completed>yes</completed>
            <action>Please see our "All About Tea" page at www.aroma.com/tea</action>
        </store_response>
    </comment>
</Comments>

		...

Chú ý: Kết quả được định dạng lại giúp bạn dễ đọc hơn. Trình soạn thảo lệnh DB2 hiển thị mỗi ý kiến góp ý trên một dòng.

bulb Mách nước: Để giải phóng bộ nhớ cho trình soạn thảo lệnh, nhấp chuột phải vào trong vùng kết quả và chọn Clear Results (Xoá các kết quả).

Về các truy vấn

Để thực hiện một XQuery trực tiếp trên DB2 9, bạn phải bắt đầu truy vấn với từ khóa xquery. Từ khóa này chỉ dẫn cho DB2 triệu gọi bộ phân tách XQuery của nó để xử lý yêu cầu của bạn.

Chú ý: Bạn chỉ cần làm việc này nếu bạn đang sử dụng XQuery như một ngôn ngữ bên ngoài nhất (hay ở mức trên nhất). Nếu bạn nhúng các biểu thức XQuery vào trong SQL, bạn không cần mở đầu chúng bằng từ khóa xquery.

Khi chạy như một ngôn ngữ mức trên nhất, XQuery cần có một nguồn dữ liệu vào. Một cách để một XQuery có thể nhận được dữ liệu vào là gọi một hàm có tên là db2-fn:xmlcolumn có một tham số xác định tên bảng và tên cột của một cột XML trong một bảng DB2.

Hàm db2-fn:xmlcolumn trả về chuỗi các tài liệu XML được lưu giữ trong cột đã cho. Các ví dụ truy vấn trả về một chuỗi các tài liệu XML có chứa thông tin ý kiến góp ý của khách hàng.

Chú ý: Cả hai tên cột Comments và tên bảng aroma.sales được chỉ rõ ở đây bằng chữ hoa. Đó là do chúng được sửa thành dạng chữ hoa trước khi được viết vào tài liệu danh mục bên trong DB2. Vì XQuery phân biệt dạng chữ, nên các tên bảng và các tên cột chữ thường không khớp với các tên chữ hoa trong tài liệu DB2.


Lấy ra các phần tử XML cụ thể

Câu hỏi

Các ý kiến góp ý của khách hàng được lưu trong cơ sở dữ liệu Aroma là gì? Chỉ hiển thị nội dung của các ý kiến đóng góp.

Ví dụ truy vấn FLWOR

xquery for
                    $y in db2-fn:xmlcolumn('AROMA.SALES.COMMENTS')/Comments/comment/feedback/content
return $y

Ví dụ truy vấn đường dẫn

xquery
db2-fn:xmlcolumn('AROMA.SALES.COMMENTS')/Comments/comment/feedback/content

Hai truy vấn , có cùng kết quả

<content>The employee named Heather Gray was very helpful.</content>
<content>What countries are major teas consumers?</content>
<content>Demitasse Ms was highly enjoyable!</content>
<content>Xalapa Lapa was great!</content>
<content>Aroma should consider selling Jamaican Butter Rum.</content>
<content>Darjeeling Special was not enjoyable at all.</content>
<content>Special Tips is my favorite.</content>
...

Về các truy vấn

Hai truy vấn, mặc dù đưa ra kết quả như nhau, nhưng được thực hiện hơi khác nhau một chút.

Đối với truy vấn FLWOR, dòng thứ hai chỉ dẫn cho DB2 để duyệt qua các phần tử con nội dung của các phần tử <Comments> có trong cột aroma.sales.comments. Mỗi phần tử nội dung được lần lượt gán cho biến $y. Dòng thứ ba cho biết giá trị $y được trả về trong mỗi lần lặp. Kết quả là một chuỗi các phần tử XML.

Đối với truy vấn đường dẫn, bước đầu tiên gọi hàm db2-fn:xmlcolumn để nhận được một danh sách các tài liệu XML từ cột Comments của bảng aroma.sales. Bước thứ hai trả về tất cả các phần tử<Comments> trong các tài liệu này, bước thứ ba trả về các phần tử <comment> > nằm trong các phần tử <Comments> này, bước thứ tư trả về các phần tử <feedback> nằm trong các phần tử <comment> và bước thứ năm trả về các phần tử <content> nằm trong các phần tử <feedback> .


Hàm text()

Câu hỏi

Các ý kiến góp ý của khách hàng được lưu trong cơ sở dữ liệu Aroma là gì? Hiển thị nội dung của các ý kiến góp ý dưới dạng văn bản.

Ví dụ truy vấn FLWOR

xquery for 
                    $y in db2-fn:xmlcolumn('AROMA.SALES.COMMENTS')/Comments/comment/feedback/content
return $y/text()

Ví dụ truy vấn đường dẫn

xquery
db2-fn:xmlcolumn('AROMA.SALES.COMMENTS')/Comments/comment/feedback/content/text()

Hai truy vấn , có cùng kết quả

The employee named Heather Gray was very helpful.
What countries are major teas consumers?
Demitasse Ms was highly enjoyable!
Xalapa Lapa was great!
Aroma should consider selling Jamaican Butter Rum.
Darjeeling Special was not enjoyable at all.
Special Tips is my favorite.
...

Về các truy vấn

Các truy vấn triệu gọi hàm text() để trả về trình bày dạng văn bản của các giá trị phần tử XML.


Lọc các giá trị phần tử XML

Câu hỏi

Các gợi ý nào của khách hàng được lưu trong cơ sở dữ liệu Aroma? Hiển thị chúng dưới dạng văn bản.

Ví dụ truy vấn FLWOR

xquery for
                    $y in db2-fn:xmlcolumn('AROMA.SALES.COMMENTS')/Comments/comment/feedback
where $y/type = "suggestion"
return $y/content/text()

Ví dụ truy vấn đường dẫn

xquery
db2-fn:xmlcolumn('AROMA.SALES.COMMENTS')/Comments/comment/feedback[type = 
"suggestion"]/content/text()

Hai truy vấn , có cùng kết quả

Aroma should consider selling Jamaican Butter Rum.
Aroma should consider selling Gyokuro Asahi Pearl Dew.
Aroma should consider selling Orange Pekoe.
Aroma should consider selling Vanilla Creme.
Aroma should consider selling China Yunnan.
Aroma should consider selling Kona Fancy 100%.
Aroma should consider selling Blackcurrant.
Aroma should consider selling Sencha.
...

Về các truy vấn

Mệnh đề where của XQuery cũng tương tự như mệnh đề WHERE của SQL. Trong truy vấn FLWOR, nó lọc các kết quả dựa vào giá trị của phần tử type (kiểu góp ý) trong các tài liệu XML.

Mệnh đề for gắn biến $y lần lượt với mỗi phản hồi. Mệnh đề where có chứa một biểu thức đường dẫn nhỏ để dẫn hướng từ mỗi phản hồi đến phần tử type nằm trong nó. Mệnh đề where là đúng (và nội dung được trả về) chỉ khi giá trị của phần tử type này bằng với "suggestion".

Một thuộc tính bổ sung, [type = "suggestion"], được dùng để tạo ra truy vấn đường dẫn tương ứng.

Câu hỏi

Các gợi ý và các câu hỏi nào của khách hàng được lưu trong cơ sở dữ liệu Aroma? Hiển thị chúng như văn bản.

Ví dụ truy vấn FLWOR

xquery for 
                    $y in db2-fn:xmlcolumn('AROMA.SALES.COMMENTS')/Comments/comment/feedback
where $y/type = "suggestion" or $y/type = "question"
return $y/content/text()

Ví dụ truy vấn đường dẫn

xquery
db2-fn:xmlcolumn('AROMA.SALES.COMMENTS')/Comments/comment/feedback[type = 
"suggestion"
or type = "question"]/content/text()

Hai truy vấn, có cùng kết quả

What countries are major tea consumers?
Aroma should consider selling Jamaican Butter Rum.
Aroma should consider selling Gyokuro Asahi Pearl Dew.
Who do you buy your tea from?
What is the maximum amount of coffee one person can safely consume per day?
Aroma should consider selling Orange Pekoe.
Aroma should consider selling Vanilla Creme.
...

Về các truy vấn

Giống như với SQL, các điều kiện tìm kiếm có thể được sử dụng để trau chuốt việc chọn lọc các phần tử XML. Xem lại Phần 3, sử dụng các liên từ AND, NOT, và OR để tạo ra các điều kiện phức tạp, nơi thảo luận chi tiết các điều kiện tìm kiếm và các toán tử lôgic.


Biến đổi đầu ra XML

Câu hỏi

Các câu trả lời của cửa hàng nào còn chưa xong? Hiển thị văn bản về các hành động như một danh sách HTML.

Ví dụ truy vấn

xquery
<ul> {
for $y in db2-fn:xmlcolumn('AROMA.SALES.COMMENTS')/Comments/comment/store_response
where $y/completed = "no"
return <li>{$y/action/text()}</li>
} </ul>

Kết quả

<ul>
<li>Thank you for your excellent suggestion! Aroma Coffee and Tea Company is actually 
planning on ordering the product you've suggested--check our stores next month!</li>
<li>Please see our "All About Tea" page at www.aroma.com/tea</li>
<li>The Aroma Coffee and Tea Company supports local growers in North America as well
as imports. Our mission is to offer the best-quality coffee and tea products from North
America as well as around the world. All of our suppliers must meet all of our quality
control standards.</li>
<li>Thank you for your excellent suggestion! Currently, Aroma Coffee and Tea Company
does not plan to include the product you've suggested in our purchase plans. We will
keep your suggestion on file and we will consider it in the future.</li>
<li>Thank you for your excellent suggestion--we completely agree! Please visit
www.aroma.com.</li>
<li>Please see our "All About Coffee" page at www.aroma.com/coffee</li>
<li>Please see our "All About Tea" page at www.aroma.com/tea</li>
...
</ul>

Chú ý: Kết quả được định dạng lại giúp bạn dễ đọc hơn. Trình soạn thảo DB2 hiển thị toàn bộ danh sách trên một dòng.

Về truy vấn

Một mặt rất mạnh của XQuery là khả năng biến đổi đầu ra XML từ một dạng XML này sang dạng khác. Ví dụ bạn có thể sử dụng XQuery để lấy ra tất cả hay một phần tài liệu XML đã lưu và biến đổi đầu ra thành HTML để dễ dàng hiển thị trong một trình duyệt Web. Ví dụ truy vấn lấy ra và biến đổi các câu trả lời của cửa hàng thành các phần tử XML là một phần của danh sách HTML không sắp xếp thứ tự.

Dòng thứ hai của truy vấn làm cho một thẻ đánh dấu HTML của danh sách không sắp xếp thứ tự (<ul>) được đưa vào tập kết quả. Nó cũng đưa vào một dấu móc, dấu đầu tiên trong hai cặp dấu móc được dùng trong truy vấn này. Các dấu móc chỉ dẫn cho DB2 đánh giá và xử lý biểu thức bên trong chứ không coi nó như một giá trị cuối kiểu xâu ký tự.

Dòng thứ ba duyệt qua toàn bộ các trả lời của cửa hàng, gán cho biến $y lần lượt mỗi phần tử store_response. Mệnh đề return chỉ rõ rằng, trước khi trả về, cần bao quanh mỗi phần tử store_response một thẻ đánh dấu mục danh sách HTML. Dòng cuối cùng kết thúc truy vấn và viết nốt thẻ đánh dấu danh sách HTML không sắp xếp thứ tự.


Biểu thức if-then-else

Câu hỏi

Các câu trả lời nào của cửa hàng còn chưa xong? Hiển thị mã nhận diện (comment ID), thông tin về khách hàng, và hành động của cửa hàng như các phần tử XML, là con của các phần tử <suggestion><question>, tương ứng.

Ví dụ truy vấn

xquery for 
                    $y in db2-fn:xmlcolumn('AROMA.SALES.COMMENTS')/Comments/comment
where $y/store_response/completed = "no"
return
	(
    if ($y/feedback/type = 'suggestion')
        then
            <suggestion>
            {$y/comment_ID,
             $y/customer_info,
             $y/store_response/action}
            </suggestion>
        else
            <question>
            {$y/comment_ID,
             $y/customer_info,
             $y/store_response/action}
            </question>
)

Kết quả

<suggestion>
    <comment_ID>4201</comment_ID>
    <customer_info>
        <fname>Karen</fname>
        <lname>Richardson</lname>
        <phone>3546388558</phone>
        <email>K.Richardson@hotmail.com</email>
    </customer_info>
    <action>Thank you for your excellent suggestion! Aroma Coffee and Tea Company
        is actually planning on ordering the product you've suggested--check our stores
        next month!</action>
</suggestion>

<question>
    <comment_ID>9601</comment_ID>
    <customer_info>
        <fname>Thomas</fname>
        <lname>Nelson</lname>
        <phone>0055238541</phone>
    </customer_info>
    <action>Please see our "All About Tea" page at www.aroma.com/tea</action>
</question>

<question>
    <comment_ID>15503</comment_ID>
    <customer_info>
        <fname>Joseph</fname>
        <lname>Sanders</lname>
        <phone>6717072487</phone>
        <email>J.Sanders@gmail.com</email>
    </customer_info>
    <action>The Aroma Coffee and Tea Company supports local growers in North
    America as well as imports. Our mission is to offer the best-quality coffee 
    and tea products from North America as well as around the world. All of our 
    suppliers must meet all of our quality-control standards.</action>
</question>

...

Chú ý: Kết quả được định dạng lại giúp cho bạn dễ đọc hơn. Trình soạn thảo DB2 hiển thị từng kết quả trên một dòng.

Về truy vấn

Khả năng của XQuery làm biến đổi đầu ra XML có thể được kết hợp với các hỗ trợ cho điều kiện lôgic gắn kèm bên trong nó để làm giảm sự phức tạp của mã lệnh của ứng dụng. Truy vấn tạo các phần tử XML phức tạp có chứa thông tin về comment ID, thông tin về ý kiến đóng góp của khách hàng, và hành động của cửa hàng, dưới các phần tử gốc <suggestion><question>.

Kết quả có thể có ích cho những người sẽ thực thi hành động của cửa hàng vì đã có đủ thông tin cần để làm công việc này.

mũi tên Chú ý quan trọng: Phần tử <comment_ID> phải được viết chính xác bằng chữ hoa như đã chỉ ra, do XQuery phân biệt dạng chữ, nếu không XQuery sẽ không nhận ra nó.


Mệnh đề Order By

Câu hỏi

Các ý kiến nào của khách hàng được lưu trong cơ sở dữ liệu Aroma? Sắp xếp thứ tự chúng theo đánh giá xếp hạng cửa hàng từ thấp nhất đến cao nhất.

Ví dụ truy vấn

xquery for 
                    $y in db2-fn:xmlcolumn('AROMA.SALES.COMMENTS')/Comments/comment
where $y/feedback/type = "opinion"
order by $y/store_rating/score
return
    <comment>
        <rating>{$y/store_rating/score/text()}</rating>
        <opinion>{$y/feedback/content/text()}</opinion>
    </comment>

Kết quả

<comment>
    <rating>2</rating>
    <opinion>Darjeeling Special was not enjoyable at all.</opinion>
</comment>

...

<comment>
    <rating>3</rating>
    <opinion>Good store, but quality of customer service could be better.</opinion>
</comment>

...

<comment>
    <rating>4</rating>
    <opinion>The employee named Heather Gray was very helpful.</opinion>
</comment>

...

Chú ý: Kết quả được định dạng giúp cho bạn dễ đọc hơn. Trình soạn thảo DB2 hiển thị từng kết quả trên một dòng.

Về truy vấn

Mệnh đề order by chỉ rõ các kết quả phải được trả về theo thứ tự tăng dần (thứ tự mặc định) của đánh giá xếp hạng cửa hàng.


Mệnh đề Let

Câu hỏi

Có bao nhiêu ý kiến của khách hàng được lưu trong cột Comments? Có bao nhiêu các gợi ý? Có bao nhiêu các câu hỏi?

Ví dụ truy vấn

xquery for $t in distinct-values
(db2-fn:xmlcolumn('AROMA.SALES.COMMENTS')/Comments/comment/feedback/type)
let $tc := db2-fn:xmlcolumn('AROMA.SALES.COMMENTS')/Comments/comment[feedback/type = $t]
return
    <comments>
        <type>{$t}</type>
        <count>{count($tc)}</count>
    </comments>

Kết quả

<comments>
    <type>opinion</type>
    <count>1220</count>
</comments>
<comments>
    <type>question</type>
    <count>364</count>
</comments>
<comments>
    <type>suggestion</type>
    <count>251</count>
</comments>

Chú ý: Kết quả được định dạng giúp cho bạn dễ đọc hơn. Trình soạn thảo DB2 hiển thị từng kết quả trên một dòng.

Về truy vấn

Truy vấn đếm có bao nhiêu ý kiến đóng góp được lưu theo từng loại.

Mệnh đề let được dùng để gán một giá trị (có thể chứa một danh sách của một vài mục) cho một biến có thể được dùng trong các mệnh đề khác của biểu thức FLWOR.

Hàm distinct-values (các giá trị phân biệt) trong mệnh đề for trả về một danh sách tất cả các giá trị type khác nhau, được tìm thấy bên trong <comments> trên cột Comments. Có ba loại (type) ý kiến phân biệt: ý kiến góp ý, gợi ý và câu hỏi. Mệnh đề for gán cho biến $t lần lượt mỗi một trong số các giá trị type này. Đối với mỗi giá trị $t, mệnh đề let quét cột Comments lại lần nữa và gán cho biến $tc một danh sách có chứa tất cả các ý kiến góp ý có loại khớp với loại trong $t. Mệnh đề return xây dựng một phần tử <comments> cho từng giá trị loại riêng. Mỗi phần tử trong các phần tử <comments> có chứa hai phần tử con: một phần tử <type> chứa giá trị loại nào và một phần tử <count> chứa số đếm có bao nhiêu ý kiến góp ý thuộc loại đó.

Hàm đếm là một trong số nhiều hàm gắn liền do XQuery cung cấp. Trong phần tiếp theo có nhiều ví dụ hơn nữa về các hàm gắn liền.


Các hàm gắn liền

Câu hỏi

Trung bình mức xếp hạng cửa hàng tính theo tất cả các ý kiến góp ý là gì?

Ví dụ truy vấn

xquery
avg(db2-fn:xmlcolumn('AROMA.SALES.COMMENTS')/Comments/comment/store_rating/score)

Kết quả

4.11389645776567

Về truy vấn

Hàm db2-fn:xmlcolumn trả về tất cả các điểm số đã lưu trong cột Comments như một chuỗi và hàm avg tính toán giá trị trung bình của chúng.

Bảng này mô tả một số hàm XQuery hay sử dụng trong kinh doanh:

HàmMô tả
sum(sequence-expression)Tính toán tổng của tất cả các giá trị trong chuỗi.
avg(sequence-expression)Tính toán trung bình của tất cả các giá trị trong chuỗi.
max(sequence-expression)Xác định giá trị cực đại trong chuỗi.
min(sequence-expression)Xác định giá trị cực tiểu trong chuỗi.
count(sequence-expression)Đếm số lượng các giá trị khác không trong chuỗi.

Các truy vấn XQuery có nhúng SQL

Câu hỏi

Các ý kiến góp ý nào đã được gửi lại tại các cửa hàng ở New York? Hiển thị nội dung dưới dạng văn bản.

Ví dụ truy vấn

xquery for $y in
db2-fn:sqlquery(
    'SELECT Comments
     FROM aroma.sales a, aroma.store b
     WHERE city = ''New York''
         AND a.storekey = b.storekey')/Comments/comment/feedback/content/text()
return $y

Kết quả

Does drinking too much tea cause any health problems?
How to differentiate from imitations?
Is there a maximum amount of tea one person can safely consume per day?
Aroma should consider selling Indonesian House Roast.
Darjeeling Special was very good.
Irish Breakfast was great!
...

Về truy vấn

Truy vấn này nhúng SQL bên trong XQuery để hạn chế các kết quả dựa vào các giá trị dữ liệu SQL. Thay cho hàm db2-fn:xmlcolumn trả về tất cả dữ liệu XML trong một cột của một bảng, nó gọi hàm db2-fn:sqlquery để thực hiện một truy vấn SQL và chỉ gửi về dữ liệu đã chọn. Truy vấn SQL chuyển đến db2-fn:sqlquery phải trả về dữ liệu XML. Sau đó dữ liệu XML này có thể được Xquery xử lý tiếp.

Phần SQL của truy vấn kết nối bảng Sales với bảng Store . Phần này lấy ra các hàng trong bảng Sales với storekey giống như của một cửa hàng ở New York. Các tài liệu Comments lưu trong các hàng này được dùng làm các đầu vào cho một biểu thức đường dẫn để trả về tất cả các phần tử nội dung nằm lồng bên trong như một văn bản.

mũi tên Chú ý quan trọng: Mệnh đề WHERE của truy vấn SQL so sánh giá trị city với xâu "New York.". Trong SQL, các xâu ký tự như vậy được đặt trong một dấu nháy kép. Chú ý rằng mặc dù ở ví dụ này nhìn giống như dùng dấu nháy kép, nhưng thật sự nó sử dụng hai dấu nháy đơn ở trước và sau giá trị so sánh (''New York''). Một dấu nháy đơn "thừa" là các ký tự “thoát”. Nếu bạn sử dụng dấu nháy kép bao quanh xâu ký tự trong thuộc tính truy vấn dựa trên xâu ký tự chứ không phải là hai dấu nháy đơn thì sẽ mắc phải một lỗi cú pháp.


Tóm tắt

Tóm tắt

Hướng dẫn này đã cung cấp cho người sử dụng một tổng quan cơ bản về XML và XQuery. Phần này đề cập đến các câu hỏi sau đây: XML là gì? Nó có lợi thế gì? Khi nào nên sử dụng nó?

Sau đó hướng dẫn này đã chỉ cho người đọc biết cách đưa ra các truy vấn XQuery cơ bản để lấy ra các phần tử XML, lọc dữ liệu, biến đổi dữ liệu, định dạng dữ liệu, và làm việc với dữ liệu.

XQuery và SQL không loại trừ lẫn nhau; chúng có thể được kết hợp để đưa ra các truy vấn mạnh mẽ hơn.

Hướng dẫn này chỉ có ý định giới thiệu cơ bản về XML và XQuery. Để tìm hiểu nhiều hơn về các câu hỏi XQuery, nên tìm kiếm nó trong DB2 Information Center hoặc xem các đường liên kết tìm hiểu khác trong phần Tài nguyên.

Hướng dẫn này là phần cuối cùng của loạt bài này. Một lần nữa cảm ơn bạn đã chọn IBM DB2 9 để tìm hiểu về các máy chủ dữ liệu lai dùng cho dữ liệu của cả hai, cấu trúc quan hệ lẫn cấu trúc pureXML.


Tải về

Mô tảTênKích thước
Cơ sở dữ liệu AromaAroma_Data.zip1MB

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

  • Hiện nay bạn có thể sử dụng DB2 miễn phí. Tải xuống DB2 Express-C, một phiên bản DB2 Express miễn phí dành cho cộng đồng nhưng vẫn có đủ các đặc tính dữ liệu cốt lõi giống như phiên bản DB2 Express và cung cấp một cơ sở vững chắc để xây dựng và triển khai các ứng dụng.

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Information Management, SOA và dịch vụ Web
ArticleID=972853
ArticleTitle=Hướng dẫn SQL & XQuery cho IBM DB2, Phần 7: Giới thiệu về XML và XQuery
publish-date=05202009